Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <strings.h>
- #define MAXLEN 40 //ограничение на длину графы в структуре.
- #define READLEN 300 //ограничение на длину строки для fgets (char *fgets(char *str, int num, FILE *stream))
- typedef struct student {
- char first[MAXLEN];
- char second[MAXLEN];
- char univer[MAXLEN];
- char fac[MAXLEN];
- char dep[MAXLEN];
- int age, course, group;
- char city[MAXLEN];
- } stt;
- struct town {
- char name[MAXLEN];
- int stud, bach, mag;
- };
- struct kafedra {
- char name[MAXLEN];
- int stud, bach, mag;
- };
- struct faculty {
- char name[MAXLEN];
- int kaf_num, stud, bach, mag;
- struct kafedra kaf;
- };
- struct univ {
- char name[MAXLEN];
- int fac_num, kaf_num, stud, bach, mag;
- struct faculty fac;
- };
- //обмен структур в массиве
- void swap (stt *i, stt *j) { //через указатели должно работать лучше
- stt temp;
- temp = *i;
- *i = *j;
- *j = temp;
- }
- int main()
- {
- FILE *fp = fopen("students_1.txt", "r"); //откуда считываем
- FILE *ff = fopen("result_1.txt", "w"); //куда записываем результаты
- if(NULL == fp) {
- printf("cannot open file\n");
- exit(1);
- }
- fprintf(ff, "File:RDY\n");
- int i, j, stud_num;
- i = 0; stud_num = 0;
- char str[READLEN];
- while (!feof(fp)) if (fgets(str, READLEN, fp)) stud_num++; //считаем количество строк в файле. это и есть кол-во студентов
- rewind(fp); //возврат каретки
- struct student man[stud_num];
- int bachelors, magisters, eldest;
- bachelors = 0; magisters = 0;
- char c;
- while ((c = fgetc(fp)) != EOF) if (' ' == c) c = '-'; //если наткнулись на пробел (допустим, в названии вуза) то меняем его на любой другой символ. например, '-'
- rewind(fp); //возврат каретки
- fprintf(ff, "Underlined:RDY\n");
- while (!feof(fp)) {
- if (fgets(str, READLEN, fp)) { //если удалось считать строку
- for (j = 0; j < strlen(str); j++) if (';' == str[j]) str[j] = ' '; //меняем запятые на пробелы т.к пробел это 'стоп-сигнал' для scanf
- sscanf(str, "%s %s %s %s %s %d %d %d %s", man[i].first, man[i].second, man[i].univer,
- man[i].fac, man[i].dep, &man[i].age, &man[i].course, &man[i].group, man[i].city); //запись в структуры
- if (5 > man[i].course) { //заодно сразу считаем бакалавров-магистров
- bachelors++;
- } else {
- magisters++;
- }
- i++;
- }
- }
- fprintf(ff, "Spaced:RDY\n");
- fprintf(ff, "Add_to_struct:RDY\n\n\n");
- //===========LEVEL1===========
- fprintf(ff, "Total number of students:%d\n", stud_num);
- eldest = man[0].age; //в качестве старшего выбираем возраст первого
- for (i = 0; i < stud_num; i++) if (man[i].age > eldest) eldest = man[i].age; //если возраст очередного больше самого старшего на данный момент то обновляем возраст стршего
- fprintf(ff, "Bachelors:%d / Magisters:%d\n", bachelors, magisters);
- for (i = 0; i < stud_num - 1; i++) {
- for (j = i + 1; j < stud_num; j++) {//пузырьком проходим по массиву
- if (0 == strcmp(man[i].second, man[j].second) && 0 < strcmp(man[i].first, man[j].first)) {
- swap(&man[i], &man[j]); //если совпали фамилии но не совпали имена
- } else {
- if (0 < strcmp(man[i].second, man[j].second)) swap(&man[i], &man[j]); //если не совпали фамилии
- }
- }
- }
- fprintf(ff, "\nAlphabetical sorting:\n");
- for (i = 0; i < stud_num; i++) fprintf(ff, "\t%s %s\n", man[i].second, man[i].first); //выводим отсортированный список
- printf("=LVL1_RDY=\n");
- printf("flag0\n");
- //===========LEVEL2===========
- fprintf(ff, "\nEldest student's age:%d\n\nEldest students:\n", eldest);
- for (i = 0; i < stud_num; i++) if (man[i].age == eldest) //проходя по массиву выводим всех у кого "старший" возраст
- fprintf(ff, "%d)%s %s, %d\n\t%s %s\n\tfaculty:%s course:%d group:%d\n\t%s\n\n",j , man[i].second, man[i].first, man[i].age, man[i].univer, man[i].fac, man[i].dep, man[i].course, man[i].group, man[i].city);
- printf("=LVL2_RDY=\n");
- //===========LEVEL3===========
- int city_num = 0, mark, k = 0;
- struct town cities[city_num];
- printf("flag1\n");
- for (i = 0; i < stud_num; i++) { //максимум городов столько же сколько и студентов
- for (mark = 0, j = 0; j < i; j++) { //идем каждый раз с самого начала массив студентов до текущей записи
- if (0 == strcmp(man[i].city, man[j].city)) { //и если совпали города то делаем отметку и выходим
- mark++;
- break;
- }
- }
- if (0 == mark) { //если отметки не было
- strcpy(cities[k].name, man[i].city); //то копируем в массив городов название очередного города
- city_num++;
- k++;
- }
- }
- fprintf(ff, "Number of cities:%d\n\n", city_num);
- for (i = 0; i < city_num; i++) {
- cities[i].stud = 0; cities[i].bach = 0; cities[i].mag = 0; //в массиве структур "города" обнуляем эти поля для всех городов
- }
- //printf("flag3\n");
- for (i = 0; i < city_num; i++) {
- for (j = 0; j < stud_num; j++) {
- if (0 == strcmp(cities[i].name, man[j].city)) {
- if (5 > man[j].course) { //аналогично проходим по массиву увеличивая бакалавров/магистров i-го города
- cities[i].bach++;
- } else {
- cities[i].mag++;
- }
- cities[i].stud++; //и общее число студентов в i-ом городе
- }
- }
- }
- //printf("flag4\n");
- fprintf(ff, "Distribution by cities:\n");
- for (i = 0; i < city_num; i++) //для каждого города выводим название и количество бак/маг/студ
- fprintf(ff, "%s:\n\ttotal students:%d\n\tbachelors:%d / magisters:%d\n\n", cities[i].name, cities[i].stud, cities[i].bach, cities[i].mag);
- int most_stud = cities[0].stud, most_bachs = cities[0].bach, most_mags = cities[0].mag;
- //printf("flag5\n");
- for (i = 1; i < city_num; i++) { //аналогично поиску старшего студента ищем максимум среди бак/маг/студ
- if (cities[i].stud > most_stud) most_stud = cities[i].stud;
- if (cities[i].bach > most_bachs) most_bachs = cities[i].bach;
- if (cities[i].mag > most_mags) most_mags = cities[i].mag;
- }
- //printf("flag6\n");
- for (i = 0; i < city_num; i++) { //выводим
- if (cities[i].stud == most_stud) fprintf(ff, "Most students from %s\n", cities[i].name);
- if (cities[i].bach == most_bachs) fprintf(ff, "Most bachelors from %s\n", cities[i].name);
- if (cities[i].mag == most_mags) fprintf(ff, "Most magisters from %s\n", cities[i].name);
- }
- fprintf(ff, "\nAverage num of students:%d\n", stud_num / city_num); //банально считаем ср. арифм
- fprintf(ff, "Avg num of bachelors:%d / magisters:%d\n\n", bachelors / city_num, magisters / city_num);
- printf("=LVL3_RDY=\n");
- //===========LEVEL4===========
- /*struct univ inst[stud_num];
- int inst_num;
- inst_num = 0; k = 0;
- for (i = 0; i < stud_num; i++) {
- for (mark = 0, j = 0; j < i; j++) {
- if (0 == strcmp(man[i].univer, man[j].univer)) {
- mark++;
- break;
- }
- }
- if (0 == mark) {
- strcpy(inst[k].name, man[i].univer);
- inst_num++;
- k++;
- }
- }
- fprintf(ff, "Number of universities:%d\n\n", inst_num);*/
- printf("=LVL4_NOT-RDY\n");
- /*
- for (i = 0; i < city_num; i++) {
- inst[i].stud = 0; inst[i].bach = 0; inst[i].mag = 0;
- inst[i].fac_num = 0; inst[i].kaf_num = 0;
- }*/
- /*if (5 > man[j].course) {
- inst[i].bach++;
- } else {
- inst[i].mag++;
- }
- inst[i].stud++;*/
- /* for (i = 0; i < inst_num; i++) {
- printf("curr univ=%s", inst[i].name);
- for (j = 0; j < stud_num; j++) {
- printf("\t%s\n", inst[j].name);
- if (0 == strcmp(inst[i].name, man[j].univer)) {
- for (k = 0; k < stud_num; k++) {
- printf("\t%s vs %s\n", inst[i].fac.name, man[k].fac);
- if (0 == strcmp(inst[i].fac.name, man[k].fac)) {
- mark++;
- break;
- }
- }
- if (0 == mark) inst[i].fac_num++;
- }
- }
- }*/
- fclose(fp);
- fclose(ff);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement