- •О.Ф.Власенко, и.В.Беляева изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •Оглавление
- •Вывод в языке си Простейшая программа «Привет, мир!»
- •Функция printf – форматированный вывод
- •Циклы в языке си «Привет, мир!» 100 раз
- •Цикл с предусловием в Паскале и Си
- •Цикл с постусловием в Паскале и Си
- •Цикл for в Паскале и Си
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Функции в языке си Локальные и глобальные переменные
- •Функции без параметров в Си
- •Функции с параметрами
- •Способы передачи параметров в подпрограммы
- •Работа с указателями: операции взятия адреса и разыменования адреса
- •Ввод в языке си Функция getch – ввод символа
- •Функция scanf - форматированный ввод
- •Развилки Пример задачи: размер файла в байтах
- •Усеченные развилки
- •Полные развилки
- •Варианты для простых заданий и для заданий средней сложности
- •Задания среднего уровня сложности
- •Рекуррентные соотношения для вычисления корней
- •Разложение в ряд некоторых функций
- •Пример выполнения лабораторной работы по заданиям среднего уровня сложности
- •Сложные задания
- •Пример выполнения лабораторной работы по сложным заданиям
- •Варианты для сложных заданий
- •Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
- •Массивы в си Объявление и инициализация одномерных массивов в Си
- •Вычисление адреса элемента массива
- •Адресная арифметика
- •Имя массива является указателем на нулевой элемент массива
- •Передача массива в функцию через параметр
- •Примеры обработки массивов в Си
- •Задание для лабораторной работы по теме «Обработка одномернЫх массивОв» Цель работы
- •Общее задание
- •Пример выполнения лабораторной работы
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Список литературы
- •Изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •432027, Г. Ульяновск, Сев. Венец, 32.
Имя массива является указателем на нулевой элемент массива
Действительно, в
Си соблюдается тождество
.
Из чего следует, что &a[1] = a + 1, &a[2]=a+2, …, &a[i]=a+i.
Далее, если a + 1 – это адрес a[1], то *(a+1) – это значение a[1]!!!
Соответственно, если a – адрес a[0], *a – это a[0]
a=&a[0] *a=a[0]
a+1 = &a[1] *(a+1) = a[1]
a+I = &a[i] *(a+i) = a[I]
Любой указатель можно использовать как имя массива. Например:
int a[10];
int * b = a; // b указывает на нулевой элемент массива A
int i;
for (i = 0; i < 10; i++)
b[i] = 0; // обнулить все элементы массива A!
Передача массива в функцию через параметр
Если в функции обрабатывается массив, то в нее он передается посредством указателя на нулевой элемент массива. Рассмотрим на примере – разработаем функцию генерации случайного массива из 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");
