- •Дисциплина: технология программирования
- •Лабораторная работа №1
- •Результаты работы программы для данных типа float
- •Объяснение результатов
- •Программа решения задания 2
- •Результат работы программы
- •Лабораторная работа №3
- •Постановка задачи
- •Текст программы
- •Результат работы программы
- •Лабораторная работа №8
- •Постановка задачи
- •Текст программы
- •Результат работы программы
- •Лабораторная работа №11
- •Постановка задачи
- •Текст программы
- •Результат работы программы
Результат работы программы
Рис.9. Результат работы программы
Лабораторная работа №8
«Блоковый ввод-вывод»
Постановка задачи
Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое. Формирование, печать, добавление и удаление элементов оформить в виде функций. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций ввода/вывода.
Структура "Государство":
название;
столица;
численность населения;
занимаемая площадь.
Удалить все элементы, у которых численность меньше заданной, добавить элемент после элемента с указанным номером.
Текст программы
#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;
}
Результат работы программы
Рис.10. Загрузка данных из файла и удаление государств с меньшей площадью
Рис.11. Добавление новой записи и результат удаления
Рис.12. Результат работы программы
Лабораторная работа №9
«Строковый ввод-вывод»
Постановка задачи
1. Создать текстовый файл F1 не менее,
чем из 10 строк и записать в него информацию.
2. Задание варианта:
1) Скопировать в файл F2 только те строки из F1,
которые начинаются и заканчиваются на одну и ту же букву.
2) Подсчитать количество символов в F2.
Текст программы
#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;
}
//---------------------------------------------------------------------------
Результат работы программы
Рис.13. Ввод данных
Рис.14. Результат работы программы
Рис.15. Текстовый файл F1.txt Рис.16. Текстовый файл F2.txt
Лабораторная работа №10
«Динамические массивы»
Постановка задачи
Сформировать одномерный динамический массив. Удалить из него К элементов, начиная с заданного номера, добавить элемент с заданным ключом
Текст программы
#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;
}
