Portál AbcLinuxu, 9. listopadu 2025 22:47
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 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.