Skip to content

Работа с массивами. Часть 2

Здравствуйте, дорогие читатели. Сегодня мы продолжим говорить о массивах и, как обычно, разберём несколько задач. В предыдущей статье мы рассматривали только одномерные массивы в Си, а сейчас научимся работать ещё и с двумерными. Начнём с такой задачки:

Осуществить заполнение двухмерного массива 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

Опубликовано вСи

Будьте первым, кто оставит комментарий

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *