Здравствуйте, дорогие читатели. Сегодня мы продолжим говорить о массивах и, как обычно, разберём несколько задач. В предыдущей статье мы рассматривали только одномерные массивы в Си, а сейчас научимся работать ещё и с двумерными. Начнём с такой задачки:
Осуществить заполнение двухмерного массива init_array[12][12] целыми числами из диапазона [-500; 500]. Вывести массив в файл array.txt в прямоугольном виде. Прочитав получившийся файл, заполнить значениями другой двумерный массив new_array[12][12]. Найти и вывести на экран минимальный элемент, сумму четных строк и количество нечетных элементов на побочной диагонали массива new_array.
Всё, что необходимо для решения данной задачи мы с вами уже разбирали. Приступим к коду:
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *array; array = fopen("array.txt","w"); int init_array[12][12], i, j, k; k = 1; for (i = 0; i < 12; i++){ for (j = 0; j < 12; j++){ init_array[i][j] = -500 + rand() % (500 + 500 + 1); fprintf(array, "%d ", init_array[i][j]); } fprintf(array, "\n"); } fclose(array);
В двух словах : создали массив, открыли файл на запись, записали массив в файл. Тут ничего сложного.
array = fopen("array.txt","r"); int new_array[12][12],x,y,min,sum,kol; for (x = 0; x < 12; x++){ for (y = 0; y < 12; y++){ fscanf(array, "%d", & new_array[x][y]); } } min= new_array[0][0]; sum = kol = 0; for (x = 0; x < 12; x++){ for (y = 0; y < 12; y++){ if (min > new_array[x][y]){ min = new_array[x][y]; } if (x % 2 == 0){ sum+=new_array[x][y]; } if ((x+y == 11) && (new_array[x][y] % 2 != 0)){ kol ++; } } } printf("min = %d\tsum = %d\tkol = %d", min, sum, kol); fclose(array); return EXIT_SUCCESS;
Тут тоже ничего хитрого: открываем уже записанный файл, считываем значения в новый массив и находим уже искомые данные (минимальный элемент, сумму чётных строк и количество нечётных элементов), с помощью соответствующих условий. Выводим полученные результаты в консоль.
Следующая:
Для одномерного целочисленного массива из 100 элементов с помощью функций найти количество элементов, которые меньше последнего элемента в массиве, минимальный элемент кратный восьми, максимальный элемент правой половины массива. Использовать только локальные переменные.
Код:
#include <stdio.h> #include <stdlib.h> #include <windows.h> int function(int, int*); int function2(int, int*); int function3(int, int*); #define N 100 #define a 99 #define b -99 int main(void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); int mas[N],i, koli, min,max; for (i = 0; i < N; i++){ mas[i] = b +rand() % (a-b+1); }
Вначале объявим функции, с помощью которых мы будем находить необходимые данные. Далее задаём рандомные значения в массив.
koli = function(0, mas); min = function2(a, mas); max = function3(b, mas); printf("колличество эл = %d, минимальный и кратный 8 = %d, максимальный в правой части = %d", koli, min, max); return EXIT_SUCCESS; } int function(int kol, int* mas) { int i; for (i = 0; i < N; i++){ if (mas[i] < mas[N-1]) kol++; } return kol; } int function2(int min, int* mas){ int i; for (i = 0; i < N; i++){ if ((mas[i] % 8 == 0)) { min = mas[i]; } } for (i = 0; i < N; i++){ if ((min > mas[i]) && (mas[i] % 8 == 0)) { min = mas[i]; } } return min; } int function3(int max, int* mas) { int i; for (i = N/2; i < N; i++){ if (max < mas[i]) { max = mas[i]; } } return max; }
Вызов функций в main, а затем их описание внизу. Такая структура возможна, благодаря объявлению функций вначале. Остальное мы уже разбирали.
И последняя на сегодня:
Для двумерного массива из 144 элементов, которые содержат случайные дробные значения от 67 до 120, с помощью функций найти индексы максимального элемента побочной диагонали, количество элементов с четными индексами столбца и нечетными строки, сумму элементов, целая часть которых заканчиваются на 1. Использовать только локальные переменные.
Код:
#include <stdio.h> #include <stdlib.h> #include <windows.h> #define N 12 double fuction1(double [N][N]); int fuction2(double [N][N]); double fuction3(double [N][N]); int main(void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); int i, j, koli, x = 0, y = 0; double mas[N][N], summa, index; for (i = 0; i <N ; i++){ for (j = 0; j < N; j++){ mas[i][j] = rand() % 53 + 67 + (rand() % 100) / 100.0; } }
Объявляем функции и записываем в двумерный массив рандомные дробные значения.
index = fuction1(mas); for (i = 0; i <N ; i++){ j = N - i -1; if ( index == mas[i][j] ) { x = i; y = j; } } koli = fuction2(mas); summa = fuction3(mas); printf("индексы = %d, %d, количество = %d, сумма, которых на 1 = %lf", x, y, koli, summa); return EXIT_SUCCESS; } double fuction1(double mas[N][N]){ int i, j; double max = 0; max = mas[0][N - 1]; for (i = 0; i < N ; i++){ j = N - i -1; if ( max < mas[i][j] ) { max = mas[i][j]; } } return max; } int fuction2(double mas[N][N]){ int i, j, kol; kol = 0; for (i = 0; i <N ; i++){ for (j = 0; j < N; j++){ if (( i % 2 != 0 ) && (j % 2 == 0)) { kol++; } } } return kol; } double fuction3(double mas[N][N]){ int i, j; double sum; sum = 0; for (i = 0; i <N ; i++){ for (j = 0; j < N; j++){ if ( ((int)mas[i][j]) %10 == 1){ sum += mas[i][j]; } } } return sum; }
С помощью первой функции найдём максимальный элемент, с помощью второй — количество элементов с четными индексами столбца и нечетными строки и в третьей — сумму элементов, целая часть которых заканчиваются на 1. Более ничего сложного.
Если остались вопросы, пишите в комментариях.
Все исходники без файлов txt.
Скачать исходники задачи — 1
Скачать исходники задачи — 2
Скачать исходники задачи — 3
Будьте первым, кто оставит комментарий