Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3_variant_po_TP.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
494 Кб
Скачать
☆
    1. Результат работы программы

Рис.9. Результат работы программы

  1. Лабораторная работа №8

«Блоковый ввод-вывод»

    1. Постановка задачи

Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое. Формирование, печать, добавление и удаление элементов оформить в виде функций. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций ввода/вывода.

  1. Структура "Государство":

  • название;

  • столица;

  • численность населения;

  • занимаемая площадь.

Удалить все элементы, у которых численность меньше заданной, добавить элемент после элемента с указанным номером.

    1. Текст программы

#include <iostream.h>

#include <conio.h>

#include <windows.h>

#include <stdio.h>

#include <fstream>

#include <iomanip.h>

/*Структура "Государство":

- название;

- столица;

- численность населения;

- занимаемая площадь.

Удалить все элементы,

у которых численность меньше заданной,

добавить элемент после элемента с указанным номером.*/

struct state //структура Государство

{ //создаем переменные

char name[25]; //содержит название государства

char capital[25]; //содержит название столицы

float number; //численность населения

float area; //площадь государства

};

//прототипы функций

int write1 (FILE *, state *); //запись в первый Файл

int write2 (FILE *, FILE *, state *,int); //запись отобранных данных во второй файл

int read1 (FILE *, state *,int); //чтение первого файла

int add (FILE *, state *,int); //добавление записи во второй файл и чтение его

int save (FILE *, FILE *, FILE *, state *,int);

int load (FILE *, FILE *, state *,int);

char* rus(const char* text);

int main(int argc, char* argv[])

{

FILE *f1; //указатель на начало первого файла

FILE *f2; //указатель на начало второго файла

state mas[10]; //создание массива структуры Государство

FILE *f3;

int q;

int n;

cout << rus("\t\t1 - загрузить список из файла\n\t\t2 - ввести список с экрана: ");

cin >> q;

if (q == 1)

{

f3 = fopen("fff.txt", "r"); //открываем файл, в котором записан счетчик

char buf [100]; //создаем буферную строку

fscanf(f3, "%s", buf); //считываем в буферную строку счетчик

n =atoi(buf); //записываем его в число

fclose(f3); //закрываем файл

n = read1 (f1, mas, n); //чтение первого файла

n = write2 (f1, f2, mas,n); //запись во второй файл

n = add (f2, mas,n); //добавление записи во второй файл и чтение его

n = save (f2, f1, f3, mas, n); //сохранение обработанного списка в первый файл

}

else if (q == 2)

{

n = write1 (f1, mas); //запись в первый Файл

n = read1 (f1, mas,n); //чтение первого файла

n = write2 (f1, f2, mas,n); //запись во второй файл

n = add (f2, mas,n); //добавление записи во второй файл и чтение его

n = save (f2, f1, f3, mas,n); //сохранение обработанного списка в третий файл

}

getch();

return 0;

}

char bufrus[256];

//русификация программы

char* rus(const char* text)

{

CharToOem(text,bufrus);

return bufrus;

}

//фукнция записи данных в первый файл

int write1 (FILE *f1, state *mas)

{

int i;

f1 = fopen("f.txt", "wb"); //открытие первого файла

if (f1 == NULL) //если при открытии возникает ошибка

exit(1);

int m =5; //то выходим из функции

for(i=0; i < m; i++) //ввод данных с экрана

{ //и запись их в первый файл

printf("%s #%i ",rus("Название государства "), i+1);

scanf("%s",&mas[i].name);

printf("%s #%i ",rus("Столица государства: "), i+1);

scanf("%s",&mas[i].capital);

printf("%s #%i ",rus("Численность населения: "), i+1);

scanf("%f",&mas[i].number);

printf("%s #%i ",rus("Занимаемая площадь: "), i+1);

scanf("%f",&mas[i].area);

fwrite(&mas[i], sizeof(state),1,f1);

}

fclose(f1); //закрытие первого файла

clrscr();

return m; //очистка экрана

}

//функция чтения первого файла

