Передача массива в функцию через параметр — КиберПедия 

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Передача массива в функцию через параметр

2022-10-28 18
Передача массива в функцию через параметр 0.00 из 5.00 0 оценок
Заказать работу

 

Если в функции обрабатывается массив, то в нее он передается посредством указателя на нулевой элемент массива. Рассмотрим на примере – разработаем функцию генерации случайного массива из 10 элементов и функцию вывода массива на экран.

 

#include <stdio.h>

 

// a – указатель на нулевой элемент массива

void generate(int * a)

{

for (i = 0; i < 10; i++)

a[i] = random(10);

}

 

// a – указатель на нулевой элемент массива

void print (int a[])

{

for (i = 0; i < 10; i++)

printf(“%d ”, a[i]);

printf(“\n\n”);

}

 

int main()

{

 

int a[10];

 

generate(a); // В функции передается указатель на нулевой

print(a); // элемент массива A

 

return 0;

}

 

В функции передача массива может быть обозначена одним из трех взаимозаменяемых способов:

1> void generate(int * a);

2> void generate(int a[]);

3> void generate(int a[10]);

Причем в третьем методе в [ ] может стоять любое натуральное число – все равно оно в программе никаким образом не контролируется!

 

 

Примеры обработки массивов в Си

 

Рассмотрим обработку на примере массива, содержащего не более 10 элементов. Реально используемое количество элементов хранится в переменной n.

 

Ввод массива с клавиатуры:

// a – массив, n – указатель на количество элементов

void readArray(int a[], int * n)

{

int i;

printf("\nВведите n = ");

scanf("%d", n); // Обратите внимание! Перед n НЕ СТОИТ &,

           // потому что n передан в эту функцию как указатель

 

for (i = 0; i < *n; i++) // А здесь перед n стоит *,                        

scanf("%d", &a[i]); // потому что n – это указатель, а требуется

                   // значение

}

Вызов этой функции:

int a[10];

int n;

readArray(a, &n); /* В функцию readArray передаются 2 параметра: первый a – указатель на нулевой элемент массива a, второй – указатель на n – значение количества элементов n в функции readArray будет изменяться, поэтому передаем указатель на количество элементов массива. */

 

Вывод массива на экран:

// a – массив, n –количество элементов

void writeArray(int a[10], int n)

{

int i;

for (i = 0; i < n; i++)

printf("%d ", a[i]);

printf(“\n”);

}

Вызов функции:

writeArray(a, n); /*В функцию writeArray передаются 2 параметра: первый a – указатель на нулевой элемент массива a, второй – значение количества элементов n. В функции writeArray значение n не будет изменяться, поэтому передавать указатель в функцию не требуется. */

 

Генерация массива:

// a – массив, n – указатель на количество элементов

void generateArray(int * a, int * n)

{

int i;

*n = random(5) + 6;

for (i = 0; i < *n; i++)

a[i] = random(10);

}

Вызов функции:

generateArray(a, &n);

 

 

Поиск максимального элемента массива:

// a – массив, n – количество элементов

// Возвращается значение максимального элемента

int findMaxElement(int * a, int n)

{

int i;

int max = a[0];

for (i = 1; i < n; i++)

if (a[i] > max) max = a[i];

return max;

}

Вызов функции:

int max = findMaxElement(a, n);

 

Загрузка массива из текстового файла in.txt:

// Загружает массив a из файла in.txt

//Параметры: a – массив, n – указатель на количество элементов

// Данные в файле хранятся в следующем формате:

// 1. Значение числа N

// 2. N значений элементов массива

// Функция возвращает 1, в случае если файл открылся

// 0 – если файл не открылся

int loadArray(int * a, int * n)

int i;

// Открывается файл in.txt в режиме чтения

FILE * fin = fopen("in.txt", "r");

// Если файл не открылся – выходим из функции и возвращаем 0

if (fin == NULL) return 0;

 

// Читаем из файла значение N

fscanf(fin, "%d", &n);

// Читаем из файла N значений элементов массива

for (i = 0; i < *n; i++)

fscanf(fin, "%d", &a[i]);

// Закрываем файл

fclose(fin);

// Возвращаем 1 – сигнал, что все OK

return 1;

}

Вызов функции:

if (!loadArray(a, &n))

printf("Файл in.txt не открывается!\n");

 

Сохранение массива в файле out.txt:

// a – массив, n –количество элементов

int saveArray(int * a, int n)

int i;

// Открывается файл out.txt в режиме перезаписи

