include stdlib include string include stdio include time define NAME_L

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#define NAME_LENGTH 32
struct town {
char name[NAME_LENGTH];
int population;
int dx;
};
void fill(char* name, char* value) {
memset(name, 0, sizeof(char)*NAME_LENGTH); //обнуление name
int length = strlen(value);
if (length > NAME_LENGTH) length = NAME_LENGTH;
for (int i = 0; i < length; i++) {
name[i] = value[i];
}
}
bool less(char* str1, char* str2) {
int length;
if (strlen(str1) < strlen(str2)) length = strlen(str1);
else length = strlen(str2);
for (int i = 0; i < length; i++) {
if (str1[i] > str2[i]) return false;
if (str1[i] < str2[i]) return true;
}
return strlen(str1) < strlen(str2);
}
int main() {
//инициализация рандома
srand(time(NULL));
//данные по городам
struct town data[10];
fill(data[0].name, "Moscow"); data[0].population = rand(); data[0].dx = rand() % 10000 - 5000;
fill(data[1].name, "St. Petersburg"); data[1].population = rand(); data[1].dx = rand() % 10000 - 5000;
fill(data[2].name, "Omsk"); data[2].population = rand(); data[2].dx = rand() % 10000 - 5000;
fill(data[3].name, "Penza"); data[3].population = rand(); data[3].dx = rand() % 10000 - 5000;
fill(data[4].name, "Rostov"); data[4].population = rand(); data[4].dx = rand() % 10000 - 5000;
fill(data[5].name, "Ryazan"); data[5].population = rand(); data[5].dx = rand() % 10000 - 5000;
fill(data[6].name, "Vladimir"); data[6].population = rand(); data[6].dx = rand() % 10000 - 5000;
fill(data[7].name, "Akhtubinsk"); data[7].population = rand(); data[7].dx = rand() % 10000 - 5000;
fill(data[8].name, "Pushchino"); data[8].population = rand(); data[8].dx = rand() % 10000 - 5000;
fill(data[9].name, "Neftekamsk"); data[9].population = rand(); data[9].dx = rand() % 10000 - 5000;
//печать в файл
FILE* file = fopen("binary_data", "wb");
fwrite(data, sizeof(town), 10, file); //data-указатель на область данный, sizeof(town)-размер одной структуры в байтах
fclose(file);
//чтение из файла
file = fopen("binary_data", "rb");
fread(data, sizeof(town), 10, file);
fclose(file);
//сортировка прочитанных данных
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 9-i; j++) {
if (less(data[j+1].name, data[j].name)) {
struct town buf = data[j];
data[j] = data[j+1];
data[j+1] = buf;
}
}
}
//печать на экран отсортированного массива
printf("Name\t\tpopulation\tincrement\n");
for (int i = 0; i < 10; i++) {
if (strlen(data[i].name) < 8) //красивое форматирование, если имя города короткое, добавляем еще один знак табуляции
printf("%s\t\t%d\t%d\n", data[i].name, data[i].population, data[i].dx);
else
printf("%s\t%d\t%d\n", data[i].name, data[i].population, data[i].dx);
}
//печать городов с положительным приростом населения
printf("\nPositive increment of population\n");
for (int i = 0; i < 10; i++) {
if (data[i].dx > 0) printf("%s\n", data[i].name);
}
//... с отрицательным приростом
printf("\nNegative increment of population\n");
for (int i = 0; i < 10; i++) {
if (data[i].dx < 0) printf("%s\n", data[i].name);
}
return 0;
}