Funkcja wypisz - problem z wyswietleniem.

0
 
void wypisz() {
  int i=0;
  struct wezel *pom=start;

  system("cls");

  while(pom!=NULL) {
    i++;
    printf("Rekord nr %d:\n", i);
    printf("Imie wlasciciela: %s\n",pom->dane1.imie);
    printf("Nazwisko wlasciciela: %s\n",pom->dane1.nazwisko);
    printf("Nazwa firmy: %d\n",pom->dane1.wiek);
    printf("Data powstania firmy: %d\n",pom->dane.data_powstania);
    printf("Imie wlasciciela: %s\n",pom->dane.branza);
    printf("Nazwisko wlasciciela: %s\n",pom->dane.email);
    printf("Nazwa firmy: %f\n",pom->dane.fundusze);
    printf("Data powstania firmy: %d\n",pom->dane.miejscowosc);
    printf("Nazwa firmy: %d\n",pom->dane.nazwa_firmy);
    printf("Data powstania firmy: %d\n",pom->dane.pracownicy);
    printf("\n");
    pom=pom->next;
  }
  fflush(stdin);
  fgetc(stdin);
}

Po wywołaniu jej mam tzw. matrixa, czyli pojawiające się non-stop znaki. Jakieś wskazówki?

0

Z całą pewnością problem nie w tej funkcji.

0
 
typedef struct firma {
            char nazwa_firmy[MAX_LENGHT];
            int data_powstania;
            float fundusze;
            int pracownicy;
            char branza[MAX_LENGHT];
            char miejscowosc[MAX_LENGHT];
            char email[MAX_LENGHT];
    }info_firma;

    typedef struct wlasciciel {
        char imie[MAX_LENGHT];
        char nazwisko[MAX_LENGHT];
        int wiek;
    }info_wlasciciel;

    typedef struct wezel{
        info_firma dane;
        info_wlasciciel dane1;
        struct wezel *next;
    }wezel;

    wezel *start=NULL;

    void inicjuj(){ //done
    start = malloc (sizeof(struct wezel));
    start->next=start;
    }

    info_firma czytaj()
    {
        info_firma a;
        info_wlasciciel b;
        printf("Podaj imie: ");
        scanf("%s", &b.imie);
        printf("Podaj nazwisko: ");
        scanf("%s", &b.nazwisko);
        printf("Podaj wiek: ");
        scanf("%d", &b.wiek);
        printf("Podaj dane firmy\n");
        printf("\t Nazwa firmy: ");
        scanf("%s", &a.nazwa_firmy);
        printf("\t Data powstania: ");
        scanf("%d", &a.data_powstania);
        printf("\t Branza: ");
        scanf("%s", &a.branza);
        printf("\t Liczba pracowników: ");
        scanf("%d", &a.pracownicy);
        printf("\t Miejscowosc firmy: ");
        scanf("%s", &a.miejscowosc);
        printf("\t E-mail: ");
        scanf("%s", &a.email);
        printf("\t Fundusze firmy: ");
        scanf("%f", &a.fundusze);
        printf("\n\n");
        return a;
    }

To pewnie w funkcji czytającej jest błąd. I tak właściwie czy dobrze wiąże te struktury, bo mają być zależne od siebie?

0

w ogóle nie czytałem kodu tylko zerknąłem ale skoro sprawdzasz czy next nie jest NULLem to do nexta kiedyś powinieneś tego nulla przypisać, a ja tam widzę jedynie przypisanie do start->next jakiegoś malloca

0
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGHT 45 /*maksymalna dlugosc ciagu znakow, ustaw wedlug mniemania*/

    typedef struct firma {
            char nazwa_firmy[MAX_LENGHT];
            int data_powstania;
            float fundusze;
            int pracownicy;
            char branza[MAX_LENGHT];
            char miejscowosc[MAX_LENGHT];
            char email[MAX_LENGHT];
    }info_firma;

    typedef struct wlasciciel {
        char imie[MAX_LENGHT];
        char nazwisko[MAX_LENGHT];
        int wiek;
    }info_wlasciciel;

    typedef struct wezel{
        info_firma dane;
        info_wlasciciel dane1;
        struct wezel *next;
    }wezel;

    wezel *start=NULL;

    void inicjuj(){
    start = malloc (sizeof(struct wezel));
    start->next=start;
    start->next=NULL;
    }

    info_firma czytaj()
    {
        info_firma a;
        info_wlasciciel b;
        printf("Podaj imie: ");
        scanf("%s", &b.imie);
        printf("Podaj nazwisko: ");
        scanf("%s", &b.nazwisko);
        printf("Podaj wiek: ");
        scanf("%d", &b.wiek);
        printf("Podaj dane firmy\n");
        printf("\t Nazwa firmy: ");
        scanf("%s", &a.nazwa_firmy);
        printf("\t Data powstania: ");
        scanf("%d", &a.data_powstania);
        printf("\t Branza: ");
        scanf("%s", &a.branza);
        printf("\t Liczba pracowników: ");
        scanf("%d", &a.pracownicy);
        printf("\t Miejscowosc firmy: ");
        scanf("%s", &a.miejscowosc);
        printf("\t E-mail: ");
        scanf("%s", &a.email);
        printf("\t Fundusze firmy: ");
        scanf("%f", &a.fundusze);
        printf("\n\n");
        return a;
    }

    void dodaj(info_wlasciciel a)
    {
        wezel *pom;
        wezel *wesz;
        wesz = start;
        char c;
        /*trzeba znalezc miejsce dla wstawianego elementu*/
        while(wesz->next!=start)
        {
            printf("Leci");
            wesz = wesz->next;
        }
        pom = (wezel*) malloc(sizeof(wezel)); //tak jak Ty alokuje pamiec na wezel
        wesz -> next = pom; //podpinamy wskazniki na nowy element
        pom -> next = start; //zapetlamy liste
        pom -> dane1 = a;
        scanf("%c%c",&c,&c);
    }

    int policz(wezel *start)
    {
        int ile = 0;
        while(start->next != start)
        {
            ile++;
            start = start->next;
        }
        return ile;
    }

void wypisz() {
  int i=0;
  struct wezel *pom=start;

  system("cls");

  while(pom!=NULL) {
    i++;
    printf("Rekord nr %d:\n", i);
    printf("Imie wlasciciela: %s\n",pom->dane1.imie);
    printf("Nazwisko wlasciciela: %s\n",pom->dane1.nazwisko);
    printf("Nazwa firmy: %d\n",pom->dane1.wiek);
    printf("Data powstania firmy: %d\n",pom->dane.data_powstania);
    printf("Imie wlasciciela: %s\n",pom->dane.branza);
    printf("Nazwisko wlasciciela: %s\n",pom->dane.email);
    printf("Nazwa firmy: %f\n",pom->dane.fundusze);
    printf("Data powstania firmy: %d\n",pom->dane.miejscowosc);
    printf("Nazwa firmy: %d\n",pom->dane.nazwa_firmy);
    printf("Data powstania firmy: %d\n",pom->dane.pracownicy);
    printf("\n");
    pom=pom->next;
  }
  fflush(stdin);
  fgetc(stdin);
}


    void sortuj(wezel *start)
    {
        wezel *nowystart=NULL;
        wezel *max, *poprzmax, *pom;
        while(start)
        {
            max=start;
            poprzmax=NULL;
            pom=start;
            while(pom->next)
            {
                if (pom->next->dane.pracownicy>max->dane.pracownicy)
                {
                    poprzmax=pom->next;
                    max=pom->next;
                }
                pom=pom->next;
            }
            if (poprzmax)
            {
                poprzmax->next=max->next;

            }
            else
            {
                start=max->next;
                max->next=nowystart;
                nowystart=max;
            }
            start=nowystart;
        }
    }

    void usun_firme(wezel *pom)
    {
        pom=start;
        start=pom->next;
        free(pom);
    }

    void zdp()
    {
    char nazwap[]="wynik.txt";
    wezel *pom=start;
    FILE *plik;
    plik=fopen(nazwap,"wt");

      while(pom!=NULL)
      {
            fprintf("%s %s %d %s %d %s %d %s %s %f\n", pom->dane1.imie, pom->dane1.nazwisko, pom->dane1.wiek, pom->dane.nazwa_firmy, pom->dane.data_powstania, pom->dane.branza, pom->dane.pracownicy, pom->dane.miejscowosc, pom->dane.email, pom->dane.fundusze);
        pom=pom->next;
      }
      fclose(plik)  ;
    }

    void wdzp()
    {
       wezel a;
       FILE *plik;
       plik=fopen(plik,"rt");

              fscanf(plik, "%s" , &a.dane1.imie);
              fscanf(plik, "%s" , &a.dane1.nazwisko);
              fscanf(plik, "%d" , &a.dane1.wiek);
              fscanf(plik, "%s" , &a.dane.branza);
              fscanf(plik, "%d" , &a.dane.data_powstania);
              fscanf(plik, "%s" , &a.dane.email);
              fscanf(plik, "%f" , &a.dane.fundusze);
              fscanf(plik, "%s" , &a.dane.miejscowosc);
              fscanf(plik, "%s" , &a.dane.nazwa_firmy);
              fscanf(plik, "%d" , &a.dane.pracownicy);

       fclose(plik);
    }

    int main()
    {
        system("cls");
        inicjuj();
        int z;
        char a;
        while(1)
        {
           int z;
    printf("\n--------------------------------- BAZA DANYCH ----------------------------------\n");
    printf("1. Dodaj nowa firme i wlasciciela\n");
    printf("2. Usun istniejaca firme\n");
    printf("3. Wyszukaj podana firme\n");
    printf("4. Posortuj dane\n");
    printf("5. Wypisz dane\n");
    printf("6. Zapisz dane do pliku\n");
    printf("7. Wczytaj dane z pliku\n");
    printf("8. Wyjscie\n\n");
    printf("Wybierz interesujaca Cie opcje: ");
    scanf("%d",&z);
    switch (z)
    {
        case 1: czytaj(); break;
        case 2: usun_firme(czytaj); break;
        case 3: break;
        case 4: sortuj(NULL); break;
        case 5: wypisz(); break;
        case 6: zdp(); break;
        case 7: wdzp(); break;
        case 8: return 0; break;
    }

}
}