FILE * fout = fopen("out.txt", "w");

 

// Если файл не открылся – выходим из функции

if (fout == NULL)

{

return 0;

}

 

for (i = 0; i < n; i++)

fprintf(fout, "%2d ", a[i]);

fprintf(fout, "\n");

fclose(fout);

return 1;

}

Вызов функции:

if (!saveArray(a, n))

printf("Файл out.txt не открывается!\n");

 

 

Задание для лабораторной работы по теме «Обработка одномернЫХ массивОВ»

Цель работы

 

Изучить использование массивов в Си.

Общее задание

 

Во всех задачах требуется написать, отладить и протестировать программу, обеспечивающую выполнение следующих действий:

1. Ввод одномерного массива.

2. Вывод исходного массива.

3. Обработка массива в соответствии с заданием.

4. Вывод параметров массива, которые требуется найти по заданию.

5. Вывод массива после внесенных изменений.

 

В программе обязательно использовать функции. Использование глобальных переменных запрещено. При обработке вспомогательными массивами по возможности не пользоваться. В программе нужно обеспечить выбор способа заполнения исходного массива: с клавиатуры, случайное заполнение, загрузка из файла.

Пример выполнения лабораторной работы

 

Задача:

Из массива удалить первый из четных элементов.

Пример: из массива A[5]: 1 3 4 5 6 должен получиться

массив A[4]: 1 3 5 6.

/*

Задача:

Из массива удалить первый из четных элементов.

Пример: из массива A[5]: 1 3 4 5 6 должен получиться

массив A[4]: 1 3 5 6.

*/

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

 

/*

 Меню выбора способа заполнения массива.

 Возвращает код нажатой клавиши.

*/

char menu()

{

char ch; //Выбранный пункт меню

 

clrscr();

while (1)

{

printf("Выберите один из вариантов:\n");

printf("1. Генерация случайных значений\n");

printf("2. Ввод массива с клавиатуры\n");

  printf("3. Загрузка элементов из файла\n\n");

printf("0. Выход из программы\n");

printf("Введите номер выбранного пункта: ");

ch = getch();

//Если ввели правильный параметр - выходим из функции

if (ch == '1' || ch == '2' || ch == '3' || ch == '0')

return ch;

//Если ввели неправильный параметр - снова меню

clrscr();

printf("Вы ввели неверный номер варианта.\n\n");

}

}

 

/*

Заполнение массива a случайными значениями.

Параметры: a - массив, n - указатель на количество элементов.

*/

void generateArray(int * a, int * n)

{

int i;

randomize();

*n = random(5) + 6;

for (i = 0; i < *n; i++)

a[i] = random(10);

}

 

/*

Ввод массива с клавиатуры.

Параметры: a - массив, n - указатель на количество элементов.

*/

void readArray(int a[], int * n)

{

int i;

printf("\nВведите n = ");

scanf("%d", n);

 

for (i = 0; i < *n; i++)

scanf("%d", &a[i]);

}

 

/*

Загрузка массива a из файла in.txt

Параметры: a - массив, n - указатель на количество элементов

Данные в файле хранятся в следующем формате:

1. Значение числа N

2. N значений элементов массива

Функция возвращает 1, в случае если файл открылся

0 - если файл не открылся

*/

int loadArray(int * a, int * n)

{

int i;

FILE * fin = fopen("in.txt", "r");

if (fin == NULL) return 0;

 

fscanf(fin, "%d", &n);

for (i = 0; i < *n; i++)

fscanf(fin, "%d", &a[i]);

fclose(fin);

return 1;

}

 

/*

Вывод массива на экран.

Параметры: a - массив, n - количество элементов.

*/

void writeArray(int a[10], int n)

{

int i;

for (i = 0; i < n; i++)

printf("%d ", a[i]);

printf("\n");

}

 

/*

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

Параметры: a - массив, n - количество элементов.

Возвращаемое значение: индекс первого нечетного элемента массива,

или -1, если в массиве нет нечетных элементов.

*/

int findFirstOddElement(int * a, int n)

{

int i;

for (i = 0; i < n; i++)

// Если i-ый элемент - нечетный

if (a[i] % 2 == 1)

// то завершаем поиск, возвращаем i, как индекс

// первого нечетного элемента

return i;

// Если ни одного нечетного элемента не нашли,

// возвращаем -1

return -1;

}

 

/*

Удаление элемента из массива.

Параметры: a - массив, n - указатель на количество элементов,

indDel - индекс удаляемого элемента массива.

*/

void deleteElement(int * a, int * n, int indDel)

