Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Дисциплины:
2022-10-28 | 19 |
5.00
из
|
Заказать работу |
|
|
Если в функции обрабатывается массив, то в нее он передается посредством указателя на нулевой элемент массива. Рассмотрим на примере – разработаем функцию генерации случайного массива из 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. Будыхо Е.Ю. Задания на лабораторные работы по программированию. Электронная документация.
Власенко Олег Федосович
Беляева Ирина Владимировна
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!