Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
I_semestr.doc
Скачиваний:
6
Добавлен:
23.09.2019
Размер:
356.35 Кб
Скачать

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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]