{

int i;

for (i = indDel; i < *n - 1; i++)

a[i] = a[i + 1];

(*n)--;

}

 

int main()

{

int a[10];

int n;

 

// выбор способа заполнения массива

switch (menu())

{

case '1': // заполнение массива случайными значениями

generateArray(a, &n);

break;

 

case '2': // ввод массива с клавиатуры

readArray(a, &n);

break;

 

case '3': // загрузка массива из файла in.txt

   // Если файл in.txt не найден, то делаем массив пустым

if(!loadArray(a, &n)) n = 0;

break;

 

default:

return 0;

}

printf("\nМассив после заполнения:\n");

writeArray(a, n);

int ind = findFirstOddElement(a, n);

if (ind > -1)

{

deleteElement(a, &n, ind);

printf("\nМассив после удаления элемента:\n");

writeArray(a, n);

}

else

printf("\nВ массиве нет нечетных элементов!");

 

return 0;

}

 

 

 

Задачи простые

 

Вариант A1

В массиве все элементы, стоящие после минимального, уменьшить на 10.

Пример: из массива A[5]: 3 2 1 5 6 должен получиться массив 3 2 1 -5 –4.

 

Вариант A2

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

Пример: из массива A[5]: 3 2 1 5 4 должен получиться массив 9 6 3 5 4.

 

Вариант A3

В массиве все элементы, стоящие после максимального, уменьшить на 1.

Пример: из массива A[5]: 3 2 1 5 4 должен получиться массив 3 2 1 5 3.

 

Вариант A4

В массиве все нечетные элементы, стоящие после максимального, увеличить в 10 раз.

Пример: из массива A[5]: 3 7 1 5 4 должен получиться массив 3 7 10 50 40.

 

Вариант A5

В массиве все четные элементы, стоящие левее минимального, уменьшить в 2 раза.

Пример: из массива A[5]: 3 2 1 0 4 должен получиться массив 3 1 1 0 4.

 

Вариант A6

В массиве A каждый элемент, кроме первого, заменить суммой всех предыдущих элементов.

Пример: из массива A[5]: 3 2 1 0 4 должен получиться массив 3 5 6 6 10.

 

Вариант A7

В массиве A каждый элемент, кроме последнего, заменить суммой всех следующих элементов.

Пример: из массива A[5]: 3 2 1 0 4 должен получиться массив 10 7 5 4 4.

 

Вариант A8

В массиве A каждый элемент, кроме первого и последнего, заменить суммой соседних элементов.

Пример: из массива A[5]: 3 2 1 0 4 должен получиться массив 3 4 2 5 4.

 

Вариант A9

В массиве A найти сумму элементов, расположенных между минимальным и максимальным элементами массива.

Пример: для массива A[5]: 3 1 2 4 5 сумма получается равной 6.

 

Вариант A10

В массиве A найти сумму всех элементов, за исключением тех, которые расположены между минимальным и максимальным элементами массива.

Пример: для массива A[5]: 3 1 2 4 5 сумма получается равной 9.

 

Вариант A11

В массиве A заменить значение всех элементов (кроме первого и последнего) на среднее арифметическое этого элемента и двух его соседей.

Пример: из массива A[5]: 3 9 0 6 3 должен получиться массив 3 4 5 3 3.

 

Вариант A12

В массиве определить количество инверсий. Инверсия – пара элементов, в которой большее число находится слева от меньшего A[I]>A[I+1].

Пример: для массива A[5]: 3 9 0 6 3 количество инверсий равно 2.

 

Вариант A13

Вычислить сумму тех элементов, значение которых совпадает с их индексом.

Пример: для массива A[5]: 1 9 3 4 6 сумма элементов равна 8.

 

Вариант A14

Вычислить сумму тех элементов, значение которых меньше значения их индекса.

Пример: для массива A[5]: 2 1 3 7 4 сумма элементов равна 5.

 

Вариант A15

Вычислить сумму тех элементов, значение которых больше значения их индекса.

Пример: для массива A[5]: 2 1 3 7 4 сумма элементов равна 9.

 

 

Задачи средней сложности

 

Вариант B1

Из массива удалить последний из нечетных элементов.

Пример: из массива A[5]: 1 3 4 5 6 должен получиться

массив A[4]: 1 3 4 6.

 

Вариант B2

После максимального из четных элементов вставить 0.

Пример: из массива A[5]: 1 9 8 3 5 должен получиться

массив A[6]: 1 9 8 0 3 5.

 

Вариант B3

