NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C - Struktura_vypis

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lukáš Bobka:17.1.2018 12:15

Ahoj,
chtěl bych vás poprosit o pomoc a vysvětlení. Jedná se o strukturu, ve které jsou udaje o zajezdu. Po spuštění se vloží do seznamu 3 již nadefinované zajezdy, a výpisem bych je měl vypsat. Buhužel mi to nejde. Mohl by mi někdo vysvětlit kde je chyba popř co je špatně?
Jedná se mi o část v přepínači ...case 1 - procházím pole a jen chci vypsat danné položky.

Moc děkuju.

#pragma once

#ifndef __ZAJEZD_H
#define __ZAJEZD_H

#include "stdafx.h"

static int cisloZajezdu = 0; /* Pocitadlo pro generovani cisla zajezdu */

typedef struct Zajezd {
        int cislo;
        Date datum;
        char *nazev;
        char *destinace;
        int kapacita;
        int pocet_ucastniku; /* aktualni pocet ucastniku */
} ZAJEZD;

ZAJEZD *novyZajezd(const char *naz, const char *des, int kap, Date& dat);
        /* vytvori novy zajezd s uvedenymi parametry */

char *getInfo(ZAJEZD *z); /* vrati zakladni infomace o zajezdu */

void vypisZajezd(ZAJEZD *z); /* vypise infomace o zajezdu */

#endif

*------------------------------------------------------------------------------------*
#include "stdafx.h"
#include <string>

#define MAX 20

MENU hlavniMenu;
MENU *menu = &hlavniMenu;

Zajezd* Zajezdy[MAX];
int pocetZajezdu = 0;

void pridejZajezdy() {
        Zajezdy[pocetZajezdu++] = novyZajezd("Japonsko", "Tokio", 30, Date(1, 6, 2018));
        Zajezdy[pocetZajezdu++] = novyZajezd("Slovensko", "Poprad", 20, Date(12, 12, 2017));
        Zajezdy[pocetZajezdu++] = novyZajezd("Rakousko", "Viden", 25, Date(1, 1, 2018));
}
int main(int argc, char* argv[]) {

        int volba;
        char *jmeno;
/*------------------------------------------*/


        pridejZajezdy(); /* Pridani nekolika zajezdu pro testovani */


/* Nastaveni menu pro spravu zajezdu */

        init(menu, "Sprava zajezdu");

        pridejVolbu(menu, "Vypis stavu vsech zajezdu");
        pridejVolbu(menu, "Vlozeni noveho zajezdu");
        pridejVolbu(menu, "Vlozeni ucastnika zajezdu");
        pridejVolbu(menu, "Vypis aktualniho seznamu ucastniku zajezdu");
        pridejVolbu(menu, "Zruseni ucastnika zajezdu");

/* Vlastni program pro spravu zajezdu */

        do {
                volba = vyberVolbu(menu);
                switch (volba) {

                case 1:
                        printf("Vypis stavu vsech zajezdu\n");

                        for (int i = 0; i < pocetZajezdu; i++) {
                                printf("%d \t, %s \t, %d \n", i+1 , Zajezdy[i]->nazev , Zajezdy[i]->pocet_ucastniku );

                        }

                        break;

                case 2:
                        printf("Vlozeni noveho zajezdu\n");

                        break;

                case 3:
                        printf("Vlozeni ucastnika zajezdu\n");

                        break;

                case 4:
                        printf("Vypis aktualniho seznamu ucastniku zajezdu\n");
                        printf("Zatim neimplementovano\n");
                        // TODO
                        break;

                case 5:
                        printf("Zruseni ucastnika zajezdu\n");
                        printf("Zatim neimplementovano\n");

                        break;

                default: break; // nespravna hodnota
                }
                if (volba != 0) system("PAUSE");
        } while (volba != 0);

/* Zaver programu */

        printf("Konec\n");
        system("PAUSE");
        return 0;

};

