Указатели и массивы в языке С
Задание 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, чтобы выйти из вложенных циклов, когда размерность матрицы велика и не может быть размещена на экране дисплея.