После первого четного элемента вставить 0.

Пример: из массива A[5]: 1 6 8 3 4 должен получиться

массив A[6]: 1 6 0 8 3 4.

 

 

Вариант B4

Удалить максимальный из четных элементов.

Пример: из массива A[5]: 2 3 4 7 5 должен получиться

массив A[4]: 2 3 7 5.

 

Вариант B5

Удалить максимальный из кратных трем элементов.

Пример: из массива A[5]: 2 3 4 7 5 должен получиться

массив A[4]: 2 4 7 5.

 

Вариант B6

После последнего кратного четырем элемента вставить 0.

Пример: из массива A[5]: 1 3 8 3 4 должен получиться

массив A[6]: 1 3 8 3 4 0.

 

Вариант B7

Из массива удалить четные элементы, стоящие после максимального.

Пример: из массива A[5]: 2 7 4 6 5 должен получиться

массив A[3]: 2 7 5.

 

Вариант B8

Из массива удалить четные элементы, имеющие значение больше среднего арифметического всех элементов массива.

Пример: из массива A[5]: 8 7 2 6 5 должен получиться

массив A[3]: 7 2 5 (среднее арифметическое всех элементов =(8+7+2+6+5)/5=5.6).

 

Вариант B9

Из массива удалить элементы, имеющие значение меньше

среднего арифметического четных элементов массива.

Пример: из массива A[5]: 8 7 2 6 5 должен получиться

массив A[3]: 8 7 6 (среднее арифметическое четных элементов =(8+2+6)/3=5.33).

 

Вариант B10

Из массива удалить элементы, стоящие после максимального и имеющие значение меньше среднего арифметического всех элементов массива.

Пример: из массива A[5]: 8 6 9 4 5 должен получиться

массив A[3]: 8 6 9 (среднее арифметическое четных элементов =(8+6+9+4+5)/5=6.4).

 

Вариант B11

Из массива удалить четные элементы, стоящие между максимальным и минимальным элементами.

Пример: из массива A[7]: 1 8 8 4 7 0 5 должен получиться массив A[5]: 1 8 7 0 5.

 

Вариант B12

Из массива удалить элементы, кратные трем, стоящие между максимальным и минимальным элементами.

Пример: из массива A[7]: 1 9 3 4 9 0 0 должен получиться массив A[5]: 1 9 4 0 0.

 

Вариант B13

Из массива удалить элементы, имеющие четный индекс и стоящие между максимальным и минимальным элементами.

Пример: из массива A[7]: 9 3 4 9 1 0 0 должен получиться массив A[5]: 9 4 1 0 0.

 

Вариант B14

Из массива удалить элементы, встречающиеся в массиве более одного раза.

Пример: из массива A[7]: 9 3 4 9 1 0 0 должен получиться массив A[3]: 3 4 1.

 

Вариант B15

Из массива удалить элементы, встречающиеся в массиве только один раз.

Пример: из массива A[7]: 9 1 4 9 1 9 0 должен получиться массив A[5]: 9 1 9 1 9.

 

 

Задачи сложные

 

Вариант С1

Из массива удалить самую длинную цепочку четных элементов.

Пример: из массива A[8]: 4 1 4 2 1 2 4 6 должен получиться массив A[5]: 4 1 4 2 1.

(Самая длинная цепочка четных чисел включает элементы с 6 по 8: 2 4 6).

 

Вариант С2

Из массива удалить цепочки из четных элементов, состоящие менее чем из трех элементов.

Пример: из массива A[8]: 4 3 4 2 1 2 4 6 должен получиться массив A[5]: 3 1 2 4 6.

 

Вариант С3

Из массива A удалить те элементы, которые встречаются

и в массиве A, и в массиве B по крайней мере по 2 раза.

Пример: массив A[8]: 3 3 4 5 2 3 5 9

    массив B[7]: 1 2 3 4 5 2 5.

По 2 раза в обоих массивах встречается только элемент, равный 5.

Массив A после удаления примет вид: A[6]: 3 3 4 2 3 9.

 

Вариант С4

Из массива удалить цепочки из нечетных элементов, состоящие менее чем из трех элементов.

Пример: из массива A[8]: 3 3 4 5 2 3 7 9 должен получиться массив A[5]: 4 2 3 7 9.

 

Вариант С5

Из массива из каждой цепочки четных элементов удалить

самый маленький элемент.

Пример: из массива A[9]: 3 6 4 5 2 3 4 6 4 должен

получиться массив A[6]: 3 6 5 3 6 4.

 

