Смекни!
smekni.com

Методические указания к лабораторным работам по курсу «Программирование на языках высокого уровня» (стр. 6 из 7)

ch=getch();

}

while (ch != 'y');

fclose(tf);

}

void print(FILE *tf)

{ int i;

clrscr();

tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения

i=1;

fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1

while (!feof(tf))

{ printf("\n %3d tovar %10s cena %6.2f kolic %4d",i,t1.name,t1.c,t1.kol);

fread(&t1,sizeof(t1),1,tf);

i++;

}

getch();

}

void app(FILE *tf)

{ char ch;

tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления

clrscr();

printf("\n Ввод товаров \n");

do

{ printf("\n название: "); scanf("%s",t1.name);

printf(" цена: "); scanf("%f",&t1.c);

printf(" количество: "); scanf("%d",&t1.kol);

fwrite(&t1,sizeof(t1),1,tf);

printf(" Закончить? y/n ");

ch=getch();

}

while (ch != 'y');

fclose(tf);

}

void find(FILE *tf)

{ char c,tov[10];

long int i;

tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи

clrscr();

puts(" Название искомого товара: ");

gets(tov);

fread(&t1,sizeof(t1),1,tf);

while (!feof(tf))

{ if (strcmp(t1.name,tov)==0)

{ printf(" tovar %10s cena %6.2f kolic %d",t1.name,t1.c,t1.kol);

printf("\n изменить? y/n ");

c=getch();

if (c=='y')

{ printf("\n количество: ");scanf("%d",&t1.kol);

printf("\n цена: ");scanf("%f",&t1.c);

i=sizeof(t1);

fseek(tf,-i,1); // возврат на sizeof(t1) байт назад

fwrite(&t1,sizeof(t1),1,tf); // запись изменённой структуры на прежнее место

}

}

fread(&t1,sizeof(t1),1,tf);

}

fclose(tf);

}

3. ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенную программу.

3.2. Используя функции и режим меню, создать файл из 10 записей, просмотреть файл, добавить в файл новую информацию и, при­меняя режим прямого доступа, выполнить задание по своему варианту.

Варианты заданий

1. Запись имеет вид: фамилия, пол, год рождения и рост. Вывести данные о самом высоком спортсмене.

2. Запись имеет вид: название вуза, число студентов, количес­тво факультетов. Добавить в конец файла информацию о трех новых вузах и посчитать общее число студентов.

3. Запись имеет вид: название издания, газеты или журнала, стоимость одного экземпляра, количество экземпляров в год. Вывести на печать информацию о самом дешевом издании.

4. Запись имеет вид: фамилия студента, номер зачетной книжки, 4 оценки за экзамен. Выводить информацию о всех двоечниках и корректировать ее.

5. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Поменять местами в файле записи о первых двух спортсменах. *

6. Запись имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.

7. Запись имеет вид: название инструмента, число, месяц и год изготовления. Вывести на печать информацию об инструменте с самым большим сроком использования и выполнить корректировку этой записи.

8. Запись имеет вид: номер читательского билета, автор книги, название, дата заказа. Вывести на экран содержимое файла. Поменять местами первую и последнюю записи в файле.*

9. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.

10. Запись имеет вид: фамилия, количество вещей, общий вес. Удалите из файла сведения о багаже, общий вес вещей в котором меньше, чем 10 кг.

11. Запись имеет вид: название команды, количество набранных очков, фамилии капитанов. Вывести на печать список в порядке набранных мест.

12. Запись имеет вид: марка видеомагнитофона, стоимость, количество. Напечатать информацию об имеющихся в продаже магнитофонах. При покупке их количество соответственно уменьшается. Предусмотреть удаление информации о видеомагнитофонах, количество которых равно нулю.

* При обмене введите промежуточную переменную типа структура.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Режимы доступа к файлам.

4.2. Назначение функций fseek, ftell.

4.3. Можно ли взаимозаменять функции fscanf и fread; fprint и fwrite ?

4.4. Привести пример корректировки К-той записи в файле прямого доступа.

Лабораторная работа № 11

Динамические массивы

1. ЦЕЛЬ РАБОТЫ: приобретение практических навыков создания и обработки одномерных и многомерных динамических массивов.

2. ОСНОВНЫЕ ПОНЯТИЯ

При определении статического массива: тип имя_массива [количество_элементов] , имя_массива становится указателем на область памяти, выделяемой для размещения элементов массива. Количество элементов должно быть константой. Таким образом, размеры памяти, выделяемой под массив, заданы в определении массива. Но иногда нужно, чтобы размеры памяти были не фиксированными, а выделялись в ходе выполнения программы при решении конкретной задачи.

Формирование массивов с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти. Эти средства описаны в файле <alloc.h>. Функции malloc() и calloc() динамически выделяют память в соответствии со значениями их параметров и возвращают адрес начала выделенного участка памяти. Тип возвращаемого значения указателя void *. Его можно преобразовать к указателю любого типа с помощью явного приведения типа. Функция free(void *) освобождает память, выделенную с помощью malloc() или calloc().

int *p;

