Хелпикс

Главная

Контакты

Случайная статья





Практическая часть



Практическая часть

Пример 1. Напишите программу заполнения одномерного массива случайными числами из интервала от 1 до 15 по случайному равномерному закону. Отсортировать массив случайных чисел по возрастанию.

Для решения поставленной задачи применим сортировку методом прямого выбора. Алгоритм сортировки заключается в следующем:

  1. В исходной последовательности из N элементов отыскивается элемент с наименьшим ключом (значением).
  2. Он меняется местами с первым элементом.
  3. В оставшейся последовательности из ( N –1) элементов отыскивается минимальный элемент и меняется местами со вторым элементом и т.д., пока не останется один, самый большой элемент.

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

#include <stdio.h>#include <conio.h>#include <time.h>#include <stdlib.h>#define Left 1 // константа Left со значением 1#define Right 15 // константа Right со значением 15#define N 10 // константа N со значением 10 int main (void) {float R, r, min;float A[N];// объявляем массив, состоящий из 15-ти значений       //вещественного типаint i, j, k; unsigned int some;long int L; L = (long) time(NULL); // Системное времяsome = (unsigned) L; // Приведение типовsrand(some); // Задание исходного случайного числа для rand()printf("\n\t The initial array of random numbers in the interval [%d, %2d]\n", Left, Right); for (i = 0; i < N; ++i){// Случайное число из интервала [0,1]r = (float) rand()/RAND_MAX;// Формирование случайного числа из заданного интервалаR = Left + (Right - Left) * r;// Заполнение массива случайными числамиA[i] = R; } // Печать элементов исходного массиваfor (i = 0; i < N; ++i)printf("\n\t %5d) %10.4f", i + 1, A[i]); // Сортировка методом выбораfor (i = 0; i < (N - 1); ++i) { min = A[i]; k = i;for (j = i + 1; j < N; ++j)if (A[j] < min) { k = j; min = A[k]; }A[k] = A[i]; A[i] = min;} // Печать отсортированного массива по возрастаниюprintf("\n\n\t Sort an array:\n");for (i = 0; i < N; ++i)printf("\n\t %5d) %10.4f", i + 1, A[i]);    printf("\n\n Press any key: ");   _getch();   return 0;}

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

Рис. 8.1. Сортировка одномерного массива по возрастанию