[/code
 
Odpovědět
17.1.2018 12:15
Avatar
martanec
Člen
Avatar
Odpovídá na Lukáš Bobka
martanec:17.1.2018 12:42

A zvysok kodu?

 
Nahoru Odpovědět
17.1.2018 12:42
Avatar
Odpovídá na Lukáš Bobka
Matúš Olejník:17.1.2018 14:59

Buhužel mi to nejde

Čo myslíš tým nejde? Vyhodí ti to chybu? Ak hej už pri vkladaní alebo až pri výpise či niekde úplne inde? Dostaneš sa do case vetvy? Alebo výpis zbehne len čiastočne? A taktiež by to chcelo vidieť metódu novyZajezd

Nahoru Odpovědět
17.1.2018 14:59
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Bobka
DarkCoder:17.1.2018 15:20

Obsah struktury můžeš vypsat například takto:

#include <stdio.h>

#define MAX 20

typedef struct Zajezd {
        int cislo;
        char *nazev;
        char *destinace;
        int kapacita;
        int pocet_ucastniku;
} ZAJEZD;

int pocetZajezdu;
ZAJEZD Zajezdy[MAX] = {{ 1, "Japonsko",  "Tokio",  30, 20 },
                                           { 2, "Slovensko", "Poprad", 20, 15 },
                                           { 3, "Rakousko",  "Viden",  25, 25 }};

int main(int argc, char* argv[]) {
        printf("Vypis stavu vsech zajezdu\n\n");
        printf("Cislo \t, Nazev \t, Pocet ucastniku\n");
        pocetZajezdu = 0;
        while (Zajezdy[pocetZajezdu].cislo) {
                printf("%d \t, %s \t, %d \n", Zajezdy[pocetZajezdu].cislo, Zajezdy[pocetZajezdu].nazev, Zajezdy[pocetZajezdu].pocet_ucastniku);
                pocetZajezdu++;
        }
        putchar('\n');
        return 0;
};

Kód je poupraven z důvodu potřeb, neboť tvůj kód neobsahuje vše. Ale můžeš jej využít ve své aplikaci. Za povšimnutí stojí způsob výpisu obsahu struktury, jak je využito toho, že existujícímu zájezdu je přiřazeno číslo. Samozřejmě můžeš použít i for cyklus ale jeho způsob užití už souvisí s částmi programu, které tam zahrnuty nejsou. Chyba je v implementaci struktury. To co vytváříš je pole ukazatelů na strukturu, ale tyto ukazatele na nic neukazují.

Nahoru Odpovědět
17.1.2018 15:20
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Bobka:17.1.2018 18:22

Děkuju za reakce. Hází mi to tuto hlášku: (obrázek)
...ale předpokládám, že je to způsobené tím, že ukazatelé neodkazují tam kam mají.

 
Nahoru Odpovědět
17.1.2018 18:22
Avatar
Lukáš Bobka:17.1.2018 18:34

Funkce pro vytvoření nového:

ZAJEZD *novyZajezd(const char *n, const char *de, int k, Date& da) {
        ZAJEZD *z = new ZAJEZD;
        z->cislo = ++cisloZajezdu;
        z->datum = da;
        z->nazev = new char[strlen(n) + 1];
        strcpy_s(z->nazev, strlen(n)+1, n);
        z->destinace = new char[strlen(de) + 1];
        strcpy_s(z->destinace, strlen(de)+1, de);
        z->kapacita = k;
        z->pocet_ucastniku = 0;
        return 0;
};

Mohl by jste mi vysvětlit jak správně v tomto případě poukázat na ukazatelem na vytvořené zájezdy?
Do CASE větve se dostanu, hodí to hlášku viz obrazek a žádný výpis se neprovede...

 
Nahoru Odpovědět
17.1.2018 18:34
Avatar
Odpovídá na Lukáš Bobka
Matúš Olejník:17.1.2018 18:44

Returni zájazd a nie 0 ;)

Nahoru Odpovědět
17.1.2018 18:44
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Lukáš Bobka:17.1.2018 18:52

Díky moc! už to jede :D Děkuju všem za příspěvek.

 
Nahoru Odpovědět
17.1.2018 18:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.