Tablice struktur, a przekazywanie do funkcji

0

Witam, dostałem zadanie o treści:
Oblicz płacę pracownika fizycznego. Zadeklaruj strukturę o polach: imię nazwisko, liczba godzin, stawka, premia w %.Napisz funkcje do wczytywania danych, obliczania płacy i wyświetlania. Zastosuj przetwarzanie struktur przez zmienną i wskaźnik. Wywołaj te funkcje.

Natomiast ja poszedłem dalej i postanowiłem zrobić to tak, że użytkownik podaje liczbę pracowników, pierwsza funkcja wczytuje dane na temat tych pracowników (każdy pracownik to oddzielna tablica), druga funkcja oblicza płacę, a trzecia wyświetla... No i pojawił się problem, bo w książce którą czytam nie było za wiele o tablicach struktur, których wielkość określa użytkownik.. Napisałem tylko tyle na razie, ale już tutaj mam problemy, bo czasami jest potrzebny podwójny enter żeby pobrało wybrane dane

#include <stdio.h>
#include <stdlib.h>
struct placa
{
    char imie_nazwisko[40];
    float liczba_godzin;
    float stawka;
    float premia;


};
void wczytajDane(int n, struct placa *pracownik);

int main()
{
    int n;
    printf("Podaj ilosc pracownikow: ");
    scanf("%d", &n);
    struct placa pracownik[n];
    wczytajDane(n, &pracownik);
    return 0;
}

void wczytajDane(int n, struct placa *pracownik)
{
    int i;
    printf("Podaj imie i nazwisko pracownika\n");
    for(i = 0; i < n; i++)
    {
        while (getchar()!='\n')
            continue;
        gets(pracownik[i].imie_nazwisko);
        printf("\nPodaj liczbe przepracowanych godzin: ");
        scanf("%f", &pracownik[i].liczba_godzin);
        printf("\nPodaj stawke: ");
        scanf("%f", &pracownik[i].stawka);
        printf("\nPodaj premie: ");
        scanf("%f", &pracownik[i].premia);
        while (getchar()!='\n')
            continue;
        if(i<n)
            printf("\nPodaj imie i nazwisko kolejnego pracownika: \n");
    }

}

Co tutaj poprawić? Dobrze wywołuję wszystko itp?

0

Od C99 (ale w C11 opcjonalnie) masz VLA - tablice o wielkości nieznanej w czasie kompilacji, więc to jest ok. Natomiast zastanawia mnie ten fragment:

każdy pracownik to oddzielna tablica

To nie ma sensu.

0

Chodziło mi o coś takiego jak widać we wczytywaniu, że

  while (getchar()!='\n')
            continue;
        gets(pracownik[i].imie_nazwisko);
        printf("\nPodaj liczbe przepracowanych godzin: ");
        scanf("%f", &pracownik[i].liczba_godzin);
        printf("\nPodaj stawke: ");
        scanf("%f", &pracownik[i].stawka);
        printf("\nPodaj premie: ");
        scanf("%f", &pracownik[i].premia);
        while (getchar()!='\n')
            continue;
        if(i<n)

pierwszy pracownik jest w tablicy struktury pracownik[0] i tam są jego imię i nazwisko, liczba godzin, stawka i premia i tak każdy następny pracownik to pracownik[i++]

0

Mam jeszcze jeden problem, a mianowicie
Zadeklaruj strukturę student o polach: imię, nazwisko, oceny (tablica 5 ocen). Dla grupy N studentów (tablica) oblicz średnią ocen każdego studenta i średnią grupy. Zdefiniuj odpowiednie funkcje.

 #include <stdio.h>
#include <stdlib.h>
struct student
{
    char imie[20];
    char nazwisko[20];
    int oceny[5];
};
struct student wczytaj();
float oblicz(struct student uczen);
void wyswietl(struct student *dane);

int main()
{
    int n, i;
    float suma2=0, srednia=1;
    float suma[n];
    printf("Podaj liczbe studentow: ");
    scanf("%d\n", &n);

    struct student studenci[n];

    for(i=0;i<n;i++)
    {
        fflush(stdin);
        studenci[i]=wczytaj();
    }

    for(i=0;i<n;i++)
    {
        suma[i]=oblicz(studenci[i]);
        suma2=suma2+suma[i];
        printf("\n%s   %f", studenci[i].nazwisko, suma[i]);
        srednia=suma2/n;
        printf("Srednia: %f", srednia);

    return 0;
    }
}
struct student wczytaj()
{
    int i;
    struct student uczen;
    printf("Podaj imie: ");
    gets(uczen.imie);
    printf("Podaj nazwisko: ");
    gets(uczen.nazwisko);
    printf("Podaj ocene: ");
    while(i<6 && (scanf("%d", uczen.oceny[i]))==1 && uczen.oceny[i]>2 && uczen.oceny[i]<6)
    {
        printf("Podaj ocene nr %d", i);
        scanf("%d", uczen.oceny[i]);
        i++;
    }
    return uczen;
}
float oblicz(struct student uczen)

{
    int i;
    float srednia, suma;
    for(i=0; i<6; i++)
    {
        suma+=uczen.oceny[i];
    }
    srednia=suma/5;
    return srednia;
}

void wyswietl(struct student *dane)
{
    int i;
    printf("%s", dane->imie);
    printf("%s", dane->nazwisko);
    for(i=0; i<6; i++)
    {
        printf("%d", dane->oceny[i]);
    }
}

Program od razu się wysypuje przy włączeniu, co jest nie tak?

0
    int n, i;
    float suma2=0, srednia=1;
    float suma[n];

Jaką wielkość ma tablica suma?

0

Och, ale błąd... Pierw zadeklarowałem tablice, a potem podałem jej wielkość

0

Niekoniecznie. Powinna tu być inicjalizacja zmiennej przed jej użyciem.

0

Dobrze, progrma już się nie wysypuje, ale jak skutecznie zrobić to wczytanie 5 ocen ucznia?

0

Opakuj sobie pobieranie oceny do zmiennej do osobnej funkcji i ją wywołuj w pętli. Poza tym, scanf wymaga adresu, a nie zmiennej (scanf("%d", uczen.oceny[i]) nie ma sensu).

0

Chyba nie do końca zrozumiałem... Mam stworzyć jeszcze jedną funkcję, która będzie wczytywała tylko te 5 ocen i wywołać ją w pętli, tak?

0

Sugerowałbym stworzenie funkcji, która wczytuje jedną ocenę (wraz z weryfikacją jej poprawności, skoro chcesz to robić) i to ją wywołać w pętli dla każdego ucznia. Ale osobna funkcja odpowiedzialna za wczytanie ucznia to jak najbardziej dobry pomysł.

0

Nie wiem czy to przez to, że już tyle siedzę dziś nad tym wszystkim i wyłączyłem się, ale nie wiem nawet jak to zrobić dobrze... Natomiast boję się ego na jutro przekładać, bo nikogo w dzień może nie być i nie zdążę ogarnąć tego przed kolosem.

0
int pobierzOcene()
{
   int w, ocena;
   printf("Podaj ocene: ");
   scanf("%d", &w)
   if(w>=2 && w<=6)
   ocena=w;
   return ocena;

Coś takiego?
Tylko jak to teraz umiejętnie tam do pętli wrzucić?

0
int pobierzOcene(int w)
{
   int w, ocena;
   printf("Podaj ocene: ");
   scanf("%d", &w)
   if(w>=2 && w<=6)
   ocena=w;
   return ocena;
}

To jednak tak teraz myślę.. :D

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