• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Największy element/najmniejszy - C

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
654 wizyt
pytanie zadane 2 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

Siemka. Chciałabym się Was spytać, jak zrobić program, który wypisze na ekran największy i najmniejszy element, i co najważniejsze - użytkownik sam wpisuje ilość danych. Próbowałam na podstawie tego kodu:
 

#include <stdlib.h>

typedef struct
{
    char nazwisko[20], imie[20];
    int rok_ur;
    float srednia;
} TDane;

typedef struct
{
    TDane d;
    struct TElement* next;
} TElement;

typedef TElement* TWsk;

int main()
{
    TDane x;
    TWsk P;
    P=NULL;
    WprowadzDane(&P);
    printf("\nWprowadzono nastepujace dane: \n");
    UsunStos(&P);
    return 0;
}

int WprowadzStudenta(TDane *x)
{
    printf("Podaj nazwisko: ");
    scanf("%s", x->nazwisko);
    printf("Podaj imie: ");
    scanf("%s", x->imie);
    printf("Podaj rok urodzenia: ");
    scanf("%d", &x->rok_ur);
    printf("Podaj srednia: ");
    scanf("%f", &x->srednia);
    return 0;
}

int WyswietlStudenta(TDane x)
{
    printf("%s %s %d %4.2f\n", x.nazwisko, x.imie, x.rok_ur, x.srednia);
    return 0;
}

int NaStos(TWsk *P, TDane x)
{
    TWsk Q;
    Q=(TElement*)malloc(sizeof(TElement));
    Q->d=x;
    Q->next=(*P);
    (*P)=Q;
    return 0;
}

int ZeStosu(TWsk *P, TDane *x)
{
    TWsk Q;
    if(P!=NULL)
    {
        Q=(*P);
        *x=Q->d;
        (*P)=Q->next;
        free(Q);
    }
    return 0;
}

int WprowadzDane(TWsk *P)
{
    int n, i;
    TDane x;
    printf("Dane ilu osob chcesz wprowadzic?: ");
    scanf("%d", &n);
    for(i=1; i<=n; i++)
    {
        printf("%d osoba: \n", i);
        WprowadzStudenta(&x);
        NaStos(&(*P), x);
    }
    return 0;
}

int UsunStos(TWsk *P)
{
    TDane x;
    while((*P)!=NULL)
    {
        ZeStosu(&(*P), &x);
        WyswietlStudenta(x);
    }
    return 0;
}

int WyswietlStos(TWsk P)
{
    while (P!=NULL)
    {
        WyswietlStudenta(P->d);
        P=P->next;
    }
    return 0;
}

Zrobić tak:
 

int NajwiekszyElement(TWsk P)
{
    int najwiekszy = 0;
    int ile = 0;
    while(P!=NULL)
    {
        if(P->d.rok_ur>najwiekszy)
        najwiekszy = P->d.rok_ur;
        ++ile;
        P = P->next;
    }
    if(ile==0)
    {
        printf("Brak najwiekszego elementu!");
        return 0;
    }

    return 0;
}

W głowie wiem, że największy element jest tylko wtedy, gdy jest on większy od wszystkich pozostałych, jednak tutaj nie wiem czy czegoś nie pomieszałam. Byłabym wdzięczna za pomoc.

2 odpowiedzi

0 głosów
odpowiedź 2 listopada 2018 przez RafalS VIP (122,820 p.)

Polecam zwrocic wynik i potestowac czy dziala

return najwiekszy;

Na moje oko powinno zadzialac o ile lata sa dodatnie.

komentarz 2 listopada 2018 przez gorgonkowa Obywatel (1,810 p.)
Niestety, nie zwracam wyniku po return najwiekszy. Może te warningi coś blokują:
1) Assignment from incompatible pointer type [-Wincompatible-pointer-types]

2) Incompatible implicit declaration of built-in function "printf"
3) Note: include <stdio.h> or provide a declaration "printf"

Te warningi wyrzuca z tej funkcji. Czy są one w jakiś sposób istotne? :)
komentarz 2 listopada 2018 przez Marcin Siniarski Gaduła (4,420 p.)
Wystarczy wygooglować, naprawdę
1) Nie poprawne typy wskaźników. Sprawdź czy przypisujesz wskaźnik do odpowiedniej zmiennej
2) Aby używać printf potrzebujesz nagłówka stdio.h
0 głosów
odpowiedź 2 listopada 2018 przez Bondrusiek Maniak (61,440 p.)

Witam,

moi zdaniem możesz poprawić kod funkcji

int NajwiekszyElement(TWsk* P) //P powinno być wskaźnikiem aby móc przyrównać do NULL //i -> do obsługi elementów
{
   if(P == NULL){
       printf("Brak najwiekszego elementu!");
       return -1; //jesli P jest pustym wskaźnikiem zwraca -1
   }
//najwiekszy element to jest o zerowym indeksie
    int najwiekszy = P->d.rok;
    P = P->next;   
//w petli jesli istnieją są porównywalne elementy i zamieniane dla największej //wartości 
    while(P!=NULL)
    {
        if(P->d.rok_ur>najwiekszy)
{
        najwiekszy = P->d.rok_ur;
}
        P = P->next;
    }

 //zwraca najwieksza wartosc dla rok
    return najwiekszy;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 1,547 wizyt
+3 głosów
6 odpowiedzi 2,084 wizyt
pytanie zadane 4 lipca 2016 w HTML i CSS przez jankiel89 Początkujący (450 p.)
0 głosów
1 odpowiedź 2,613 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez niezalogowany

93,103 zapytań

142,077 odpowiedzi

321,565 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...