Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3130 / 732 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 9:

Указатели и массивы в языке С

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Задание 1

  1. Вывод заданных строк осуществите на экран дисплея в одной строке.
  2. Вывод результата выполните на основе разыменования массива указателей.
  3. Инициализируйте массив указателей своей фамилией, именем, номером группы, специальности, факультета и номером компьютера, за которым выполняется лабораторная работа.
  4. В программу введите дополнительный массив указателей, с помощью которого выполните вывод заданных строк.
  5. В программе вместо оператора цикла for применить оператор while.

Пример 2. Напишите программу сортировки одномерного массива, состоящего из 10 равномерно распределенных случайных чисел из интервала [–8; 8], с помощью указателей.

Программный код решения примера:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define N 10

int main (void)
  {
	double a = -8.0, b = 8.0;
	double arr[N], *pmin[N], *temp;
	int i, j;
	long int T;

T = (long)time(NULL); // использование системного времени
srand((unsigned int) T);                        
	
// Заполнение массива случайными числами
	for(i = 0; i < N; ++i)
		arr[i] = a + (b - a)*(double)rand()/RAND_MAX;

printf("\n\t The initial array of [%1.4f, %1.4f]:\n", a, b);
	for (i = 0; i < N; ++i)
		printf("\n\t%2d)  %8.4f", i+1, arr[i]);
	
// Взятие адресов элементов исходного массива
//в предположении, что они образуют отсортированный массив
	for (i = 0; i < N; ++i)
		pmin[i] = &arr[i];

//Сортировка массива по убыванию
for (i = 0; i < N-1; ++i)
   for (j = i+1; j < N; ++j) {
      if (*pmin[i] < *pmin[j])
    {
temp = pmin[i];
pmin[i] = pmin[j]; 
pmin[j] = temp;
    }
}

//Вывод отсортированного массива по убыванию
printf("\n\n\t Assorted array of descending:\n");
for (i = 0; i < N; ++i)
printf("\n\t%2d)  %8.4f", i+1, *pmin[i]);

	printf("\n\n Press any key: ");
	_getch();
	return 0;
  }

В программе следует обратить внимание на то, что при сортировке производятся операции с адресами элементов массива, т.е. с указателями, а в самом исходном массиве элементы не сортируются.

Возможный результат выполнения программы показан на рис. 8.2.

Сортировка массива по убыванию

Рис. 8.2. Сортировка массива по убыванию

Задание 2

  1. Выполните вывод отсортированного массива и исходного массива в два параллельных столбца.
  2. Напишите программу сортировки массива по возрастанию. Границы интервала равномерно распределенных случайных чисел: [–8; 2*X], где Х – номер компьютера, за которым выполняется лабораторная работа.
  3. Сгенерировать массив целых чисел размера N из интервала кодов строчных букв латинского алфавита, где N – число букв вашей фамилии. Из сформированного массива выведите коды полученных букв и сами буквы. Отсортируйте полученные буквы по возрастанию кодов составляющих букв с помощью указателей.

Пример 3. Напишите программу заполнения матрицы по спирали натуральными числами с помощью массива указателей.

Программный код решения примера:

#include <stdio.h>
#include <conio.h>

#define n 15

int main(void) {
int i = 1, 
I, j, k, 
p = n/2;
	int M[n][n], *ptr[n*n];

// Обнуление матрицы и инициализация указателя
for (I = 0; I < n; ++I)
for (j = 0; j < n; ++j)
{ M[I][j] = 0; ptr[I*n + j] = &M[I][j];}

for (k = 1; k <= p; k++)  // Число спиралей
{
// Верхний горизонтальный столбец
for (j = (k-1); j < (n-k+1); j++)
*ptr[(k-1)*n + j] = i++;

// Правый верхний столбец
for (j = k; j < (n-k+1); j++) 
*ptr[j*n + (n-k)] = i++;

// Нижний горизонтальный столбец
for (j = (n-k-1); j >= (k-1); --j) 
*ptr[(n-k)*n + j] = i++;

// Левый верхний столбец
for (j = (n-k-1); j >= k; j--) 
*ptr[j*n + (k-1)] = i++; }
if ( n % 2 ) *ptr[p*n + p] = n*n;
printf("\n\t Spiral matrix of dimention (%d x %d):\n\n",n,n);

for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
{	if (n*n < 20*20){
	printf("%4d", *ptr[i*n + j]);
	if (j == (n-1)) printf("\n");}
	
else if (n*n >= 20*20)
		goto mes;
}

mes: if (n > 19)
printf("\n\t It is a large matrix. Can not to see on display.\n");

    printf("\n Press any key: ");
    _getch();
    return 0; 
}

Результат выполнения программы показан на рис. 8.3.

Заполнение матрицы по спирали

Рис. 8.3. Заполнение матрицы по спирали

В программе использован оператор безусловного перехода goto, чтобы выйти из вложенных циклов, когда размерность матрицы велика и не может быть размещена на экране дисплея.

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов