Advertisement
Ladies_Man

DZ_1 ?%d overflow?

May 18th, 2014
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. #define MAXLEN 40    //ограничение на длину графы в структуре.
  5. #define READLEN 300  //ограничение на длину строки для fgets (char *fgets(char *str, int num, FILE *stream))
  6.  
  7. typedef struct student {
  8.     char first[MAXLEN];
  9.     char second[MAXLEN];
  10.     char univer[MAXLEN];
  11.     char fac[MAXLEN];
  12.     char dep[MAXLEN];
  13.     int age, course, group;
  14.     char city[MAXLEN];
  15. } stt;
  16.  
  17. struct town {
  18.     char name[MAXLEN];
  19.     int stud, bach, mag;
  20. };
  21.  
  22. struct kafedra {
  23.     char name[MAXLEN];
  24.     int stud, bach, mag;
  25. };
  26.  
  27. struct faculty {
  28.     char name[MAXLEN];
  29.     int kaf_num, stud, bach, mag;
  30.     struct kafedra kaf;
  31. };
  32.  
  33. struct univ {
  34.     char name[MAXLEN];
  35.     int fac_num, kaf_num, stud, bach, mag;
  36.     struct faculty fac;
  37. };
  38. //обмен структур в массиве
  39. void swap (stt *i, stt *j) {  //через указатели должно работать лучше
  40.     stt temp;
  41.     temp = *i;
  42.     *i = *j;
  43.     *j = temp;
  44. }
  45.  
  46. int main()
  47. {
  48.     FILE *fp = fopen("students_1.txt", "r"); //откуда считываем
  49.     FILE *ff = fopen("result_1.txt", "w");  //куда записываем результаты
  50.     if(NULL == fp) {
  51.         printf("cannot open file\n");
  52.         exit(1);
  53.     }
  54.     fprintf(ff, "File:RDY\n");
  55.     int i, j, stud_num;
  56.     i = 0; stud_num = 0;
  57.     char str[READLEN];
  58.  
  59.     while (!feof(fp)) if (fgets(str, READLEN, fp)) stud_num++;  //считаем количество строк в файле. это и есть кол-во студентов
  60.     rewind(fp);  //возврат каретки
  61.  
  62.  
  63.     struct student man[stud_num];
  64.     int bachelors, magisters, eldest;
  65.     bachelors = 0; magisters = 0;
  66.  
  67.     char c;
  68.     while ((c = fgetc(fp)) != EOF) if (' ' == c) c = '-';  //если наткнулись на пробел (допустим, в названии вуза) то меняем его на любой другой символ. например, '-'
  69.     rewind(fp);  //возврат каретки
  70.     fprintf(ff, "Underlined:RDY\n");
  71.  
  72.     while (!feof(fp)) {
  73.         if (fgets(str, READLEN, fp)) {  //если удалось считать строку
  74.             for (j = 0; j < strlen(str); j++) if (';' == str[j]) str[j] = ' ';  //меняем запятые на пробелы т.к пробел это 'стоп-сигнал' для scanf
  75.             sscanf(str, "%s %s %s %s %s %d %d %d %s", man[i].first, man[i].second, man[i].univer,
  76.                    man[i].fac, man[i].dep, &man[i].age, &man[i].course, &man[i].group, man[i].city);  //запись в структуры
  77.             if (5 > man[i].course) {  //заодно сразу считаем бакалавров-магистров
  78.                 bachelors++;
  79.             } else {
  80.                 magisters++;
  81.             }
  82.             i++;
  83.         }
  84.     }
  85.     fprintf(ff, "Spaced:RDY\n");
  86.     fprintf(ff, "Add_to_struct:RDY\n\n\n");
  87.  
  88.  
  89.     //===========LEVEL1===========
  90.  
  91.  
  92.     fprintf(ff, "Total number of students:%d\n", stud_num);
  93.     eldest = man[0].age; //в качестве старшего выбираем возраст первого
  94.     for (i = 0; i < stud_num; i++) if (man[i].age > eldest) eldest = man[i].age; //если возраст очередного больше самого старшего на данный момент то обновляем возраст стршего
  95.     fprintf(ff, "Bachelors:%d / Magisters:%d\n", bachelors, magisters);
  96.  
  97.     for (i = 0; i < stud_num - 1; i++) {
  98.         for (j = i + 1; j < stud_num; j++) {//пузырьком проходим по массиву
  99.             if (0 == strcmp(man[i].second, man[j].second) && 0 < strcmp(man[i].first, man[j].first)) {
  100.                 swap(&man[i], &man[j]); //если совпали фамилии но не совпали имена
  101.             } else {
  102.                 if (0 < strcmp(man[i].second, man[j].second)) swap(&man[i], &man[j]); //если не совпали фамилии
  103.             }
  104.         }
  105.     }
  106.     fprintf(ff, "\nAlphabetical sorting:\n");
  107.     for (i = 0; i < stud_num; i++) fprintf(ff, "\t%s %s\n", man[i].second, man[i].first); //выводим отсортированный список
  108.     printf("=LVL1_RDY=\n");
  109.     printf("flag0\n");
  110.    
  111.  
  112.     //===========LEVEL2===========
  113.    
  114.  
  115.     fprintf(ff, "\nEldest student's age:%d\n\nEldest students:\n", eldest);
  116.     for (i = 0; i < stud_num; i++) if (man[i].age == eldest) //проходя по массиву выводим всех у кого "старший" возраст
  117.             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);
  118.  
  119.  
  120.     printf("=LVL2_RDY=\n");
  121.    
  122.  
  123.     //===========LEVEL3===========
  124.  
  125.  
  126.     int city_num = 0, mark, k = 0;
  127.     struct town cities[city_num];
  128.     printf("flag1\n");
  129.     for (i = 0; i < stud_num; i++) {  //максимум городов столько же сколько и студентов
  130.         for (mark = 0, j = 0; j < i; j++) {  //идем каждый раз с самого начала массив студентов до текущей записи
  131.             if (0 == strcmp(man[i].city, man[j].city)) {  //и если совпали города то делаем отметку и выходим
  132.                 mark++;
  133.                 break;
  134.             }
  135.         }
  136.         if (0 == mark) {  //если отметки не было  
  137.             strcpy(cities[k].name, man[i].city); //то копируем в массив городов название очередного города
  138.             city_num++;
  139.             k++;
  140.         }
  141.     }
  142.  
  143.     fprintf(ff, "Number of cities:%d\n\n", city_num);
  144.  
  145.     for (i = 0; i < city_num; i++) {
  146.         cities[i].stud = 0; cities[i].bach = 0; cities[i].mag = 0;  //в массиве структур "города" обнуляем эти поля для всех городов
  147.     }
  148.     //printf("flag3\n");
  149.     for (i = 0; i < city_num; i++) {
  150.         for (j = 0; j < stud_num; j++) {
  151.             if (0 == strcmp(cities[i].name, man[j].city)) {
  152.                 if (5 > man[j].course) {  //аналогично проходим по массиву увеличивая бакалавров/магистров i-го города
  153.                     cities[i].bach++;
  154.                 } else {
  155.                     cities[i].mag++;
  156.                 }
  157.                 cities[i].stud++;  //и общее число студентов в i-ом городе
  158.             }
  159.         }
  160.     }
  161.     //printf("flag4\n");
  162.     fprintf(ff, "Distribution by cities:\n");
  163.     for (i = 0; i < city_num; i++)  //для каждого города выводим название и количество бак/маг/студ
  164.         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);  
  165.  
  166.     int most_stud = cities[0].stud, most_bachs = cities[0].bach, most_mags = cities[0].mag;
  167.     //printf("flag5\n");
  168.     for (i = 1; i < city_num; i++) {  //аналогично поиску старшего студента ищем максимум среди бак/маг/студ
  169.         if (cities[i].stud > most_stud) most_stud = cities[i].stud;
  170.         if (cities[i].bach > most_bachs) most_bachs = cities[i].bach;
  171.         if (cities[i].mag > most_mags) most_mags = cities[i].mag;
  172.     }
  173.     //printf("flag6\n");
  174.     for (i = 0; i < city_num; i++) { //выводим
  175.         if (cities[i].stud == most_stud) fprintf(ff, "Most students from %s\n", cities[i].name);
  176.         if (cities[i].bach == most_bachs) fprintf(ff, "Most bachelors from %s\n", cities[i].name);
  177.         if (cities[i].mag == most_mags) fprintf(ff, "Most magisters from %s\n", cities[i].name);
  178.     }
  179.  
  180.     fprintf(ff, "\nAverage num of students:%d\n", stud_num / city_num);  //банально считаем ср. арифм
  181.     fprintf(ff, "Avg num of bachelors:%d / magisters:%d\n\n", bachelors / city_num, magisters / city_num);
  182.     printf("=LVL3_RDY=\n");
  183.    
  184.  
  185.     //===========LEVEL4===========
  186.    
  187.  
  188.     /*struct univ inst[stud_num];
  189.     int inst_num;
  190.     inst_num = 0; k = 0;
  191.  
  192.     for (i = 0; i < stud_num; i++) {
  193.         for (mark = 0, j = 0; j < i; j++) {
  194.             if (0 == strcmp(man[i].univer, man[j].univer)) {
  195.                 mark++;
  196.                 break;
  197.             }
  198.         }
  199.         if (0 == mark) {
  200.             strcpy(inst[k].name, man[i].univer);
  201.             inst_num++;
  202.             k++;
  203.         }
  204.     }
  205.     fprintf(ff, "Number of universities:%d\n\n", inst_num);*/
  206.     printf("=LVL4_NOT-RDY\n");
  207. /*
  208.     for (i = 0; i < city_num; i++) {
  209.         inst[i].stud = 0; inst[i].bach = 0; inst[i].mag = 0;
  210.         inst[i].fac_num = 0; inst[i].kaf_num = 0;
  211.     }*/
  212.  
  213.     /*if (5 > man[j].course) {
  214.                     inst[i].bach++;
  215.                 } else {
  216.                     inst[i].mag++;
  217.                 }
  218.                 inst[i].stud++;*/
  219.  
  220.  
  221.  
  222.  /*   for (i = 0; i < inst_num; i++) {
  223.         printf("curr univ=%s", inst[i].name);
  224.         for (j = 0; j < stud_num; j++) {
  225.             printf("\t%s\n", inst[j].name);
  226.             if (0 == strcmp(inst[i].name, man[j].univer)) {
  227.                 for (k = 0; k < stud_num; k++) {
  228.                     printf("\t%s vs %s\n", inst[i].fac.name, man[k].fac);
  229.                     if (0 == strcmp(inst[i].fac.name, man[k].fac)) {
  230.                         mark++;
  231.                         break;
  232.                     }
  233.                 }
  234.                 if (0 == mark) inst[i].fac_num++;
  235.             }
  236.         }
  237.     }*/
  238.  
  239.     fclose(fp);
  240.     fclose(ff);
  241.     return 0;
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement