- •О.Ф.Власенко, и.В.Беляева изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •Оглавление
- •Вывод в языке си Простейшая программа «Привет, мир!»
- •Функция printf – форматированный вывод
- •Циклы в языке си «Привет, мир!» 100 раз
- •Цикл с предусловием в Паскале и Си
- •Цикл с постусловием в Паскале и Си
- •Цикл for в Паскале и Си
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Функции в языке си Локальные и глобальные переменные
- •Функции без параметров в Си
- •Функции с параметрами
- •Способы передачи параметров в подпрограммы
- •Работа с указателями: операции взятия адреса и разыменования адреса
- •Ввод в языке си Функция getch – ввод символа
- •Функция scanf - форматированный ввод
- •Развилки Пример задачи: размер файла в байтах
- •Усеченные развилки
- •Полные развилки
- •Варианты для простых заданий и для заданий средней сложности
- •Задания среднего уровня сложности
- •Рекуррентные соотношения для вычисления корней
- •Разложение в ряд некоторых функций
- •Пример выполнения лабораторной работы по заданиям среднего уровня сложности
- •Сложные задания
- •Пример выполнения лабораторной работы по сложным заданиям
- •Варианты для сложных заданий
- •Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
- •Массивы в си Объявление и инициализация одномерных массивов в Си
- •Вычисление адреса элемента массива
- •Адресная арифметика
- •Имя массива является указателем на нулевой элемент массива
- •Передача массива в функцию через параметр
- •Примеры обработки массивов в Си
- •Задание для лабораторной работы по теме «Обработка одномернЫх массивОв» Цель работы
- •Общее задание
- •Пример выполнения лабораторной работы
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Список литературы
- •Изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •432027, Г. Ульяновск, Сев. Венец, 32.
Массивы в си Объявление и инициализация одномерных массивов в Си
В Си одномерный массив объявляется следующим образом:
ТИП_ЭЛЕМЕНТОВ ИМЯ_МАССИВА[КОЛИЧЕСТВО_ЭЛЕМЕНТОВ];
Пример:
int a[5];
float f[100];
char s[80];
Эквивалентные массивы в Паскале были бы объявлены так:
var
a: array [0 .. 4] of integer;
f: array [0 .. 99] of real;
s: array [0 .. 79] of char;
То есть если объявлен массив:
int b[10];
то в таком массиве есть 10 элементов:
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9].
В нем нет элемента b[10].
Обращение к элементам одномерного массива в Си производится точно так же, как и в Паскале. Например, если необходимо пятому элементу массива b присвоить значение 0, то это будет выглядеть так: b[5] = 0;
В случае необходимости обработать все элементы массива используется цикл. Как правило, используется цикл for такого вида:
// Обнулить все элементы массива B
for (i = 0; i < 10; i++)
b[i] = 0;
Массив в Си может быть одновременно объявлен и инициализирован.
int a[10] = {5, 4, 3, 2, 3, 4, 5, 4, 3, 4};
Эта запись означает, что a[0] = 5, a[1] = 4, a[2] = 3 и так далее.
Если в инициализации массива указано чисел меньше, чем элементов, то числа присваиваются первым элементам, а остальным элементам (хвостовым), присваивается значение 0.
int b[5] = {1, 2, 3};
В этом примере b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 0, b[4] = 0.
Если массив инициализируется, то количество элементов массива при его объявлении можно не задавать. В этом случае количество элементов в массиве вычисляется по количеству чисел в инициализации.
int c[] = {10, 11, 12, 13};
Массив c содержит 4 элемента: c[0] = 10, c[1] = 11, c[2] = 12, c[3] = 13.
Вычисление адреса элемента массива
Как уже говорилось выше, при работе с указателями используются две операции: операция взятия адреса & и операция разыменования адреса *. Рассмотрим применение этих операций к элементам массива.
long a[5];
Размещение массива A в памяти:
Адрес в памяти |
Элемент массива |
0100 |
A[0] |
0104 |
A[1] |
0108 |
A[2] |
010C |
A[3] |
0110 |
A[3] |
Объявим указатели на каждый элемент массива:
long * pa0;
long * pa1;
long * pa2;
long * pa3;
long * pa4;
Присвоим этим указателям соответствующие адреса:
Pa0 = &a[0];
pa1 = &a[1];
pa2 = &a[2];
pa3 = &a[3];
pa4 = &a[4];
Используя указатели, присвоим элементам значения 10, 20, 30, 40, 50 соответственно:
*pa0 = 10;
*pa1 = 20;
*pa2 = 30;
*pa3 = 40;
*pa4 = 50;
Адресная арифметика
В Си к указателям можно применять операции + и -. Прибавлять к указателю можно только целое число. Например, значение адреса, хранящегося в pa2, равно 0108. Значение выражения pa2 + 1 будет равно адресу 010C (а не 0109, как Вы, наверное, ожидали).
Дело в том, что при увеличении указателя на 1 производится вычисление адреса СЛЕДУЮЩЕГО элемента массива. А следующий элемент массива расположен по адресу 010C. Коротко это можно записать так: pa2 + 1 = pa3.
Соответственно, pa2 + 2 = pa4.
Если из pa2 вычесть 1, то получится адрес pa1 (0104). А если вычесть 2, то pa0 (0100).
pa2 - 1 = pa1
pa2 - 2 = pa0
Из указателя можно вычитать не только целые числа, но и другой указатель. В этом случае вычисляется, сколько элементов массива расположено между двумя указателями. Например, если из pa2 вычесть pa0, то получиться 2 – столько элементов располагается между pa2 и pa0. Соответственно, pa4 – pa0 = 4, pa3 – pa1 = 2 и т.д.
Кроме сложения и вычитания, к указателям можно применять операции инкремента и декремента.
long * p = &a[0]; //p указывает на a[0]
p++; // после этой операции p указывает на a[1]
p--; // а после этой снова указывает на a[0]
Также указатели можно сравнивать друг с другом.
Например:
pa1<pa2 – истина
pa3>=pa0 – истина
pa0 > pa0 – ложь
pa0 >= pa0 – истина
pa1!=pa2 – истина
pa1==pa2 – ложь
pa1+1 == pa2 - истина
pa4-4 == pa0 - истина
