Wątek przeniesiony 2022-12-21 21:53 z Webmastering przez Riddle.

Wczytywanie osób i numerów telefonów w aplikacji konsolowej

0

Cześć, mam problem z zadaniem:
Zbuduj prostą bazę danych.
Stwórz strukturę sOsoba zawierającą pola: - nazwisko (tablica char[] rozmiaru 20)

  • imie (tablica char[] rozmiaru 20)
  • telefon (int) - 9 cyfr pisanych po kolei
    – plec (char) - znak "m" - mężczyzna, "k" – kobieta, – średnia ocen (float)
  • data urodzenia (struktura sData)
    Struktura sData: - dzien (short)
  • miesiac (short) - rok (short)
    Zadeklaruj tablicę o 5 elementach typu sOsoba.
    Stwórz funkcję Wczytaj(), która pobierze z klawiatury wartości poszczególnych pól do obiektu (typ parametru - wskaźnik na właściwy obiekt typu sOsoba, lub tablica i indeks właściwego elementu).
    Stwórz funkcję Drukuj(), która ma wydrukować na ekranie dane odnośnie konkretnej osoby. Parametry funkcji (const wskaźnik na właściwy obiekt typu sOsoba, lub tablica i indeks właściwego elementu).
    W głównym kodzie:
    • Wywołaj 5 razy funkcję Wczytaj(), za każdym razem pobierz z klawiatury
    dane innej osoby.
    • Wczytaj z klawiatury numer osoby, którą chcesz wydrukować,
    a następnie wydrukuj pola określonego obiektu.

To mój kod, ktoś wie dlaczego nie działa?

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

struct sData
{
    short int dzien;
    short int miesiac;
    short int rok;
};

struct sOsoba
{
    char nazwisko[20];
    char imie[20];
    int telefon;
    char plec;
    float srednia;
    struct sData urodzenie;
};

struct sOsoba tab[5];

void Wczytaj(struct sOsoba *obiekt)
{
    printf("podaj nazwisko:\n");
    scanf("%s",(*obiekt).nazwisko);
    printf("podaj imie:\n");
    scanf("%s",obiekt->imie);
    printf("podaj telefon:\n");
    scanf("%d",&(*obiekt).telefon);
    printf("podaj plec (m lub k):\n");
    getchar();
    scanf("%c",&(*obiekt).plec);
    printf("podaj srednia ocen:\n");
    scanf("%f",&obiekt->srednia);
    printf("podaj dzien urodzenia:\n");
    scanf("%hu",&obiekt->urodzenie.dzien);
    printf("podaj miesiac urodzenia:\n");
    scanf("%hu",&obiekt->urodzenie.miesiac);
    printf("podaj rok urodzenia:\n");
    scanf("%hu",&(*obiekt).urodzenie.rok);
}

void Drukuj(struct sOsoba tab[],int n)
{
    printf("Nazwisko: %s, imie: %s, telefon: %d, plec: %c, srednia: %f, dzien urodzenia: %hu, miesiac urodzenia: %hu, rok urodzenia: %hu\n", tab[n].nazwisko, tab[n].imie, tab[n].telefon, tab[n].plec, tab[n].srednia,tab[n].urodzenie.dzien, tab[n].urodzenie.miesiac,tab[n].urodzenie.rok);
}

void Zadanie5()
{
    for(int i = 0; i<5; i++)
    {
        Wczytaj(&tab[0]);
    }
    printf("Dane ktorej osoby chcesz wywolac?\n");
    int n;
    scanf("%d", &n);
    Drukuj(tab,n);
}

int main()
{

printf("Zadanie 5:\n");
Zadanie5();


return 0; 
}

7
Pysa6 napisał(a):

To mój kod, ktoś wie dlaczego nie działa?

Nie akceptujemy tu zwrotu "nie działa"
a) daje komunikaty / błędy kompilacji - jakie ?
b) daje efekty inne od oczekiwanych - jakie oczekiwane, a jakie rzeczywiste ?
c) rzuca komunikatami podczas wykonania - jakimi, w jakich okolicznościach ?

0

To ma być C czy C++?
Tag mówi C++, kod mówi C.

1

Proponowałbym zacząć od naprawienia ostrzeżeń kompilatora: https://godbolt.org/z/14xnGfGd3

<source>: In function 'Wczytaj':
<source>:35:14: error: format '%hu' expects argument of type 'short unsigned int *', but argument 2 has type 'short int *' [-Werror=format=]
   35 |     scanf("%hu", &obiekt->urodzenie.dzien);
      |            ~~^   ~~~~~~~~~~~~~~~~~~~~~~~~
      |              |   |
      |              |   short int *
      |              short unsigned int *
      |            %hu
<source>:37:14: error: format '%hu' expects argument of type 'short unsigned int *', but argument 2 has type 'short int *' [-Werror=format=]
   37 |     scanf("%hu", &obiekt->urodzenie.miesiac);
      |            ~~^   ~~~~~~~~~~~~~~~~~~~~~~~~~~
      |              |   |
      |              |   short int *
      |              short unsigned int *
      |            %hu
<source>:39:14: error: format '%hu' expects argument of type 'short unsigned int *', but argument 2 has type 'short int *' [-Werror=format=]
   39 |     scanf("%hu", &(*obiekt).urodzenie.rok);
      |            ~~^   ~~~~~~~~~~~~~~~~~~~~~~~~
      |              |   |
      |              |   short int *
      |              short unsigned int *
      |            %hu

Weź tego linka i wprowadź przykładowe dane wejściowe.

1

Poprawione troszkę literówek i mniej wiecej działa https://godbolt.org/z/Gjz76xe4b
Nieprawidłowe dane powodują crash.
Głowna literówka to 0 zamiast i.

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