1

pom -> next = start; //zapetlamy liste

a no trzeba było mówić że miała być zapętlona
ale w takim razie trzeba być konsekwentnym i wystarczyło zmienić

pom!=NULL

na

pom!=start

i zmienić pętle while do na do while bo pierwszym elementem jest rzeczywiście start

0
info_firma czytaj()
    {
        info_firma a;
        info_wlasciciel b;
        printf("Podaj imie: ");
        scanf("%s", &b.imie);
        printf("Podaj nazwisko: ");
        scanf("%s", &b.nazwisko);
        printf("Podaj wiek: ");
        scanf("%d", &b.wiek);
        printf("Podaj dane firmy\n");
        printf("\t Nazwa firmy: ");
        scanf("%s", &a.nazwa_firmy);
        printf("\t Data powstania: ");
        scanf("%d", &a.data_powstania);
        printf("\t Branza: ");
        scanf("%s", &a.branza);
        printf("\t Liczba pracowników: ");
        scanf("%d", &a.pracownicy);
        printf("\t Miejscowosc firmy: ");
        scanf("%s", &a.miejscowosc);
        printf("\t E-mail: ");
        scanf("%s", &a.email);
        printf("\t Fundusze firmy: ");
        scanf("%f", &a.fundusze);
        printf("\n\n");
        return a;
    }

Czy ta funkcja czytająca jest napisana poprawnie? W stosunku do podanego wcześniej kodu.

0
  1. Wprowadzasz dane do "b" i .... wywalasz je.
  2. char buf[100],int val; scanf("%100s %d",buf,&val); 100s - ważne określa rozmiar bufora; buf bez & - ważne buf już jest adresem,
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGHT 45

typedef struct Firma
{
    char nazwa_firmy[MAX_LENGHT];
    int data_powstania;
    float fundusze;
    int pracownicy;
    char branza[MAX_LENGHT];
    char miejscowosc[MAX_LENGHT];
    char email[MAX_LENGHT];
    char imie[MAX_LENGHT];
    char nazwisko[MAX_LENGHT];
    int wiek;
} Element; // definicja typu danych
// przechowywanych w liście

typedef struct Wezel
{
    Element dane;
   struct Wezel *nastepny;
} Wezel;

Wezel *Poczatek = NULL;

int dodaj(Wezel *biezacy, Element dane)
{
Wezel *pom;
pom =(Wezel*)malloc(sizeof(Wezel));
if (pom==NULL)
{ printf("BRAK PAMIECI !");
return 1;
}
        pom->dane = dane;
        printf("Podaj imie: ");
        scanf("%s", &dane.imie);
        printf("Podaj nazwisko: ");
        scanf("%s", &dane.nazwisko);
        printf("Podaj wiek: ");
        scanf("%d", &dane.wiek);
        printf("Podaj dane firmy\n");
        printf("\t Nazwa firmy: ");
        scanf("%s", &dane.nazwa_firmy);
        printf("\t Data powstania: ");
        scanf("%d", &dane.data_powstania);
        printf("\t Branza: ");
        scanf("%s", &dane.branza);
        printf("\t Liczba pracowników: ");
        scanf("%d", &dane.pracownicy);
        printf("\t Miejscowosc firmy: ");
        scanf("%s", &dane.miejscowosc);
        printf("\t E-mail: ");
        scanf("%s", &dane.email);
        printf("\t Fundusze firmy: ");
        scanf("%f", &dane.fundusze);
        printf("\n\n");
pom->nastepny = biezacy->nastepny;
biezacy->nastepny = pom;
return 0;
}