В программе использованы директивы препроцессора для задания левой границы ( #define Left 1 ), правой границы ( #define Right 15 ) и размера одномерного массива ( #define N 10 ). Включены дополнительные библиотеки time.h – для обращения к функциям системного времени, stdlib.h – для обращения к функциям генерации псевдослучайных чисел.

Пример 2. Напишите программу поиска максимального элемента в заданном одномерном массиве. Элементы массива являются целыми числами. Программный код решения примера:

#include <stdio.h>#include <conio.h> int main (void){   int i, size, max;   int A[ ] = {3, 5, 2, 8, 12, 0, -7, -3, -21};size = sizeof(A)/sizeof(A[0]);printf("\n\t The dimention of the array A is equal to: %d\n", size); max = A[0]; // Предполагаемый максимум   for (i = 0; i < size; ++i)          if (A[i] > max) max = A[i]; printf("\n\t Maximum array element: %d\n", max);    printf("\n\n Press any key: ");   _getch();   return 0; }

В программе использована инициализация безразмерного массива и определения его размерности с помощью функции sizeof().

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

Рис. 8.2. Определение максимального элемента массива

Пример 3. Напишите программу циклической перестановки чисел заданного массива так, чтобы i -e число стало ( i +1)-м, а последнее число – первым. Выведите на дисплей исходный массив и преобразованный.

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

#include <stdio.h>#include <conio.h> int main (void) {   int i, j, k;   double D[ ] = {1.23, 2.34, 3.45, 4.56, 5.67, 6.78}; k = sizeof(D)/sizeof(D[0]);/*определяем количество элементов в исходном массиве*/printf("\n\t The original array:\n");for (i = 0; i < k; ++i)printf("%8.2f", D[i]); double end=D[k-1];// запоминаем последний  элемент массива;// сдвигаем все элементы массива на одну позицию слева направоfor (i = k-2; i >=0; --i)D[i+1] = D[i];D[0]=end;//записываем на первую позицию массива последний элемент printf("\n\n\t The reconfigured array:\n");for (i = 0; i < k; i++)printf("%8.2f", D[i]);    printf("\n\n Press any key: ");   _getch();   return 0; }

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

Рис. 8.3. Пример циклической перестановки элементов числового массива

Пример 4. В данном одномерном массиве вещественных чисел поменяйте местами элементы, стоящие на нечетных местах, с элементами, стоящими на четных местах. Предусмотрите четность и нечетность размерности массива.

Для определения четности места в заданном массиве можно использовать операцию деления по модулю, т.е. %.

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

#include <stdio.h>#include <conio.h>// Размер массива#define n 7 int main (void) { int i;// Пример массиваfloat A[n] = {1.23F, 2.34F, 3.45F, 4.56F, 5.67F, 6.78F, 7.89F},m; // Распечатка заданного массиваprintf("\n\t\t The original array of dimention n = %d:\n", n);   printf("\t");   for (i = 0; i < n; ++i)          printf("%6.2f", A[i]); // Распечатка преобразованного массива   printf("\n\n\t\t The reconfigured array:\n");   for (i = 0; i < n&&i+1!=n; i+=2)    {    m=A[i], A[i]=A[i+1],A[i+1]=m;      }    printf("\t");   for (i = 0; i < n; ++i)          printf("%6.2f", A[i]);    printf("\n\n Press any key: ");   _getch();   return 0; }

 

При инициализации массива каждый его элемент снабжен суффиксом F.

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

Рис. 8.4. Смена четных и нечетных мест чисел массива

Пример 5. Напишите программу заполнения квадратной матрицы (заданного размера n > 2) по спирали натуральными числами начиная с левого верхнего угла (принимая его за номер 1) и двигаясь по часовой стрелке.

Образец заполнения:

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

#include <stdio.h>#include <conio.h>#define n 13 int main(void) {   int i = 1, j, k;   int p = n/2;   int A[n][n];    // Обнуление матрицы   for (j = 0; j < n; ++j)          for (k = 0; k < n; ++k)                  A[j][k] = 0; printf("\n\t Spiral matrix of dimention (%d x %d):\n", n, n);    for (k = 1; k <= p; k++) // Число спиралей   {          // Верхний горизонтальный столбец          for (j = k-1; j < n-k+1; j++)                  A[(k-1)][j] = i++;           // Правый верхний столбец          for (j = k; j < n-k+1; j++)                   A[j][n-k] = i++;           // Нижний горизонтальный столбец          for (j = n-k-1; j >= k-1; --j)                   A[n-k][j] = i++;           // Левый верхний столбец          for (j = n-k-1; j >= k; j--)                   A[j][(k-1)] = i++;   }   if ( n % 2 )           A[p][p] = n*n;    // Распечатка матрицы   for (i = 0; i < n; ++i)          for (j = 0; j < n; ++j)          {                  printf("%5d", A[i][j]);                  if (j == (n-1))                          printf("\n");          }                printf("\n Press any key: ");          _getch();          return 0;}

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

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

Пример 6. Каждый день производятся замеры некоторых величин (вещественных значений), причем значения этих величин сводятся в прямоугольную таблицу размера n×m. Составьте многомерный массив данных за 30 дней. Формирование данных произвести по случайному равномерному закону из интервала от –12 до 21.

Этот пример относится к определению трехмерного массива данных. Программный код решения примера:

#include <stdio.h>#include <conio.h>#include <time.h>#include <stdlib.h> #define n 6#define m 7#define N 30 const int Left = -12; // Левая границаconst int Right = 21; // Правая граница int main (void) {   float R, r;   float A[N][n][m];    int i, j, k;    // Инициализация генератора случайных чисел   srand((unsigned) time(NULL));    printf("\n\t The values of every 10 days from 30 days:");    // Формирование данных за 30 дней   for (k = 0; k < N; ++k)          for (i = 0; i < n; ++i)                  for (j = 0; j < m; ++j)                  {  r = (float) rand()/RAND_MAX;   R = Left + (Right - Left)*r;   A[k][i][j] = R;   }    // Печать данных за каждый 10-й день   for (k = 0; k < N; k += 10) { printf("\n");   for (i = 0; i < n; ++i) { printf("\n");   for (j = 0; j < m; ++j)          printf("%10.4f", A[k][i][j]);   }   }    printf("\n Press any key: ");   _getch();   return 0; }

В программе используется трехмерный массив размера 30×6×7. Это означает, что прямоугольная таблица (массив) данных размера 6×7 как бы скрепляется 30 раз – по заданному числу дней. Границы случайных чисел определены с помощью спецификатора const.

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

Рис. 8.6. Вывод данных за каждый 10-й день

Пример 7. Напишите программу по перемножению двух матриц А и В с размерностями ( m×r ) и ( r×n ) соответственно. Матрицу А примите размером 4×5, матрицу В – размером 5×3 (обе целочисленные).

Условием перемножения двух матриц А и В является равенство числа столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет размер m×r, то вторая матрица В должна иметь размер r×n. В результате перемножения получим матрицу С размера m×n. Приведем следующую схему по размерностям:

 

Поэлементное перемножение двух матриц в стандартной математической форме имеет следующий вид:

C учетом синтаксиса формирования массивов в языке С индексация должна начинаться с нуля, поэтому формулу перепишем в следующем виде:

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

#include <stdio.h>#include <conio.h> #define m 4#define r 5#define n 3 int main (void) {   int i, j, k; // переменные циклов      const int A[m][r] = {{1,2,3,4,5},   {2,3,4,5,6},   {2,2,2,2,2},   {3,3,3,3,3}};      const int B[r][n] = {{9,8,7},   {1,2,3},   {4,5,6},   {7,8,9},   {1,1,1}};    // Массив под результат произведения двух матриц   int C[m][n];    // Обнуление результирующей матрицы   for (i = 0; i < m; i++)          for (j = 0; j < n; j++)                  C[i][j] = 0;// Формирование результата произведения двух матриц   for (i = 0; i < m; i++)          for (j = 0; j < n; j++)                  for (k = 0; k < r; k++)                          C[i][j] = C[i][j] + A[i][k]*B[k][j];   // Распечатка результата произведения двух матриц   printf("\n 1) Index: \"ijk\". Matrix (%dx%d):\n", m, n);   for (i = 0; i < m; i++) {          printf("\n");          for (j = 0; j < n; j++)                  printf(" %4d", C[i][j]);   }                     printf("\n\n ... Press any key: ");   _getch();   return 0;}

В программе используются три цикла по формированию произведения двух матриц. Первый цикл (переменная i ) связан с количеством строк первой матрицы (матрицы А ), второй цикл (переменная j ) связан с количеством столбцов второй матрицы (матрица В ), третий цикл (переменная k ) связан со смежной размерностью матриц, которая исчезает в результирующей матрице С. Матрицы А и В определены как неизменяемы типы ( const int ). Приведенный программный метод можно назвать как первый метод, метод "ijk".

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

Рис. 8.7. Результат произведения двух матриц

Контрольные вопросы

  1. Как организуются многомерные числовые массивы в языке С?
  2. Как организуется индексирование числовых массивов в языке С?
  3. На кого или на что возлагается контроль границ числовых массивов в языке программирования С?
  4. В какой очередности и как происходит заполнение многомерных числовых массивов в программах на языке С?
  5. Для чего применяется начальная инициализация числовых массивов при дальнейшем их использовании?
  6. Сколько потребуется операторов цикла для вывода на консоль двухмерного числового массива (матрицы чисел)?
  7. Почему при определении размерности массива с помощью препроцессорной директивы define не используется точка с запятой после числового значения?

Задание.

При выполнении заданий данной лабораторной работы уметь заменять один тип цикла другим, например: while заменить на for или наоборот. При решении задач не использовать массивы данных.

Вариант 1.  

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.  

Задание 5.

Вариант 2.

Задание 1.  

Задание 2.   

Задание 3.   

Задание 4.   

Задание 5.

Вариант 3.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 4.

Задание 1.  

Задание 2.  

Задание 3.

Решить задачу без использования дополнительного массива

Задание 4.

Задание 5.

Вариант 5.

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 6.

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 7.

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 8.

Задание 1.  

 

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 9.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.  

Задание 5.

Вариант 10.

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 11.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 12.

Задание 1.   

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 13.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.  

Задание 5.

Вариант 14.

Задание 1.   

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 15.

Задание 1.  

 

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 16.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 17.

Задание 1.  

Задание 2.

Задание 3.

Задание 4.   

Задание 5.

Вариант 18.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Под удалением столбца в матрице следует понимать:

Вариант 19.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 20.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 21.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 22.

Задание 1.  

Задание 2.  

Задание 3.

Задание 4.

Задание 5.

Вариант 23.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 24.

Задание 1.  

Задание 2.   

Задание 3.

Задание 4.

Задание 5.

Вариант 25.

Задание 1.  

Задание 2.  

Задание 3.

Без использования дополнительного массива

Задание 4.

Задание 5.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.