Struktura i scanf

Odpowiedz Nowy wątek
2015-02-01 01:22
0

W moim programie mam tablice struktur, zapisuje w niej imiona i nazwiska 5 osób, następnie chce zapisać oceny tych 5 osób. Dlaczego scanf w pętli nie działa tak jak powinien? NIe zapisuje danych do tablicy...pogubiłem się i proszę o pomoc.

#include <stdio.h>
#include <stdlib.h>
#define MAX 4

struct daneos {
    char imie[20];
    char nazwisko[20];
};
struct student {
    struct daneos dane;
    float oceny[5];
    float srednia;
};

int main(int argc, char* argv[])
{
    struct student studenci[MAX];
    int licznik = 0;
    printf("Podaj imie pierwszego studenta: ");
    gets(studenci[licznik].dane.imie);
    while (licznik < MAX) {
        printf("Podaj nazwisko: ");
        gets(studenci[licznik++].dane.nazwisko);
        if (licznik < MAX) {
            printf("Podaj kolejne imie: ");
            gets(studenci[licznik].dane.imie);
        }
    }
    int i = 0;
    while (i < MAX) {
        printf("Podaj oceny pierwszego studenta: ");
        scanf("%f", &studenci[i++].oceny);
    }
    system("PAUSE");
    return 0;
}
edytowany 2x, ostatnio: Glorn, 2015-02-01 11:11

Pozostało 580 znaków

2015-02-01 02:09
0

Popraw wcięcia, bo w tej chwili wprowadzają w błąd. Możesz wkleić kod tutaj, żeby poprawic: http://format.krzaq.cc

printf("Podaj oceny pierwszego studenta: ");
scanf("%f", &studenci[i++].oceny);

jeśli to są kolejne oceny pierwszego studenta, to raczej &studenci[0].oceny[i++]

Pętla wczytująca z licznikiem też jest mocno przekombinowana.

Pozostało 580 znaków

2015-02-01 10:47
0

Dzięki, głupi błąd, ale ucze sie mozna powiedziec od niedawna. Mam kolejne pytanie, pewnie trywialne, ale dlaczego kiedy w konsoli wpisuje oceny studenta to mogę wpisać jedną? Jeśli wpisze chociażby dwie oddzielone przecinkiem to program od razu konczy prace. Chodzi mi o to, żeby najpierw podać imiona i nazwiska, zapisać je w tablicy struktur, co robi pierwsza pętla, później podać oceny i przypisac je poszczególnym studentom.

Pozostało 580 znaków

2015-02-01 12:39
0

Oddzielaj spacją a nie przecinkiem.

Pozostało 580 znaków

2015-02-01 12:56
0

Oczywiscie, że próbowałem - to samo, oddzielam spacjami, wciskam enter i pętla wykonuje się tak jakby natychmiastowo, nic nie moge wklepać.

Pozostało 580 znaków

2015-02-01 13:16
0

Podaj poprawiony kod i dane wejściowe.

Pozostało 580 znaków

2015-02-01 13:18
0

Taki mam kod w tej chwili:

#include <stdio.h>
#include <stdlib.h>
#define MAX 4

struct daneos {
    char imie[20];
    char nazwisko[20];
};
struct student {
    struct daneos dane;
    float srednia;
    int oceny[100];
};

int main(int argc, char* argv[])
{
    struct student studenci[MAX];
    int licznik = 0;
    printf("Podaj imie pierwszego studenta: ");
    gets(studenci[licznik].dane.imie);
    while (licznik < MAX) {
        printf("Podaj nazwisko: ");
        gets(studenci[licznik++].dane.nazwisko);
        if (licznik < MAX) {
            printf("Podaj kolejne imie: ");
            gets(studenci[licznik].dane.imie);
        }
    }
    int i = 0;
    while (i < MAX) {
        printf("Podaj oceny pierwszego studenta: ");
        scanf("%d", &studenci[0].oceny[i++]);
    }
    printf("Oceny: ",studenci[0].oceny[i]);
    system("PAUSE");
    return 0;
}

Tak w ogóle chce wczytywanie danych,obliczanie średniej, wyświetlanie wyników, zrobić w oparciu o funkcje, ale to może później jak sobie poradze z tym problemem...

Pozostało 580 znaków

2015-02-01 13:21
0

No to przecież masz wczytanie ocen tylko dla jednego studenta.

Pozostało 580 znaków

2015-02-01 13:21
1

Twoja pętla wczytywania ocen jest - co zostało już powiedziane - do kitu. Aby to działało zgodnie z twoimi oczekiwaniami powinno wyglądać to, przykładowo, tak:

for(i = 0; i < MAX; ++i) {
        printf("Podaj oceny studenta %d: ", i+1);
        for(licznik_ocen = 0; licznik_ocen < MAX_OCEN; ++licznik_ocen) {
          if(0 == scanf("%f", &studenci[i].oceny[licznik_ocen])) break;
         }
        fflush(stdin);
    }

Teraz możesz podawać dla każdego studenta od 0 do... prawie dowolnej ilości ocen. Jednakże dla pojedynczego studenta nie zostanie wczytanych więcej niż MAX_OCEN. Listę ocen kończysz podając dowolny znak nie dający przekształcić się w liczbę, ale nie biały(np. spacja, tabulacja itp.).

Jeżeli czegoś nie rozumiasz, pisz.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0