КР ОАиП 2 семестр ФЗО 3 вариант
.docxВариант 3
Задача 1.
Напишите программу «Реки мира». Информация о реках должная содержаться в записях со следующими полями :название, местоположение, протяженность, максимальная глубина, площадь водосборного бассейна, годовой сток. Массив должен содержать не менее 10 записей. Организовать ввод о реках с клавиатуры. По запросу программа должна выдавать самую глубокую реку, самую протяженную и т.д., а также должна быть возможность группировать запросы, например, выдавать самую протяженную реку с максимальным годовым стоком.
Код программы:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
struct country //описание структуры
{
char c_name[32];
char capital[32];
int popul;
int area;
} state;
int sch = 0;
void func_srch_str(struct country * state, char * search, int len); // прототип функции поиска среди строк
void func_srch_int(struct country * state, int * search, int len); // прототип функции поиска среди чисел
void func_prnt_struct(struct country * state, int i); // прототип функции вывода на печать
int cmp_1(const void *a, const void *b); // прототип функции сортировки строк
int cmp_2(const void *a, const void *b); // прототип функции сортировки строк
void func_sort(struct country * state, int * search, int len);// прототип функции сортировки целых чисел
void vivod(struct country *state, int len); // прототип функции вывода
int del(struct country * state, int delet, int struc_count); //прототип функции удаления элемента массива структур
void change(struct country * state); //прототип функции изменения элемента массива структур
int main() {
system("chcp 1251 > nul");
int struc_count = 0, i, search_item, search_item_1, delet, size;
printf("Введите размер массива\n");
scanf("%d", &size);
country*state;
state = (country*)malloc(size * sizeof(country)); //выделение динамической памяти под массив структур
do {
printf(" Страна %d\n%-*s", struc_count + 1, 25, "Название:");
scanf("%s", &state[struc_count].c_name);
printf("%-*s", 25, "Столица:");
scanf("%s", &state[struc_count].capital);
printf("%-*s", 25, "Численность населения :");
scanf("%d", &state[struc_count].popul);
printf("%-*s", 25, "Площадь:");
scanf("%d", &state[struc_count].area);
++struc_count;
printf("1 - Продолжить, 0 - Выход) ?: ");
scanf("%d", &i);
}while (i);
// вывод значений
vivod(state, struc_count);
// Поиск
printf("\nПоиск по:\n1-Название, 2-Столица, 3 - Население, 4 - Площадь... ?: ");
scanf("%d", &search_item);
printf("Введите значение: ");
switch (search_item) {
case 1: func_srch_str(state, state[0].c_name, struc_count); break;
case 2: func_srch_str(state, state[0].capital, struc_count); break;
case 3: func_srch_int(state, &state[0].popul, struc_count); break;
case 4: func_srch_int(state, &state[0].area, struc_count); break;
};
// Сортировка
printf("\nСортировка по:\n1-Название, 2-Столица, 3 - Население, 4 - Площадь... ?: ");
scanf("%d", &search_item_1);
printf("Введите значение: ");
switch (search_item_1) {
case 1: qsort(state, struc_count, sizeof(struct country), cmp_1);
vivod(state, struc_count);
break;
case 2: qsort(state, struc_count, sizeof(struct country), cmp_2);
vivod(state, struc_count);
break;
case 3: func_sort(state, &state[0].popul, struc_count);
vivod(state, struc_count);
break;
case 4: func_sort(state, &state[0].area, struc_count);
vivod(state, struc_count);
break;
};
// Удаление структуры из массива структур
printf("\nВведите номер удаляемого элемента:\n");
scanf("%d", &delet);
struc_count = del(state, delet, struc_count);
vivod(state, struc_count);
change(state);//Изменения массива структур
vivod(state, struc_count);
free(state);
system("pause");
return 1;
}
void vivod(struct country *state, int struc_count) //Описание функции вывода массива структур
{
printf("\n");
for (int i = 0; i < struc_count; i++)
{
printf(" Страна %d\n", i + 1);
printf("Название %s\n", state[i].c_name);
printf("Столица %s\n", state[i].capital);
printf("Население %d\n", state[i].popul);
printf("Площадь %d\n", state[i].area);
}
}
void func_srch_int(struct country * state, int * search, int len) { //Описание функции поиска по целому типу (по цифрам)
int val, mem_len;
mem_len = (sizeof(state->capital) + sizeof(state->c_name) + sizeof(state->popul) + sizeof(state->area)) / sizeof(int);
scanf("%d", &val);
for (int i = 0; i < len; ++i) {
if (val == *(search + (i * mem_len))) {
func_prnt_struct(state, i);
}
}
}
void func_srch_str(struct country * state, char * search, int len) { //Описание функции поиска по символьному типу (по названиям)
int mem_len;
char val[32];
mem_len = (sizeof(state->capital) + sizeof(state->c_name) + sizeof(state->popul) + sizeof(state->area));
scanf("%s", val);
for (int i = 0; i < len; ++i) {
if (!strcmp(val, (search + (i * mem_len)))) {
func_prnt_struct(state, i);
}
}
}
void func_prnt_struct(struct country * state, int i) { //Описание функции вывода отдельной строки структуры
printf("Страна: %s\n", state[i].c_name);
printf("Столица: %s\n", state[i].capital);
printf("Население: %d\n", state[i].popul);
printf("Площадь: %d\n", state[i].area);
}
int cmp_1(const void *a, const void *b) { //Описание функции сравнения названий государств
return strcmp(((struct country*)a)->c_name, ((struct country*)b)->c_name);
}
int cmp_2(const void *a, const void *b) { //Описание функции сравнения названий столиц
return strcmp(((struct country*)a)->capital, ((struct country*)b)->capital);
}
void func_sort(struct country * state, int * search, int len) { //Описание функции сортировки
int mem_len;
struct country buffer;
mem_len = (sizeof(state->capital) + sizeof(state->c_name) + sizeof(state->popul) + sizeof(state->area)) / sizeof(int);
for (int i = 0; i < len; ++i)
for (int j = i; j < len; ++j)
{
if (state[i].popul > state[j].popul)
{
buffer = state[i];
state[i] = state[j];
state[j] = buffer;
}
}
}
int del(struct country * state, int delet, int struc_count) //Описание функции удаления
{
for (int i = (delet - 1); i < struc_count; ++i)
state[i] = state[i + 1];
return (struc_count = struc_count - 1);
}
void change(struct country * state) //Описание функции изменения
{
int c;// Номер записи, которую необходимо изменить
int per;
printf("\nВведите номер записи\n");
scanf("%d", &c);
do
{
printf("\nВведите:\n");
printf("1-для изменения названия государства\n");
printf("2-для изменения столицы государства\n");
printf("3-для изменения численности населения\n");
printf("4-для изменения площади государства\n");
printf("5-для прекращения\n");
scanf("%d", &per);
switch (per)
{
case 1: printf("\nВведите новое название государства\n");
scanf("%s", state[c - 1].c_name);
break;
case 2: printf("\nВведите новое название столицы\n");
scanf("%s", state[c - 1].capital);
break;
case 3: printf("\nВведите новую численность населения\n");
scanf("%d", &state[c - 1].popul);
break;
case 4: printf("\nВведите новую площадь государства\n");
scanf("%d", &state[c - 1].area);
break;
case 5: return;
}
} while (1);
}
Задача 2.
Создайте файл, компонентами которого являются целые числа, первым элементом является размерность квадратной матрицы, а остальные элементы образуют строки этой матрицы. Перепишите в другой файл данную матрицу с вычеркнутыми i-ой строкой и j-ым столбцом. Используйте только файловые операции. Исходный файл считать файлом прямого доступа, а выходной - последовательного доступа.
Код программы:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
int main()
{
system("chcp 1251 > nul");
int **a;
int n, i, j, k, t;
FILE*file1 = fopen("f1.txt", "wt"); //Запись размера матрицы и чисел в файл f1,
файл открыт в режиме для записи
if (!(file1 = fopen("f1.txt", "wt")))
{
printf("Nevozmozno otkrit' fail");
return 0;
}
fputs("4 34 56 78 25 93 54 85 73 98 65 45 12 16 15 14 25\n", file1); // Ввод
элементов
fclose(file1);
FILE*file2 = fopen("f1.txt", "rt"); //Открытие этого же файла в режиме "для
чтения"
if (!(file2 = fopen("f1.txt", "rt")))
{
printf("Nevozmozno otkrit' fail");
return 0;
}
FILE*file3 = fopen("g1.txt", "wt"); //Открытие файла g1 для записи
if (!(file3 = fopen("g1.txt", "wt")))
{
printf("Nevozmozno otkrit' fail");
return 0;
}
fscanf(file2, "%d", &n); //Считывание из файла f1 первой цифры - размер квадратной матрицы
a = (int**)malloc(n * sizeof(int*)); //Выделение динамической памяти для массива
for (i = 0; i < n; i++)
{
a[i] = (int*)malloc(n * sizeof(int));
for (j = 0; j < n; j++)
{
fscanf(file2, "%d", &a[i][j]); //Считывание чисел из файла f1
printf("a[%d][%d]=%d\n", i, j, a[i][j]); //вывод на экран
}
}
printf("Введите номер удаляемой строки\n");
scanf("%d", &k);
for (i = k; i < n - 1; ++i) // Удаление i-ой строки
{
for (j = 0; j < n; ++j)
{
a[i][j] = a[i + 1][j];
}
}
a = (int**)realloc(a, i* sizeof(int*)); // Изменение размеров
динамического массива
for (i = 0; i < n-1; i++) //Вывод массива на экран
for (j = 0; j <n; j++)
{
printf("a[i][j]=%d\n", a[i][j]);
}
printf("Введите номер удаляемого столбца\n");
scanf("%d", &t);
for (i = 0; i<n-1; i++) // Удаление j-ого столбца
for (j = t; j < n - 1; j++)
{
a[i][j] = a[i][j + 1];
}
a = (int**)realloc(a, j * sizeof(int*)); // Изменение размеров динамического
массива
for (i = 0; i < n-1; i++) //Вывод массива на экран
for (j = 0; j < n-1; j++)
{
printf("a[i][j]=%d\n", a[i][j]);
}
for (i = 0; i < n - 1; i++) //Вывод массива в файл
{
for (j = 0; j < n - 1; j++)
{
fprintf(file3, "%d\n", a[i][j]);
}
}
for (i = 0; i < n-1; i++) //Освобождение динамической памяти
free(a[i]);
free(a);
fclose(file2);
fclose(file3);
system("pause");
return 1;
}