Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР ОАиП 2 семестр ФЗО 3 вариант

.docx
Скачиваний:
5
Добавлен:
24.12.2018
Размер:
33.79 Кб
Скачать

Вариант 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;

}