Portál AbcLinuxu, 20. dubna 2024 04:49
sestavte program s datovou strukturou Knihovna, která bude obsahovat jméno knihy, jméno a příjmení autora, rok vydání, stav půjčení (ano/ne), bude možné zadat pro pět knih
Nevim jak udělat stav pujceni ano/ne
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char jmenokn[40]; char jmenoa[40]; char prijmenia[40]; unsigned date; }KNIHA; int main() { KNIHA knihy[5]; strcpy(knihy[0].jmenokn, "Trpaslici"); strcpy(knihy[0].jmenoa, "Tomas"); strcpy(knihy[0].prijmenia, "Marny"); knihy[0].date = 1999; strcpy(knihy[0].jmenokn, "Loupeznici"); strcpy(knihy[0].jmenoa, "Adam"); strcpy(knihy[0].prijmenia, "Rysavy"); knihy[0].date = 1992; strcpy(knihy[0].jmenokn, "Hlavolam 2"); strcpy(knihy[0].jmenoa, "Alex"); strcpy(knihy[0].prijmenia, "Schafer"); knihy[0].date = 1983; strcpy(knihy[0].jmenokn, "Polednice"); strcpy(knihy[0].jmenoa, "Pavel"); strcpy(knihy[0].prijmenia, "Kontor"); knihy[0].date = 1997; strcpy(knihy[0].jmenokn, "Pocitace"); strcpy(knihy[0].jmenoa, "Felix"); strcpy(knihy[0].prijmenia, "Novak"); knihy[0].date = 1999; int i; for (i = 0; i<5; i++) { printf("Kniha na indexu %d\n", i); printf("\n"); printf("Jmeno knihy: %s\n", knihy[0].jmenokn); printf("Jmeno autora: %s\n", knihy[0].jmenoa); printf("Prijmeni autora: %s\n", knihy[0].prijmenia); printf("Rok vydani: %d\n", knihy[0].date); printf("\n"); } system("pause"); return 0; }
Řešení dotazu:
indexy blbě pak taky samý *() jakože v těch hranatejch závorkách a pak to tam jako stejně nastrkáš hodnotou dyď ti to ani jako nemuže normálně běžet ti to jako furt vypisuje jen tu prní knížku ne :'( :'( ataky mi neřikej že ste ještě jako nedělali malloc free a takový tydlety ;D
de to i líp ale zatim takhlenc
#include <stdio.h> #include <stdlib.h> #include <string.h> #define KNIHA_NEPUCENA 0 #define KNIHA_PUCENA 1 typedef unsigned int stavPuceni; typedef struct { char jmenokn[40]; char jmenoa[40]; char prijmenia[40]; unsigned date; stavPuceni isPucena; }KNIHA; int main() { KNIHA knihy[5]; KNIHA k; strcpy(k.jmenokn, "Cecka"); strcpy(k.jmenoa, "Michal"); strcpy(k.prijmenia, "David"); k.isPucena=KNIHA_PUCENA; k.date = 1968; knihy[0]=k; strcpy(k.jmenokn, "Stodvacet dnu s hovorkem v bunkru"); strcpy(k.jmenoa, "Jarda"); strcpy(k.prijmenia, "Hovorka"); k.isPucena=KNIHA_NEPUCENA; k.date = 2020; knihy[1]=k; strcpy(k.jmenokn, "Bilej koronavirus"); strcpy(k.jmenoa, "Karel"); strcpy(k.prijmenia, "Capek"); k.isPucena=KNIHA_PUCENA; k.date = 0; knihy[2]=k; strcpy(k.jmenokn, "Ucebnice jazyka c"); strcpy(k.jmenoa, "Pavel"); strcpy(k.prijmenia, "Herout"); k.isPucena=KNIHA_NEPUCENA; k.date = 2008; knihy[3]=k; strcpy(k.jmenokn, "Sbirka resenejch Dooyerovejch domacaku"); strcpy(k.jmenoa, "Greta"); strcpy(k.prijmenia, "Thunbergova"); k.isPucena=KNIHA_PUCENA; k.date = 2030; knihy[4]=k; int i; for (i = 0; i<5; i++) { printf("Kniha na indexu %d\n", i); printf("\n"); printf("Jmeno knihy: %s\n", knihy[i].jmenokn); printf("Jmeno autora: %s\n", knihy[i].jmenoa); printf("Prijmeni autora: %s\n", knihy[i].prijmenia); printf("Rok vydani: %d\n", knihy[i].date); printf("Je pucena: "); if(knihy[i].isPucena) printf("jojo"); else printf("nene"); printf("\n\n"); } //neni multiplatformní a u mě nefunguje :'( //system("pause"); printf("pro pokracovani zmackni enter\n"); getchar(); return 0; }
joa ty dooyere neni ti takový trapný že za tebe furt pišu domácáky z programování já?????? :O :O :D :D ;D
bych si jako přála by ses aspoň jako snažil chápat co ti tady jako pišem
jako jen jestli trošičku nekecáš :O ;D
jako to brzy příde :O :D :D ;D
tttssssssss to jako nemužeš kantoroj říct žeti do pokojíčku vtrhnuli vojenský paramedici ve skafandrech a obsadili interenotovou přípojku protože staný právo protože koronavirus atak ti nic vod něj jako nepřišlo???? :O :O :D :D ;D ;D
nóóó sem ti to jako naspala protože mi tě je líto jak máš horší křipkový prázdniny než já :'( ;D je to dělaný jako ale s mallocem abys to měl zajímavější :O :O :D :D ;D
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define BUFF_LEN 40 typedef struct { char jmenokn[BUFF_LEN]; char jmenoa[BUFF_LEN]; char prijmenia[BUFF_LEN]; int rokVydani; bool isPucena; }KNIHA; //funkce pro vypisování knížky na terminál void vypisKnihu(KNIHA * k) { printf("\nNazev: %s\nJmeno autora: %s\nPrimeni autora: %s\n",k->jmenokn,k->jmenoa,k->prijmenia); //tamto -> je jako (*k).jmenok a tak //tim mužem jako přistupovat k atributům tý struktury ;D printf("je pucena?? "); if(k->isPucena) printf("jojo"); else printf("nene"); printf("\n\n"); } //funkce co vyrobí novou knížečku a vrátí ji jako ukazatel :O :O ;D KNIHA * vyrobKnihu() { //alokujeme paměť o velikosti tý struktury knížka a přetypujem ji na ukazatel na knížku :O ;D KNIHA * k=malloc(sizeof(KNIHA)); if(!k)return NULL;//když nevyrobíme vrátíme null printf("\nZadej nazev knizky: "); //si frajersky načtem víceslovnej string jako název knížky :O ;D //normálně by to vzalo po první mezírku a pak by to jako blblo :O ;D //nejdřiv vypucujem input buffer aby tam nebyl 'enter' teda jakože znak '\n' int c; while ((c = getchar()) != '\n' && c != EOF) { } scanf("%[^\n]",k->jmenokn);//nóóó a čteme znaky dokavaď neni znak '\n' printf("\nZadej meno autora: "); scanf("%s",k->jmenoa); printf("\nZadej primeni autora: "); scanf("%s",k->prijmenia); printf("\nZadej rok vydani: "); scanf("%d",&(k->rokVydani)); //se budem dokolečka ptát až z učitelskýjo jako konečně dostanem jestli je knížka pučená nebo ne char input[10]; while(true) { printf("\nje knizka vypucena???? odpovidej pouze ano/ne: "); scanf("%s",input); if(strcmp(input,"ano")==0) { k->isPucena=true; break; } else if(strcmp(input,"ne")==0) { k->isPucena=false; break; } else { printf("\nti nerozumim :D"); } } return k; } int main() { size_t knizek; printf("zadej ucitelskej kolik jako bude knizek??\n"); scanf("%zd",&knizek); if(!knizek)//pokud je knizek==0 tak je to jako false a vykřičníkem to invertujem na true { printf("kdyz zadna tak jako zadna :O :O :D ;D koncim!!!!!"); exit(EXIT_SUCCESS); } //stejně jako s tim jednim ukazatelem na jednu knížku //ale jako tentokrát uděláme jednorozměrný pole ukazatelů na knížky :O ;D //alokujeme paměť o velikosti ukazatele na knížku krát počet knížek kolik učitelskej zadal že bude KNIHA ** knizky=malloc(knizek * sizeof(KNIHA *)); if(!knizky) { //malloc vratil NULL //asi neni dost pameti printf("malloc selhal!!!! :O :O koncim!!!!!"); exit(EXIT_FAILURE); } size_t i; for (i = 0; i<knizek; i++) { KNIHA * k; printf("\nVyplnuje se %zd. knizka\n",i+1);//hezčejší než indexy :D ;D //strčíme do proměný k vyrobenou knížku a rovnou se kouknem jestli je NULL //jestli je null tak nám malloc asi jako selhal :O :'( :D if((k=vyrobKnihu())!=NULL) { knizky[i]=k; } else { //TODO věčinou by se měla vyčistit paměť od těch už vyrobenejch knížek v případě selhání printf("malloc selhal!!!! :O :O koncim!!!!!"); exit(EXIT_FAILURE); } } //vypišeme :D :D printf("\n\n\n\n\n\n********************************\n* OBSAH DOOOYEROVY KNIHOVNICKY *\n********************************\n\n"); for(i=0;i<knizek;i++) { printf("\n%zd. knizka: ",i+1); vypisKnihu(knizky[i]); } //teďko jako po sobe uklidíme paměť //uvolníme paměť každý knížky v poli for(i=0;i<knizek;i++) { free(knizky[i]); } //nakonec vyčistíme samotný to pole free(knizky); //kdybyse to udělalo obráceně jakože nejdřiv smazat pole tak ztratíme referenci k těm knížkám a v nevíc nejhorším případě bysme mazaly uplně něco jinýho než bysme si myslely že mažem a byly bysme kde?? :O :O :D :D ;D //joa jasně že by to šlo všecko dělat v jednom cyklu ty tři různý for //ale to asi tady jako neni učel :O :O ;D //neni multiplatformní a u mě nefunguje :'( //system("pause"); int c; while ((c = getchar()) != '\n' && c != EOF) { } printf("pro pokracovani zmackni enter\n"); getchar(); printf("hotovo!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); exit(EXIT_SUCCESS); }
jojojo a dooyer se nato vykašle žeje zdrojáček jako děsně složitej a skončí jako max u copy paste už todleto si myslim je jakože dost na hraně :O :O :'( :'(
žeto je plejtvání ten buffer takhle vim ale zase se to podobá tomu co tam jako von sám měl ;D
nene :D jak piše debian je to novej definovanej datovej typ. když pak někde napišeš 'stavPuceni' tak se to chová jako bys napsal 'unsigned int' ;D
bool
, který je tu od C99, nebo počítá s tím, že by časem mohlo být stavů víc, je čistší použít pojmenovaný enum
.
ttttsssssss nebudu dělat import další knihovny kuli pitomímu boolu >:C
si dělám srandu ;D jsem doteďka myslela že je jako bool jenom v c++ :O :O :O :O
takovýho toho s tim h nakonci ;D
proč teda jako rovnou neuďáli aby se to psalo normálně bool???? :O :O :O :O toje přece uplně šílenej název pro datovej typ když ho jako máš psát a číst všude :O :O jestli to je jako to samý tak naco jako dělat import a proč jako rovnou neudělat jednoduše typedef _boolu na bool???? :O :O celý to je nějaký divný ten cčkovej bool :O :O
proč teda jako rovnou neuďáli aby se to psalo normálně boolProtože si lidi už nadefinovali vlastní bool a najednou by tak přestal jejich kód jít zkompilovat. Zatímco u věcí s _ se rozbití má očekávat.
Tak sem si to předělal a nechápu proč když k.JePucena=1 dám až za knihy[0]=k; tak to nefunguje a ukazuje to ne místo ano??? ale když to dám před strcpy(k.prijmenia, "Marny"); tak to normálně funguje? vubec nevim proc to dělá?
typedef struct { char jmenokn[40]; char jmenoa[40]; char prijmenia[40]; unsigned date; unsigned int JePucena; }KNIHA; int main() { KNIHA knihy[5]; KNIHA k; strcpy(k.jmenokn, "Trpaslici"); strcpy(k.jmenoa, "Tomas"); strcpy(k.prijmenia, "Marny"); k.JePucena=1; k.date = 1999; knihy[0]=k; strcpy(k.jmenokn, "Loupeznici"); strcpy(k.jmenoa, "Adam"); strcpy(k.prijmenia, "Rysavy"); k.JePucena=0; k.date = 1992; knihy[1]=k; strcpy(k.jmenokn, "Hlavolam 2"); strcpy(k.jmenoa, "Alex"); strcpy(k.prijmenia, "Schafer"); k.JePucena=1; k.date = 1983; knihy[2]=k; strcpy(k.jmenokn, "Polednice"); strcpy(k.jmenoa, "Pavel"); strcpy(k.prijmenia, "Kontor"); k.JePucena=0; k.date = 1997; knihy[3]=k; strcpy(k.jmenokn, "Pocitace"); strcpy(k.jmenoa, "Felix"); strcpy(k.prijmenia, "Novak"); k.JePucena=1; k.date = 1999; knihy[4]=k; int i; for (i = 0; i<5; i++) { printf("\n"); printf("Kniha na indexu %d\n", i); printf("\n"); printf("Jmeno knihy: %s\n", knihy[i].jmenokn); printf("Jmeno autora: %s\n", knihy[i].jmenoa); printf("Prijmeni autora: %s\n", knihy[i].prijmenia); printf("Rok vydani: %d\n", knihy[i].date); printf("Je pucena?:"); if(knihy[i].JePucena==1) printf("ano"); else printf("ne"); printf("\n\n"); } system("pause"); return 0; }
se to přece jako nakopíruje do pole tim okamžikem knihy[0]=k :O :O
Čím dál víc mám podezření, že je to celé jen nějaký zvrácený vtip, ale budiž. Když tu proměnnou k
zkopírujete ještě před tím, než ji naplníte, tak kopírujete neinicializované hodnoty. Dostatečně nový překladač by měl vyhodit hned dvě varování: jednak že používáte neinicializovanou proměnnou, jednak, že ta poslední přiřazení do k
nikde nepoužijete.
Ale především je nesmysl dělat to takhle komplikovaně. I když přehlédnu, že je nesmysl mít celou databázi zadrátovanou ve zdrojáku programu, tak když chcete inicializovat proměnnou, prostě ji inicializujte:
struct kniha knihy[] = { { .jmenokn = "Trpaslici", .jmenoa = "Tomas", .prijmenia = "Marny", .date = 1999, .pujcena = true, }, { ... }, ... };
Čím dál víc mám podezření, že je to celé jen nějaký zvrácený vtip, ale budiž
na trolling je to jako moc nudný ;D
Problém je, že se ptáte na nějaké detaily v situaci, kdy vám chybějí naprosté základy. (Tedy pokud to celé opravdu není jen nějaký sociologický experiment.) A k tomu, abychom vás učili programovat, poradna určitě neslouží.
Minule jsem to špatně pochopil, myslel jsem, že úlohou je přijít na to, co dělá nějaký záměrně zmateně a špatně napsaný program, který vyrobil někdo jiný za účelem toho cvičení.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.