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

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

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

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