void usun(Wezel *poprzednik)
{ Wezel *pom;
pom = poprzednik->nastepny;
poprzednik->nastepny = pom->nastepny;
free(pom);
}

void wypisz(Wezel *Poczatek)
{ Wezel *pom;
for(pom=Poczatek; pom!=NULL; pom=pom->nastepny)
{
    printf("Rekord nr %d:\n", pom);
    printf("Imie wlasciciela: %s\n",pom->dane.imie);
    printf("Nazwisko wlasciciela: %s\n",pom->dane.nazwisko);
    printf("Wiek Wlasciciela: %d\n",pom->dane.wiek);
    printf("Data powstania firmy: %d\n",pom->dane.data_powstania);
    printf("Branza firmy: %s\n",pom->dane.branza);
    printf("Email firmy: %s\n",pom->dane.email);
    printf("Fundusze firmy: %f\n",pom->dane.fundusze);
    printf("Miejscowosc siedziby firmy: %d\n",pom->dane.miejscowosc);
    printf("Nazwa firmy: %d\n",pom->dane.nazwa_firmy);
    printf("Liczba pracownikow: %d\n",pom->dane.pracownicy);
    printf("\n");
    fflush(stdin);
}
}

int szukaj(Wezel *Poczatek, char *nazwa_firmy, Wezel *biezacy, Wezel *poprzednik)
{ poprzednik = NULL;
biezacy = Poczatek;
while(biezacy != NULL)
{ if ( strcmp(biezacy->dane.nazwa_firmy, nazwa_firmy)==0 )
{ return 0;
}
poprzednik = biezacy;
biezacy = biezacy->nastepny;
}
return 1;
}

void sortuj(Wezel *Poczatek)
{ Wezel *nowyPoczatek = NULL;
Wezel *max, *popmax, *pom;
while( Poczatek )
{ max = Poczatek;
popmax = NULL;
pom = Poczatek;
while(pom->nastepny)
{ if (pom->nastepny->dane.fundusze>max->dane.fundusze)
{ popmax = pom;
max = pom->nastepny;
}
pom = pom->nastepny;
}
if (popmax) popmax->nastepny = max->nastepny;
else Poczatek = max->nastepny;
max->nastepny = nowyPoczatek;
nowyPoczatek = max;
}
Poczatek = nowyPoczatek;
}

void zdp()
{
  FILE * plik;
  struct Wezel * pom;

  system("cls");
  plik=fopen("firmy.txt", "w");

  pom=Poczatek;
  while(pom!=NULL) {
    fprintf(plik, "%s %d %s %f %s %s %s %s %d %d", pom->dane.branza, pom->dane.data_powstania, pom->dane.email, pom->dane.fundusze, pom->dane.imie, pom->dane.miejscowosc, pom->dane.nazwa_firmy, pom->dane.nazwisko, pom->dane.pracownicy, pom->dane.wiek);
     pom=pom->nastepny;
  }

  fclose(plik)  ;
}

int main()
    {
        system("cls");
        int z;
        z=1;
        while(z!=0)
        {
    printf("\n--------------------------------- BAZA DANYCH ----------------------------------\n");
    printf("1. Dodaj nowa firme i wlasciciela\n");
    printf("2. Usun istniejaca firme\n");
    printf("3. Wyszukaj podana firme\n");
    printf("4. Posortuj dane\n");
    printf("5. Wypisz dane\n");
    printf("6. Zapisz dane do pliku\n");
    printf("7. Wczytaj dane z pliku\n");
    printf("8. Wyjscie\n\n");
    printf("Wybierz interesujaca Cie opcje: ");
    scanf("%d",&z);
    switch (z)
    {
        case 1: dodaj(Wezel *biezacy, Wezel *pom, Element dane); break;
        case 2: usun(); break;
        case 3: szukaj(); break;
        case 4: sortuj(NULL); break;
        case 5: wypisz(NULL); break;
        case 6: zdp(); break;
        case 7: wdzp(); break;
        case 8: return 0; break;
    }

}
}

 

Napisałem od nowa, zrezygnowałem z powiązania, lecz nadal nie wiem jakie argumenty dać dla funkcji dodaj.

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