Вариант С6

Из массива A удалить те цепочки четных элементов, в

которых есть хотя бы один элемент из массива B.

Пример: массив A[9]: 3 2 4 5 2 3 2 6 5

    массив B[6]: 1 3 4 7 8 9.

Массив A после удаления примет вид:

           A[7]: 3 5 2 3 2 6 5.

 

Вариант С7

Из массива A удалить те цепочки нечетных элементов,

в которых нет ни одного элемента из массива B.

Пример: массив A[10]: 3 2 7.5 2 1 2 6 3 9

    массив B[5]: 1 2 5 4 8.

Массив A после удаления примет вид:

    A[7]: 2 7 5 2 1 2 6.

 

Вариант С8

Из массива A удалить те цепочки нечетных элементов,

в которых нет ни одного элемента из массива B.

Пример: массив A[10]: 3 2 7 5 2 1 2 6 3 9

    массив B[5]: 1 2 5 4 8.

Массив A после удаления примет вид:

            A[7]: 2 7 5 2 1 2 6.

 

Вариант С9

Переписать в начало массива цепочку, содержащую наибольшее число подряд идущих четных элементов.

Пример: массив A[10]: 3 2 4 6 2 1 1 1 8 9.

В массиве A самая длинная цепочка:

2 4 6 2 (элементы со 2 по 5).

Массив A после перестановки цепочки в начало:

A[7]: 2 4 6 2 3 1 1 1 8 9.

 

Вариант С10

Из массива удалить повторяющиеся цепочки, имеющие длину не меньше 2.

Пример: массив A[10]: 3 3 4 3 3 1 3 3 5 2.

В массиве повторяется цепочка: 3 3.

Массив A после удаления: 4 1 5 2.

 

Вариант С11

Найти в массиве наибольшую по длине неубывающую цепочку подряд идущих элементов.

Пример: массив A[10]: 3 3 4 3 3 1 3 3 5 2.

Неубывающие цепочки: 3 3 4/3 3/1 3 3 5/2.

Наибольшая из них:          1 3 3 5.

 

Вариант С12

Перенести все четные элементы в начало массива, а все нечетные – в конец. Взаимное расположение, как среди четных элементов, так и среди нечетных, сохранить.

Пример: массив A[10]: 3 5 4 1 7 1 6 3 5 2.

Массив после перестановки

элементов:        4 6 2 3 5 1 7 1 3 5.

 

Вариант С13

Сдвинуть циклически элементы массива на K позиций в заданную сторону (влево или вправо).

Пример: массив A[10]: 3 5 4 1 7 1 6 3 5 2.

Массив после сдвига влево

на 4 позиции:     7 1 6 3 5 2 3 5 4 1.

 

Вариант С14

В массивах A и B найти наибольшую общую цепочку, содержащую только четные элементы.

Пример: массив A[10]: 3 2 4 4 6 2 1 4 6 8

    массив B[7]: 4 6 8 5 2 4 3.

Наибольшая общая цепочка 4 6 8.

 

Вариант С15

В массивах A, B и C найти наибольшую общую цепочку.

Пример: массив A[10]: 3 2 4 4 6 2 1 4 6 8

    массив B[7]: 4 6 8 3 2 4 3

    массив С[8]: 1 4 3 2 4 2 4 5.

Наибольшая общая цепочка 3 2 4.

 

Список литературы

 

1. Керниган Б., Ритчи Д. Язык программирования Си, 2-е изд.: Пер. с англ. – М.: Финансы и статистика, 1992. – 272 с.

2. Шилдт Г. Полный справочник по Си, 4-е издание.: Пер. с англ. – М.: Издательский дом «Вильямс», 2002. – 704 с.

3. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. – М.: Бином Универсал, К.: ЮНИОР, 1997. – 496 с.

4. Юркин А. Задачник по программированию. – СПб.: Питер, 2002. – 192 с.

5. Власенко О.Ф., Беляева И.В. Обработка одномерных массивов в языке Turbo Pascal: Методические указания. – Ульяновск, 2002. – 44 с.

6. Власенко О.Ф., Беляева И.В. Процедуры и функции в языке Turbo Pascal: Методические указания. – Ульяновск, 2002. – 44 с.

7. Докторов А.Е. Задания на лабораторные работы по информатике. Электронная документация.

8. Будыхо Е.Ю. Задания на лабораторные работы по программированию. Электронная документация.


 

 

Власенко Олег Федосович

Беляева Ирина Владимировна

 


Поделиться с друзьями:

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.266 с.