BG Development


  Reply to this topicStart new topicStart Poll

> Проблем със задача на C++
digital_m3
Публикувано на: 22-05-2017, 09:07
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 14.11.16



Здравейте, имам да правя задача на C++ със следното условие:
За група студенти са зададаени ЕГН,имае,оценки по 10 дисциплини, ср.успех и фак. номер. Да се създаде програма, която използва подпрограми за:
-създаване на файл с информация за групата студенти, без да се въвежда ср. успех
-изчисляване на ср. успех на всеки един от студентите
-извеждане на фак. номер и ср.успех на всеки отличник, който има поне една двойка.

Направих програмата без последното условие, но има някакъв проблем (когато ме пита дали искам да продължа въвеждането и напиша 'n' нищо не се случва). Също така не знам как трябва да стане последното условие. Ако може да ми помогнете с него ще съм много благодарен icon_smile.gif
CODE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct STUD {
      char ime[31];
      char EGN[11];
      char FN[7];
      float oc[11];
      float SrUspeh;
};
FILE *fl;
int i;
char imefl[30];
STUD stud;

void readStud (STUD *st) {
      printf("%20sВъведете името: ","");
      gets(st->ime);
      printf("%20sВъведете ЕГН: ","");
      gets(st->EGN);
      printf("%20sВъведете ФН: ","");
      gets(st->FN);
       printf ("Въведете оценките по 10-те дисциплини: \n");
  for (i=0;i<10;i++)
  {
     printf ("по %d-а дисциплина: ",i+1);scanf("%f",&st->oc[i]);getchar();
  }
}

void Uspeh() {
      {
            float s=0;
            fopen(imefl,"r+b");
            fread(&stud, sizeof(STUD),1, fl);
            while (!feof(fl))
            {
                  s=0;
                  for (int i=0;i<10;i++)
                  {
                        s+=stud.oc[i];
                  }
                  stud.SrUspeh=s/10.0;
                  fseek(fl, -sizeof(STUD), SEEK_CUR);
                  fwrite(&stud, sizeof(STUD), 1, fl);
                  fread(&stud, sizeof(STUD),1, fl);
            }
            fclose(fl);
            return;
      }
}


void writeStud (STUD st) {
      printf("Име: %-21s ЕГН: %s\n ФН: %s\n" , st.ime, st.EGN, st.FN);
      printf ("Оценки: "); printf ("\n");
   for (i=0;i<10;i++) printf ("%d-а дисциплина %f \n",i+1,st.oc[i]); printf("\n");
   printf ("Среден успех: %f \n",st.SrUspeh);
}
int exist (char *ime){
      FILE *f = fopen(ime,"r");
      if (f!=0) fclose(f);
      return f!=NULL;
}

void Suzdavane(){
      char ch;
      if (exist (imefl)){
            printf("Файлът съществува, да го презапиша ли? ");
            ch=getchar();
            if (ch == 'n') return;
      }
      fl=fopen(imefl,"w");
      fclose(fl);
      printf("\n Файлът е създаден.\n");
}

void Dobaviane(){
            char ch;
            if (!exist(imefl)){
                  printf("Файлът не е създаден!\n");return;
            }
            fl=fopen(imefl,"a+b");
            do{
                  readStud(&stud);
                  fwrite(&stud,sizeof(stud),1,fl);
                  printf("Ще продължите ли въвеждането? ");
                  ch=getchar();
                  getchar();
            }while (ch!='n');
            fclose(fl);
}

void obSpis(){
      int k;
      if (!exist(imefl)){
            printf("Файлът не е създаден!\n");
            return;
      }
      fl=fopen(imefl,"rb"); k=0;
      fread(&stud,sizeof(stud),1,fl);
      while (!feof(fl)){
            k++; writeStud(stud);
            fread(&stud,sizeof(stud),1,fl);
      }
      if (k==0) printf("Файлът е празен\n");
      fclose(fl);
}


void main(){
      system("chcp 1251");
      int c;
      printf("Име на файл: ");gets(imefl);
      do{
            printf("%20sМеню на изпълняваните операции:\n","");
            printf("%26s1. Създаване на нов файл\n","");
            printf("%26s2. Добавяне на данни към файла\n","");
            printf("%26s3. Извеждане на всички студенти\n","");
            printf("%20sПосочете операция или 0 за край:","");
            scanf("%d",&c);getchar();
            switch (c){
            case 1:Suzdavane();break;
            case 2:Dobaviane();
                  Uspeh();break;
            case 3:obSpis();break;
            }
      }while (c!=0);
      system("pause");
}



PMEmail Poster
Top
dvader
Публикувано на: 22-05-2017, 09:15
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4479
Регистриран на: 12.07.05