int read1 (FILE *f1, state *mas, int m)

{

int i;

f1 = fopen("f.txt", "rb"); //открытие первого файла

if (f1 == NULL) // если при открытии возникает

exit(2); //ошибка, то выходим из функции

i=0;

while(!feof(f1) && i<m) //считывание первого файла в массив

{

fread (&mas[i], sizeof(state),1,f1);

i++;

}

fclose(f1); //закрытие первого файла

for (i = 0; i < m; i++) //вывод данных из первого файла на экран

{

cout << rus("Название государства ")<< i+1 << setw(5) << mas[i].name;

cout << rus("\tСтолица государства ")<< i+1 << setw(10) << mas[i].capital << endl;

cout << rus("Численность населения ") << i+1 << setw(5) << mas[i].number;

cout << rus("\tЗанимаемая площадь ")<< i+1 << setw(10) << mas[i].area << endl << endl;

}

return m;

}

//функция записи отобранных данных во второй файл

int write2 (FILE *f1, FILE *f2, state *mas,int m)

{

float n;

int i = 0;

cout << rus("\nВведите площадь меньше которой надо удалить запись:");

cin >> n; //ввод площади (условие отбора данных)

f1 = fopen("f.txt", "rb"); //открытие первого файла

while(!feof(f1) && i<m) //считывание первого файла в массив

{

fread (&mas[i], sizeof(state),1,f1);

i++;

} //закрытие первого файла

fclose(f1);

clrscr(); //очистка экрана

f2 = fopen ("ff.txt", "wb"); //открытие второго Файла

int f =m;

for (i = 0; i < f; i++) //запись данных

{ //удовлетворяющих условию отбора

if (mas[i].area >= n) //во второй файл и вывод их на экран

{

cout << rus("\nНазвание государства ")<< i+1 << setw(10) << mas[i].name;

cout << rus("\tСтолица государства ")<< i+1 << setw(10)<< mas[i].capital << endl;

cout << rus("Численность населения ")<< i+1 << setw(10) << mas[i].number;

cout << rus("\tЗанимаемая площадь ")<< i+1 << setw(10) << mas[i].area << endl << endl;

fwrite(&mas[i], sizeof(state),1,f2);

}

else

m--;

}

fclose(f2); //закрытие второго файла

return m;

}

//функция добавления данных во второй файл

int add (FILE *f2, state *mas,int m)

{

int n, i;

cout << rus("\nВведите позицию, после которой хотите добавить запись: ");

cin >> n; //ввод позиции, на которую будет добавлена запись

f2 = fopen("ff.txt", "rb"); //открытие второго файла

if (f2 == NULL) // если при открытии файла возникает

exit(4); //ошибка, то выходим из функции

i=0;

while(!feof(f2) && i<m) //считывание второго файла в массив

{

fread (&mas[i], sizeof(state),1,f2);

i++;

}

fclose(f2); //закрытие второго файла

i--;

for ( ; i > n-1; i--) //сдвиг элементов массива

{ //для освобождение позиции

mas[i+1] = mas[i]; //для новой записи

}

m++;

printf(rus("Название государства: ")); //добавление новой записи

scanf("%s",&mas[n].name); //в массив

printf(rus("Столица государства: "));

scanf("%s",&mas[n].capital);

printf(rus("Численность населения: "));

scanf("%f",&mas[n].number);

printf(rus("Занимаемая площадь: "));

scanf("%f",&mas[n].area);

f2 = fopen ("ff.txt", "wb"); //открытие второго Файла

for (i = 0; i < m; i++) //запись данных

{

cout << rus("\nНазвание государства: ") << setw(10) << mas[i].name;

cout << rus("\tСтолица государства:") << setw(10)<< mas[i].capital << endl;

cout << rus("Численность населения:") << setw(10) << mas[i].number;

cout << rus("\tЗанимаемая площадь:") << setw(10) << mas[i].area << endl << endl;

fwrite(&mas[i], sizeof(state),1,f2);

}

fclose(f2);

f2 = fopen("ff.txt", "rb"); //открытие второго файла

if (f2 == NULL) //если при открытии возникает ошибка

exit(1); //то выходим из функции

i=0;

while(!feof(f2) && i<m) //считывание второго файла в массив

{

fread (&mas[i], sizeof(state),1,f2);

i++;

}

fclose(f2); //закрытие второго файла

clrscr(); //очистка экрана

for (i = 0; i < m; i++) //вывод данных из второго файла на экран

{

cout << rus("\nНазвание государства: ") << setw(10) << mas[i].name;

cout << rus("\tСтолица государства:") << setw(10) << mas[i].capital << endl;

cout << rus("\tЧисленность населения:") << setw(10) << mas[i].number;

cout << rus("\tЗанимаемая площадь:") << setw(10) << mas[i].area << endl << endl;

}

return m;

}

