- •1.2. Правила записи программ на языке с
- •1.3 Правила формального описания синтаксиса языка программирования
- •1.5.3. Описание данных в языке с
- •1.5.4 Правила записи констант различных типов
- •1.5.5. Символьные строки
- •Глава 2. Понятие функции
- •2.1. Стандартная функция printf
- •2.2. Стандартная функция scanf
- •Перед каждым аргументом, не являющимся строкой (адресом) ставится знак & и трактуется как вычисление адреса.
- •2.3. Стандартные математические функции
- •2.4. Простейшие функции, определяемые программистом
- •3.5. Дополнительные арифметические операции
- •3.6. Дополнительные операции присваивания
- •3.7. Битовые операции
- •3.8. Операторы отношения
- •Глава 4. Структурное программирование и язык с
- •4.2. Операторы языка с
- •4.3. Оператор цикла while
- •4.4. Оператор цикла do – while (цикл с постусловием)
- •4.5. Условный оператор и условная операция
- •4.6. Оператор цикла for (цикл с известным числом повторений)
- •4.7. Запись алгоритмов при помощи диаграмм Несси-Шнейдермана
- •4.8. Оператор прерывания цикла
- •4.9. Оператор продолжения цикла (continue)
- •4.10. Множественный выбор
- •Глава 5. Типовые приемы в программировании
- •5.1. Использование счетчиков
- •5.2. Вычисление суммы и произведения.
- •5.3. Вычисление минимума и максимума последовательностей.
- •5.4. Использование флагов
- •Глава 6. Простейшая графика
- •6.1.Графические режимы
- •6.2. Идеология bgi и WinBgi
- •6.3.Основные графические функции
- •6.3.1. Управление графическими режимами
- •6.3.2. Графические примитивы
- •6.3.3. Установки и их проверка
- •6.3.4. Работа с текстом
- •Глава 7. Модульное программирование
- •7.2. Библиотеки функций
- •Глава 8. Массивы
- •8.1. Описание массива
- •8.2. Ввод – вывод массивов
- •8.3. Инициализация массива
- •8.6. Двумерные массивы
- •8.6.1. Инициализация двумерного массива
- •8.7. Многомерные массивы
- •Глава 9. Работа с файлами
- •9.1. Открытие и закрытие файлов
- •Глава 10. Структуры языка с
- •10.1. Описание структур
- •10.2. Трактовка имени структуры
- •10.2.1. Доступ к полям структуры
- •10.3. Инициализация структур
- •10.4. Структуры и функции
- •10.5. Поля бит в структурах
- •10.6. Объединение
- •Глава 11. Дополнительные сведения о функциях
- •11.1. Области видимости.
- •Глава 12. Анимация
- •Глава 13. Рекурсия
- •13.1. Понятие рекурсии
- •13.2. Вычисление факториала
- •13.3. Числа Фибоначчи
- •13.4. Замена итерационных алгоритмов рекурсивными
- •13.5. Применение рекурсии в графике
8.6. Двумерные массивы
Двумерный массив удобно представлять себе в виде прямоугольной таблицы элементов. Выделяют строки и столбцы массива. На пересечении столбцов и строк выделяют номер массива.
В памяти ЭВМ двумерный массив представляется как массив массивов. То есть каждый элемент такого массива является в свою очередь массивом. В языке С описание массива производится с помощью второй пары квадратных скобок по сравнению с одномерным массивом.
int A[3][4];//массив из 3 строк и 4 столбцов
Разбор такого описания производится слева направо. Имя двумерного массива без квадратных скобок за ним обозначает адрес, т.е. первой строки.
Имя массива с одним индексным выражением A[i] обозначает значение первого элемента.
Имя массива с двумя индексными выражениями имеет значение i[j] элемента.
8.6.1. Инициализация двумерного массива
Производится следующим образом:
int A[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
В случает когда инициализация производится таким образом, количество строк можно не указывать:
double B[][3]={{1,2,3},{4,5,6}};
int C[][10]= {{1,2,3},{4,5,6,7,8}};
int D[3][3]={1,2,3,4,5,6};
Для строк используется следующий синтаксис:
char TXT[3][20]={“Это строка 1”,”Это строка 2”,”Длинная строка 3”}
8.7. Многомерные массивы
Описание многомерных массивов аналогично описанию двумерных массивов, просто записывается больше пар квадратных скобок.
Объявим пятимерный массив:
double A[3][2][5][18][8]; //в массиве 3 элемента
Многомерные массивы используются гораздо реже, но в их использовании нет ничего сложного.
Глава 9. Работа с файлами
Стандартные функции языка С позволяют считывать из файла и записывать в файл.
9.1. Открытие и закрытие файлов
Для начала работы с файлом надо открыть файловый поток. Это делает функция fopen(char const *fname, char const *opentypes)
Первая строка – это строка с именем файла. Вторая – способ открытия (R read, W write, A append, R+, W+). Кроме того, в способ открытия может быть добавлен t (текстовый) b (бинарный).
FILE *f1
f1=fopen(“c:\\temp\\1.txt”,”rt”);
if(f1=NULL)
printf(“File not found”);
SYSTEMPAUSE;
exit(1);
После того, как файл больше не нужен, его следует закрыть
fclose(f1);
9.2. Чтение и запись файла
Используется два способа представления данных в файле: текстовый и двоичный. Рассмотрим функции для работы двумя этими способами:
9.2.1. Текстовый ввод-вывод
Большинство функций из файла stdio.h для работы с консолью имеют двойников для работы с файлами, имеющих префикс f.
int fprintf(FILE* string, char const* format,...);
int fscanf(FILE* string, char const* format,...);
fgets(char *boof, FILE *f);
fputs(---//---);
fgetc();
fputc();
9.2.2. Двоичный ввод-вывод
Выведенные в двоичном виде данные не удобны для чтения человеком. Однако позволяют сэкономить дисковое пространство и ресурсы при сохранении и загрузке.
sizet (количество успешно считываемых объектов) fread(void *buf, size size_t const, FILE *f);
size_t count – количество элементов
fwrite();
9.3. Навигация по файлам
Язык С позволяет устанавливать позицию курсоров в файле, а также проверять, не закончился ли файл.
fseek(FILE *f, long of set, long base);//base – SEEK_CUR, SEEK_SET, SEEK_END, set – смещение
int feof(FILE *f); //проверяет, достигнут ли конец файла. Флажок выставляется только после неудачной попытки считывания
9.4. Пример использования файлов
Рассмотрим работу с файлами для сохранения одномерного массива. Для удобства считывания будем так же записывать размер массива. В соответствии с принципами структурного программирования, задача представлена в виде подзадач.
#include <stdio.h>//printf и scanf
#include <stdlib.h>
void PrintArray(double M[], int n{...})//смотреть выше
int SaveArray(double M[], int n, char const* fname);
int LoadArray(double M[], int maxn, char const* fname);
int SaveArrayBin(double M[], int n, char const* fname);
int LoadArrayBin(double M[], int maxn, char const* fname);
#define N 10
int main()
{
double B[N], A[N]={1,2,3,4,5,6,7,8,9,10};
int n=N,n1,n2;
printf(“This is my array\n”);
PrintArray(A,n);
SaveArray(A,n,”1Text.txt”);
printf(“Loaded from text\n”);
n1=LoadArray(B,N,”2Text.txt”);
PrintArray(B,n1);
//сохранение в двоичный файл
SaveArrayBin(B,n1,”2Bin.txt”);
printf(“Loaded from binary file\n”);
n2=LoadArrayBin(A,N,”2Bin.txt”);
PrintArray(A,n2);
SYSTEMPAUSE;
return(0);
}
SaveArray(double M[], int n, char const* fname);
{
FILE f=fopen(fname,”wt”);
if (f==NULL) return 0;
fprintf(f,”%d\n”,n);
for(i=0,i<n,i++)
fprintf(f,“%lf “,M[i]);
fclose(f);
return 1;
}
LoadArray(double M[], int maxn, char const* fname);
{
int n;
FILE f=fopen(fname,”rt”);
if (f==NULL) return -1;//совсем не получилось открытия
fscanf(“%d”,&n);
for(i=0,i<n,i++)
fprintf(f,“%lf “,&M[i]);
fclose(f);
return 1;
}
LoadArrayBin(double M[], int maxn, char const* fname);
{
FILE f=fopen(fname,”rb”);
if (f==NULL) return -1;
int n;
fread(&n, sizeof(int),1,f);
if(n>maxn) return(-1);
fread(M, sizeof(double),n,f);
if(feof(f)) return -1;
fclose(f);
return n;
}
SaveArrayBin(double M[], int n, char const* fname);
{
FILE f=fopen(fname,”wb”);
if (f==NULL) return 0;
fwrite(&n,sizeof(int),1,f);
fwrite(M,sizeof(double),n,f);
fclose(f);
return 1;
}