Указатели и массивы в языке С
Задание 1
- Вывод заданных строк осуществите на экран дисплея в одной строке.
- Вывод результата выполните на основе разыменования массива указателей.
- Инициализируйте массив указателей своей фамилией, именем, номером группы, специальности, факультета и номером компьютера, за которым выполняется лабораторная работа.
- В программу введите дополнительный массив указателей, с помощью которого выполните вывод заданных строк.
- В программе вместо оператора цикла 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.
Задание 2
- Выполните вывод отсортированного массива и исходного массива в два параллельных столбца.
- Напишите программу сортировки массива по возрастанию. Границы интервала равномерно распределенных случайных чисел: [–8; 2*X], где Х – номер компьютера, за которым выполняется лабораторная работа.
- Сгенерировать массив целых чисел размера 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.
В программе использован оператор безусловного перехода goto, чтобы выйти из вложенных циклов, когда размерность матрицы велика и не может быть размещена на экране дисплея.