p=(int *)malloc(size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером size байт.

p=(int *)calloc(n, size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером n*size байт.

free(p); //Освобождает выделенную по адресу p память. Преобразование указателя любого типа к типу void * осуществляется автоматически, так что в качестве фактического параметра можно подставить указатель любого типа без явного приведения типов.

Пример формирования одномерного динамического массива

//lab11_1

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

main()

{ float *p,d;

int i,n;

printf("&bsol;n input n:");

scanf("%d",&n);

p=(float *)malloc(n*sizeof(float));

for (i=0;i<n;i++)

{printf("x[%d]=",i);

scanf("%f",&d);

p[i]=d;

}

for (i=0;i<n;i++)

{ if (i%4==0) printf("&bsol;n");

printf("&bsol;t x[%d]=%6.2f",i,p[i]);

}

free(p);

getch();

}

Доступ к участкам выделенной памяти выполняется с помощью операции индексирования: p[i].

Каждый элемент массива может быть, в свою очередь, массивом. Именно так конструируются динамические многомерные массивы. Рассмотрим алгоритм создания и обработки двумерного массива.

1. Определяем указатель на массив указателей , задающий адреса начала строк матрицы: тип **uk.

2. Вводим размеры матрицы n,m.

3. Создаём динамический массив указателей на указатели начала строк : uk=(тип **)malloc(n*sizeof(тип *));

4. В цикле выделяем память под n массивов – строк по m элементов в каждом: for (i=0;i<n;i++) uk[i]=(тип *)malloc(m*sizeof(тип));

5. Обработка массива (работа с индексированными элементами uk[i][j]).

6. В цикле освобождаем память, занятую под n массивов – строк : for (i=0;i<n;i++) free(uk[i]);

7. Освобождаем память, занятую под массив указателей : free(uk).

Пример обработки двумерного динамического массива

Составить программу, создающую динамическую матрицу размером n*n, заполнить матрицу случайными числами. Вычислить сумму каждой строки и поместить суммы строк в одномерный динамический массив.

//lab11_2

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

void main()

{ int n,j,i;

float ** matr; float * mass; // Объявляем matr - указатель на массив указателей и //mass – указатель на одномерный массив

clrscr();

printf("Введите размер квадратной матрицы n: "); scanf("%d",&n);

mass=(float *)malloc(n*sizeof(float )); // Выделяем память под одномерный массив

if (mass==NULL)

{ puts("не создан динамический массив!");

return;}

matr=(float **)malloc(sizeof(float *)*n); //Выделяем память под массив указателей

if (matr==NULL)

{ puts("не создан динамический массив!");

return;}

randomize();

for (i=0;i<n;i++)

{ matr[i]=(float *)malloc(sizeof(float)*n); // Выделяем память под i-ю строку

if (matr[i]==NULL)

{ puts("не создан динамический массив!");

return;}

for (j=0;j<n;j++) matr[i][j]=random(100);

}

for (i=0;i<n;i++)

{ mass[i]=0;

for (j=0;j<n;j++)

mass[i]+=matr[i][j];

}

for (i=0;i<n;i++)

{ for (j=0;j<n;j++)

printf("&bsol;t%6.2f",matr[i][j]);

printf("&bsol;n");

}

for (i=0;i<n;i++)

printf("&bsol;n сумма %d строки %8.2f",i,mass[i]);

for (i=0;i<n;i++)

free(matr[i]); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

free(mass); // Освобождаем память массива сумм

getch();

}

3. ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенные программы.

3.2. Создать двумерный динамический массив и выполнить задание по своему варианту.

Варианты заданий

1. Даны матрица A размером m*n и вектор В размером m. Записать на главную диагональ элементы вектора, а в вектор - элементы главной диагонали.

2. Выбрать максимальный элемент матрицы С (размер m*n), элементы четных строк разделить на максимальный элемент, а к элементам нечетных прибавить максимальный элемент.

3. Найти минимальный элемент матрицы С (размер m*n), и поменять его местами с первым элементом.

4. Дана матрица Е размером m*n. Вычислить суммы элементов каждого столбца. Определить наибольшее значение этих сумм и номер соответствующего столбца.

5. В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество нулевых элементов в матрице .

6. Даны две матрицы А и В одинаковой размерности m*n. Получить матрицу

C = max (a i j, b i j ), и матрицу D = min (a i j, b i j).

7. Дана матрица Р размером m*n . Найти сумму минимальных элементов каждого столбца матрицы.

8. Даны матрицы: А размером m*k и В размером k*n.Получить матрицуС=A*В.

9. Дана матрица К размером m*n. Вычислить сумму минимальных элементов каждого столбца.

10. Дана матрица С размером m*n. Упорядочить эту матрицу по возрастанию элементов в каждом столбце.

11. Дан одномерный массив A из m элементов. Вводится число k (k<m). Получить из А матрицу, по k элементов в строке. Недостающие элементы заменить 0.

12. В матрице Т размером m*k переставить элементы в строках так, чтобы по диагонали они были упорядочены по возрастанию.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Отличия динамического массива от статического.

4.2. Как создать одномерный динамический массив?