- •Глава 1 элементы языка
- •Вывод: Пробелы употреблять везде, где это допустимо и улучшает читабельность программы.
- •Введение в си
- •Глава 2 элементы данных
- •Глава 3 массивы и структуры
- •Глава 4 операции и выражения
- •Глава 5 основные операторы
- •Формат: ;
- •Глава 6. Ввод – вывод данных
- •Форма представления одного данного
- •6.2 Функции getchar(), putchar(), getch()
- •Глава 7. Блоки и процедуры
- •Глава 8 Препроцессор
- •Вычисление квадратичной формы
- •Глава 9 Символьная информация и строки
- •9.3 Строки или строковые константы
- •Глава 10 фAйлы
Глава 3 массивы и структуры
К совокупностям данным относятся массивы, структуры и файлы
Массивы
МАССИВ – это множество переменных одного типа, характеризующихся одним именем. Как следует из их определения, массивы очень удобны, если приходится иметь дело с большими наборами однотипных данных.
описание массива
Формат: Синтаксис описания массива
<тип> <имя_переменной> [количество_элементов_массива]
Обращение (ссылка) к элементу массива
Отдельные элементы массива собственного имени не имеют. Доступ к ним можно получить, используя оператор [ ].
Формат:
<имя_массива> [<индекс_элемента>]…
Данный оператор возвращает элемент массива, соответствующий индексу. Обратите внимание: индексация в Си начинается с 0, то есть правильными значениями индекса будут все значения в интервале
от 0 до <количество_элементов_массива>–1.
Все значения в квадратных скобках при определении массивов должны быть целыми постоянными выражениями. Пока будем считать, что они целые без знака.
Пример: page[5] line[i] screen[j][k] matr[i–1][j+i–1]
Массивы можно, как и остальные переменные, инициализировать сразу при их объявлении. При этом элементы массива перечисляются через запятую, и все вместе заключаются в фигурные скобки. Пример: int a[ 6 ] = { 1, 2, 3, 4, 5, 6 };
Количество элементов в списке может быть меньше формального количества элементов массива – при этом инициализируются первые n элементов массива, где n – количество элементов в списке инициализации. С другой стороны, если указаны все элементы массива, то формальное количество элементов может отсутствовать:
int a[ ] = { 1, 2, 3}).
Теперь вопрос: что напечатает такая программа?
#include <stdio.h>
void main (void)
{ int i, a[10];
a[0] = 5;
printf ( "%d\n", *a ); }
На первый взгляд кажется, что она даже не будет компилироваться – ведь мы пытаемся взять значение по переменной, не являющейся адресом. Но, вопреки ожиданиям, она запустится и напечатает число 5.
Как вы можете догадаться из этого, имя массива в Си является указателем на его первый элемент. Запомните это раз и навсегда – это очень важно.
Строки
Язык СИ не поддерживает отдельный строковый тип данных, но он позволяет определить строки двумя различными способами.
В первом используется массив символов, а во втором – указатель на первый символ массива. Объявление char а[10] указывает компилятору на необходимость резервирования места для максимум на 10 символов. Константа а содержит адрес ячейки памяти, в которой помещено значение первого объекта типа char.
Второй способ определения строки – это использование указателя на символ. Объявление char *b; задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Когда компилятор встречает инструкцию вида b=”Москва”; , он производит следующие действия. Во-первых, как и в предыдущем случае, он создает в каком-либо месте объектного модуля строку Москва, за которой следует нулевой символ. Во-вторых, он присваивает значение начального адреса этой строки (адрес символа М) переменной b.
Константа (литерал) типа строка (string): " <текст> "
Структуры
СТРУКТУРА (запись) – совокупность разнотипных элементов. Элементы структуры (вернее, поля структуры), в отличие от элементов массива, не имеют индекса, но имеют собственное имя. Элементом структуры может быть массив любого типа.
Пример: Представление текущей даты:
– день месяца;
– название месяца;
– год;
Формат структура
struct [<тип(имя)_структуры>] {
<список_описаний_элементов>
} [<список_объектов>];
<список_описаний_элементов> :=
<имя_типа> <имя_переменной> [, имя_переменной [,...]];
<имя_типа> <имя_переменной> [, имя_переменной [,...]];
…
<имя_типа> <имя_переменной> [, имя_переменной [,...]];
Пример:
1. struct data { /* Дата */
int day_nom; /* День месяца */
char month_name[4]; /* Название месяца */
int year; /* Год */
};
Таким образом, мы объявили новый тип данных – Data, представляющий из себя структуру. Если мы хотим объявить переменную day типа Data, то это следует делать так:
struct Data day;
Доступ к полям структуры осуществляется с помощью оператора точка:
day.day_nom = 5;
day. month_name = "март";
day.year = 2002;
Разрешается вкладывать структуры одна в другую.
Пример:
1. struct star {
long nom_GC; //Номер по каталогу GC
float mv; //Блеск (звездная величина)
char spectr[5]; //Спектральный класс
struct fist {
double alfa; //Прямое восхождение
double delta; //Склонение
} koord;
/*переменная koord представлена составным элементом (вложенной структурой) типа fist*/
struct {
double alfa; //Собств. движение по alfa
double delta; // ------ ------- по delta
} move;
char rem[15]; }; //Особенности(прим)
Допустимы массивы структур.
Пример:
struct year { /* Сведения о погоде за год */
struct {
double max, min, mid;
} temperature;
struct {
double max, min, mid;
} humidity;
struct {
double max, min, mid;
} pressure;
int number_of_observations;
} weather[12];