QUOTE (digital_m3 @ 22-05-2017, 09:07)
има някакъв проблем (когато ме пита дали искам да продължа въвеждането и напиша 'n' нищо не се случва

Програмата се държи коректно - защо реши, че трябва да се случва каквото и да било при натискане на n? Можеш ли да посочиш в кода съответната проверка?


--------------------
I find your lack of faith disturbing
PM
Top
digital_m3
Публикувано на: 22-05-2017, 09:23
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 14.11.16



Ами при void Dobaviane() - "Ще продължите ли въвеждането? " - тук когато напиша n за да прекратя въвеждането програмата един вид забива. Преподавателят в университета ми каза, че проблемът се получава от подпрограмата за изчисляване на средния успех, но не остана време да го оправим.
PMEmail Poster
Top
Feral
Публикувано на: 22-05-2017, 10:01
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 92
Регистриран на: 05.02.17



Правиш безкраен цикъл, когато се опитваш да смяташ средния успех на студентите.
Дееба ... 10 пъти се обърках и аз... при четенето и писането. Ако се загледам още веднъж, още веднъж ще си редактирам мнението значи

Edit (номер 1247863): Мдааааааа, познай какво - fwrite НЕ overrite-ва каквото е имало във файла, а само добавя. icon_lol.gif четеш, пишеш и връщаш курсора ... той файла вече си е променил съдържанието


Това мнение е било редактирано от Feral на 22-05-2017, 10:52


--------------------
PMEmail Poster
Top
dvader
Публикувано на: 22-05-2017, 10:49
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4479
Регистриран на: 12.07.05



QUOTE (digital_m3 @ 22-05-2017, 09:23)
тук когато напиша n за да прекратя въвеждането програмата един вид забива.

Разбрах те още първият път. Аз питам защо реши, че за да прекратиш въвеждането трябва да натискаш n? И питах дали можеш да посочиш съответната проверка в кода.


--------------------
I find your lack of faith disturbing
PM
Top
digital_m3
Публикувано на: 22-05-2017, 15:42
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 14.11.16



QUOTE (dvader @ 22-05-2017, 10:49)
QUOTE (digital_m3 @ 22-05-2017, 09:23)
тук когато напиша n за да прекратя въвеждането програмата един вид забива.

Разбрах те още първият път. Аз питам защо реши, че за да прекратиш въвеждането трябва да натискаш n? И питах дали можеш да посочиш съответната проверка в кода.

CODE
while (ch!='n');
           fclose(fl);


Видях го в учебника ми по програмиране, там е написано така.
PMEmail Poster
Top
digital_m3
Публикувано на: 22-05-2017, 15:43
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 6
Регистриран на: 14.11.16



QUOTE (Feral @ 22-05-2017, 10:01)
Правиш безкраен цикъл, когато се опитваш да смяташ средния успех на студентите.
Дееба ... 10 пъти се обърках и аз... при четенето и писането. Ако се загледам още веднъж, още веднъж ще си редактирам мнението значи

Edit (номер 1247863): Мдааааааа, познай какво - fwrite НЕ overrite-ва каквото е имало във файла, а само добавя. icon_lol.gif четеш, пишеш и връщаш курсора ... той файла вече си е променил съдържанието

Тоест трябва да променя fwrite ли..? Извинявам се, но ми е малко неясно. icon_redface.gif
PMEmail Poster
Top
dvader
Публикувано на: 22-05-2017, 16:13
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4479
Регистриран на: 12.07.05



QUOTE (digital_m3 @ 22-05-2017, 15:42)
Видях го в учебника ми по програмиране, там е написано така.

Моя грешка, аз гледах цикъла в main функцията...

Направи да се печата n всеки път след като е въведено (или ползвай дебъгера) за да се види какво съдържа реално.

Освен това, защо има втори getchar след като се прочете n?

Плюс това, getchar връща int а не char...


Това мнение е било редактирано от dvader на 22-05-2017, 16:16


--------------------
I find your lack of faith disturbing
PM
Top
Feral
Публикувано на: 22-05-2017, 16:19
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 92
Регистриран на: 05.02.17



Не, според мен трябва да си промениш логиката на програмата.

В readStud трябва да пресметнеш успеха на ученика след като прочетеш оценките icon_smile.gif, а пък функцията void Uspeh () не трябва въобще да пише и чете по файла поне за мен.
Ето ти примерна имплементация на твоята функция uspeh:

CODE

const int kMarksCount = 10;
float CalculateAverageMark(const Stud& stud)
{
  float sum = 0.0f;
  for(int i = 0; i < kMarksCount; ++i)
  {
     sum += stud.oc[i];
  }
  return sum / kMarksCount;
}


После само си записваш във файла студентчето и всичко e точно icon_razz.gif

Edit: видя ли какъв файл ти генерира програмата, ако я оставиш малко по-дълго след като влезе в безкрайния "писателски" цикъл в Uspeh? Аз я оставих за малко и генерира 70MB файл icon_wink.gif Само това би трябвало да ти подскаже, че проблема е в писането и четенето по файла, дори.
А в университета/училище не ви ли учат как се ползва дебъгер?

Това мнение е било редактирано от Feral на 22-05-2017, 16:28


--------------------
PMEmail Poster
Top
Ivana
Публикувано на: 18-05-2019, 14:53
Quote Post



Име: Ивана Иванова
Група: Потребител
Ранг: Новопостъпил

Мнения: 10
Регистриран на: 12.12.18



Същото условие, може ли помощ за тази програма ?

CODE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct STUD {
      char ime[31];
      char EGN[11];
      char FN[7];
      float oc[11];
      float SrUspeh;
};
FILE *fl;
int i;
char imefl[30];
STUD stud;

void readStud(STUD *st) {
      int i;
      printf("Име:"); gets_s(st->ime);
      printf("ЕГН:"); gets_s(st->EGN);
      printf("Фак. номер:"); scanf("%ld", &st->FN);
      printf("Оценки по 10 дисциплини\n");
      for (i = 0; i < 10; i++) {
            printf("По %d-а дисциплина:", i + 1); scanf("%d", &st->oc[i]);
      }
      int j, s = 0;
      for (j = 0; j < 10; j++) s += st->oc[j];
      st->SrUspeh = s / 10.0;
      getchar();
}

void writeStud(STUD st) {
      printf("Име: %-21s ЕГН: %s\n ФН: %s\n", st.ime, st.EGN, st.FN);
      printf("Оценки: "); printf("\n");
      for (i = 0; i < 10; i++) printf("%d-а дисциплина %f \n", i + 1, st.oc[i]); printf("\n");
      printf("Среден успех: %f \n", st.SrUspeh);
}

int exist(char *ime) {
      FILE *f = fopen(ime, "r");
      if (f != 0) fclose(f);
      return f != NULL;
}

void Suzdavane() {
      char ch;
      if (exist(imefl)) {
            printf("Файлът съществува, да го презапиша ли? ");
            ch = getchar();
            if (ch == 'n') return;
      }
      fl = fopen(imefl, "w");
      fclose(fl);
      printf("\n Файлът е създаден.\n");
}

void Dobaviane() {
      char ch;
      if (!exist(imefl)) {
            printf("Файлът не е създаден!\n"); return;
      }
      fl = fopen(imefl, "a+b");
      do {
            readStud(&stud);
            fwrite(&stud, sizeof(stud), 1, fl);
            printf("Ще продължите ли въвеждането? ");
            ch = getchar();
      } while (ch != 'n');
      fclose(fl);
}

void Uspeh() {
      system("chcp 1251");
      int br;
      fl = fopen(imefl, "rb");
      br = 0;
      fread(&stud, sizeof(STUD), 1, fl);
      while (!feof(fl))
      {
            if (stud.oc[0] == '2')
            {
                  br++;
                  printf("Отличници със двойка : \n");
                  printf("Фак.номер:%s\n Среден успех : %4.2f\n", stud.FN, stud.SrUspeh);
            }
            fread(&stud, sizeof(STUD), 1, fl);
      }
      if (br == 0)
      {
            printf("Няма въведени отличници със двойки студенти!\n");
      }
      fclose(fl);
}

void obSpis() {
      int k;
      if (!exist(imefl)) {
            printf("Файлът не е създаден!\n");
            return;
      }
      fl = fopen(imefl, "rb"); k = 0;
      fread(&stud, sizeof(stud), 1, fl);
      while (!feof(fl)) {
            k++; writeStud(stud);
            fread(&stud, sizeof(stud), 1, fl);
      }
      if (k == 0) printf("Файлът е празен\n");
      fclose(fl);
}


void main() {
      system("chcp 1251");
      int c;
      printf("Име на файл: "); gets_s(imefl);
      do {
            printf("%20sМеню на изпълняваните операции:\n", "");
            printf("%26s1. Създаване на нов файл\n", "");
            printf("%26s2. Добавяне на данни към файла\n", "");
            printf("%26s3. Извеждане на успех\n", "");
            printf("%26s4. Извеждане на всички студенти\n", "");
            printf("%20sПосочете операция или 0 за край:", "");
            scanf("%d", &c); getchar();
            switch (c) {
            case 1:Suzdavane(); break;
            case 2:Dobaviane(); break;
            case 3:Uspeh(); break;
            case 4:obSpis(); break;
            }
      } while (c != 0);
      system("pause");
}
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0