//функция сохранения списка в первый файл

int save (FILE *f2, FILE *f1,FILE *f3, state *mas,int m)

{

int i;

f2 = fopen("ff.txt", "rb"); //открытие второго файла

if (f2 == NULL) //если при открытии возникает ошибка

exit(1); //то выходим из функции

i = 0;

while(!feof(f2)&& i<m) //считывание второго файла в массив

{

fread (&mas[i], sizeof(state),1,f2);

i++;

}

fclose(f2); //закрытие второго файла

f1 = fopen("f.txt", "wb"); //открытие первого файла

if (f1 == NULL) //если при открытии возникает ошибка

exit(2); //то выходим из функции

for(i = 0; i < m; i++) //ввод данных с экрана

{ /* //и запись их в первый файл

printf(rus("Название государства: %s"), mas[i].name);

printf(rus("Столица государства: %s"), mas[i].capital);

printf(rus("Численность населения: %f"), mas[i].number);

printf(rus("Занимаемая площадь: %f"), mas[i].area);

*/

fwrite(&mas[i], sizeof(state),1,f1);

}

fclose(f1); //закрытие первого файла

f3 = fopen("fff.txt", "w");

fprintf(f3, "%i", m);

fclose(f3);

return m;

}

    1. Результат работы программы

Рис.10. Загрузка данных из файла и удаление государств с меньшей площадью

Рис.11. Добавление новой записи и результат удаления

Рис.12. Результат работы программы

  1. Лабораторная работа №9

«Строковый ввод-вывод»

    1. Постановка задачи

1. Создать текстовый файл F1 не менее,

чем из 10 строк и записать в него информацию.

2. Задание варианта:

1) Скопировать в файл F2 только те строки из F1,

которые начинаются и заканчиваются на одну и ту же букву.

2) Подсчитать количество символов в F2.

    1. Текст программы

#include <windows.h>

#include <iostream.h>

#include <conio.h>

#include <fstream>

#include <stdio.h>

#include <iomanip.h>

/*

1. Создать текстовый файл F1 не менее,

чем из 10 строк и записать в него информацию.

2. Задание варианта:

1) Скопировать в файл F2 только те строки из F1,

которые начинаются и заканчиваются на одну и ту же букву.

2) Подсчитать количество символов в F2.

*/

char* rus(const char* text);

int main(int argc, char* argv[])

{

FILE *f1; //создаем указатели на файлы

FILE *f2;

int i, s;

const int msize = 255; //создаем буферную строку заданного размера

char buf[msize];

f1 = fopen ("f1.txt","w"); //открываем файл

for(int i=0; i<10 ;i++) //и записываем в него строки

{

cout << rus("Введите строку№ ") << i+1 << endl;

cin >> buf;

buf[strlen(buf)] = '\n';

fprintf(f1,buf);

}

fclose (f1);

f1 = fopen ("f1.txt", "r"); //открываем первый файл для чтения

f2 = fopen ("f2.txt", "w"); //открываем второй файл для записи

while (fgets (buf, 255, f1) != NULL)

{ //пока не конец первого файла

int len = 0, key1 = 0, key2 = 0; //проверяем совпадают ли первая

len = strlen(buf); //и последняя буква строки

key1 = buf[0];

key2 = buf[len-2];

if (key1 == key2) //если да, то копируем строку

{ //во второй файл

fputs(buf, f2);

}

}

fclose(f2);

fclose(f1);

clrscr();

s = 0;

f2 = fopen ("f2.txt","r");

while(fgets (buf, msize, f2) != NULL)

{

printf (buf); //выводим второй файл на экран

s = strlen(buf) + s - 1; //считаем количество символов

} //через длину строки

fclose(f2);

cout << rus("\tСчет: ") << s;

getch();

return 0;

}

char bufrus[256];

char* rus(const char* text)

{

CharToOem(text,bufrus);

return bufrus;

}

//---------------------------------------------------------------------------

    1. Результат работы программы

Рис.13. Ввод данных

Рис.14. Результат работы программы

Рис.15. Текстовый файл F1.txt Рис.16. Текстовый файл F2.txt

  1. Лабораторная работа №10

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

    1. Постановка задачи

Сформировать одномерный динамический массив. Удалить из него К элементов, начиная с заданного номера, добавить элемент с заданным ключом

    1. Текст программы

#include <windows.h>

#include <iostream.h>

#include <conio.h>

#include <time.h>

/*

1. Ввести размер массива;

2.Сформировать массив с помощью операции new или библиотечных функций malloc (calloc);

3.Заполнить массив (можно с помощью датчика случайных чисел);

4.Выполнить задание варианта, сформировать новый массив(ы)-результат(ы);

5.Напечатать массив(ы)-результат(ы);

6.Удалить динамические массивы с помощью операции delete или библиотечной функции free.

3. Сформировать одномерный массив.

Удалить из него К элементов, начиная с заданного номера,

добавить элемент с заданным ключом

*/

void print(int *mas, int n);

int *del(int *mas,int n,int k, int m);

char* rus(const char* text);

int main()

{

srand(time(NULL));

int *mas; //создаем массив

cout << rus("Введите размер массива: ");

int n; //задаем размерность массива

cin >> n;

mas = new int[n]; //выделяем память под массив

for(int i=0; i<n; i++) //заполняем массив случайными числами

mas[i] = rand()%20;

print(mas,n); //распечатываем массив

int k,m;

cout << rus("\nВведите позицию: ");

cin >> k; //получаем позицию

cout << rus("Введите количество элементов: ");

cin >> m; //и количество элементов

int *bud = new int[n-m]; //создаем буферный массив

bud = del(mas,n,k,m); //записываем в него массив после удаления

n -= m; //элементов и распечатываем его

print(bud,n);

cout << rus("\nВведите ключ: ");

cin >> k; //получаем ключ (значение элемента)

int *bad = new int[n+1]; //создаем массив

for(int i =0; i<n;i++) //и копируем в него буферный массив

bad[i] = bud[i];

bad[n] = k; //добавляем в конец новый элемент

print(bad,n+1); //распечатываем полученный массив

getch();

return 0;

}

//русификация программы

char bufrus[256];

char* rus(const char* text)

{

CharToOem(text,bufrus);

return bufrus;

}

//функция распечатки массива

void print(int *mas, int n)

{

for (int i = 0; i < n; i++) //выводим массив на экран поэлементно

cout << rus("Элемент№ ") << i+1<< " " << mas[i] << endl;

}

//функция удаления элементов из массива

int *del(int *mas,int n,int k, int m)

{

if(k+m-1 > n) //если сумма номера позиции

{ //и количества элементов больше

cout << "ERROR\n"; //размерности массива

return 0; //то выводим ошибку

}

int *buf = new int[n-m]; //создаем буферный массив

for(int i=0; i<k-1; i++) //копируем в него элементы из исходного

{ //до k-той позиции

buf[i] = mas[i];

}

for(int i=k+m-1; i<n; i++) //начиная с k-той позиции

{ //копируем в буферный массив

buf[i-m] = mas[i]; //остальные элементы

}

return buf;

}

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