- Milyen processzort vegyek?
- Mikrokontrollerek Arduino környezetben (programozás, építés, tippek)
- Gaming notebook topik
- A Windows 11 lett az úr az asztali PC-k piacán
- Milyen billentyűzetet vegyek?
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Asztrofotózás
- ZIDOO médialejátszók
- Mini-ITX
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
Új hozzászólás Aktív témák
-
PumpkinSeed
addikt
Kezdőként értelmetlen kérdésem: Ha nem scanf-el végezzük a bekérést akkor mivel?
Meg adott egy számkitalálós játék. Bekérésnél scanf ("%d";&a);
Olyan problémám lenne, hogy ha betűt adok meg és nem számot akkor bebuggol a program és végtelen ciklussá változik. Nincs valami egyszerű de hatékony megoldás erre. Azt hallottam, hogy be kell olvasni tömbként és ki kell vonni az ASCI kódból tömbben ki olvasott értékkel kell valamit szugerálni. Na nekem ennél egyszerűbbre lenne szükségem.
-
Karma
félisten
válasz
Bobrooney #3697 üzenetére
A scanfnek három nagy problémája van kapásból:
1) Ha extra paraméterek nélkül használod a %s-t, azaz ahogy órán bemutatják, nem ellenőrzi a célpuffer méretét, így buffer overflowt okoz egy hosszabb bemenet. (Ezt a gets is tudja.)
2) Ha túl nagy integer számot akarsz beolvasni, tehát túlcsordulás keletkezik, akkor nem definiált a viselkedése. Márpedig milyen módon akadályozod meg a felhasználót, hogy túl sok számjegyet nyomjon? De a probléma fájlolvasásnál is áll.
3) Ha nem sikerült értelmezni valamit, a bemeneti stream állapota kiszámíthatatlan.(Ezt egyébként Google-lel találtam. Hasznos.)
-
Karma
félisten
válasz
Bobrooney #3695 üzenetére
A scanf érthető, mivel nagyon veszélyes, de hogy a switch miért fáj, illetve hogy miért tekinti jobb megoldásnak az ifek tengerét? Rejtély számomra. Főleg, hogy egyenértékűek*. Lehet ezért tanár?
* egész számok vagy annak megfeleltethető értékek esetén.
(Élesben meg persze ott a State és a Command tervezési minta.)
-
Bobrooney
senior tag
válasz
PumpkinSeed #3693 üzenetére
Nem tudom, nem is érdekel. Csak már annyiszor javasoltátok itt a switch-t, de néha nem engedik alkalmazni. scanf is tilos nálunk... Persze ez a vizsgalapra nincs feltüntetve
-
sztanozs
veterán
válasz
PumpkinSeed #3693 üzenetére
Gondolom, mert nem tudja hibátlanul megírni
-
Karma
félisten
válasz
PumpkinSeed #3688 üzenetére
Miért, a switch szerinted mégis micsoda?
-
Bobrooney
senior tag
válasz
PumpkinSeed #3684 üzenetére
printf ("The solution: %d\n",&c); A kiírásodban a c változó memória címét iratod ki!
Módosítsd:
printf ("The solution: %d\n",c);
és jó lesz !
Valamint az ismétlődő kiíratást érdemes lehet kivinned csak az utolsó else if mögé
else if (op == '/')
{
c=a/b;
}
printf ("The solution: %d\n",c);
formában. -
PumpkinSeed
addikt
Az alábbi program egy számológép:
De az a baj, hogy minden számítsára 2686780-at ad.
#include <stdio.h>
#include <conio.h>
#include <math.h>int main()
{
int a,b,c;
char op;
printf ("This is a calculator.\n");
printf ("Give me 2 number(a,b):");
scanf ("%d,%d",&a,&b);
printf ("This is ur numbers: %d,%d \n",a,b);
printf ("Now U can tell me what do u want to do.(+,-,*,/):\n");
fflush(stdin);
scanf ("%c",&op);
if (op == '+')
{
c=a+b;
printf ("The solution: %d\n",&c);
}
else if (op == '-')
{
c=a-b;
printf ("The solution: %d\n",&c);
}
else if (op == '*')
{
c=a*b;
printf ("The solution: %d\n",&c);
}
else if (op == '/')
{
c=a/b;
printf ("The solution: %d\n",&c);
}
} -
Jester01
veterán
válasz
Vasinger! #3680 üzenetére
A konzol függvényeket nézegesd akkor.
-
Vasinger!
nagyúr
Sziasztok!
C-ben szeretnék egy menüt csinálni az alábbi módon:
1. menü opció 1
2. menü opció 2
....
....
stb.
Tehát az adott szám lenyomásával válassza ki a menüpontot a program. Viszont ha kiválasztja az egyik menüpontot a felhasználó, akkor törölje ki a képernyőt és ha lehet ne kelljen entert nyomnia.
Ezt meg lehet oldani valahogy econio.h nélkül? Ha igen, hogyan? -
Spam123
tag
Sziasztok!
Kisebb segítséget szeretnék kérni. Nem régiben kezdtem el programozni és kéne egy kis kezdőlökés.
Egy olyan programot kéne írnom, ami láncolt listákkal dolgozik, de még azt nem tanították az órákon.
Igazából annyi a feladat, hogy egy határidőnaplót kéne készítenem adatokkal. Tehát pl egy névhez kéne rendelnem telefonszámot, e-mail címet stb. amit a felhasználótól kér be a program amit majd egy file-ba exportál, ahonnan vissza is lehet tölteni később ezeket az adatokat. Tehát azt nem tudni, hogy a felhasználó mennyi rekordot fog megadni, hány személy adatait fogja létrehozni.
Remélem érthető voltam.
-
Jester01
veterán
válasz
PumpkinSeed #3674 üzenetére
-
sztanozs
veterán
válasz
PumpkinSeed #3671 üzenetére
Ja és a kolléga időben kijavított, mielőtt rögzült volna
-
Jester01
veterán
válasz
PumpkinSeed #3671 üzenetére
Sokat ivott és hülyeségeket írkált
-
sztanozs
veterán
válasz
PumpkinSeed #3660 üzenetére
if(ev % 400 == 0){
/* szökőév */
}
else if(ev % 100 == 0){
/* nem szökőév */
}
else if(ev % 4 == 0){
/* szökőév */
}
else
/* nem szökőév */
} -
kingabo
őstag
válasz
PumpkinSeed #3660 üzenetére
Ne vedd sértésnek, de erre a két esetre kérnék pl-t.
case (400-al osztható 100al nem)
case (400-al osztható 4-el nem)Írd Clipperbe, ott lehet a case-ben ilyet írni.
-
Karma
félisten
válasz
PumpkinSeed #3660 üzenetére
Sajnos C-ben ez nem így működik, a case-eknek konstans értékeknek kell lennie. Na meg a switchbe is számot, vagy annak megfefelő értéket kell odaadni, hogy az alapján ugorjon.
-
kispx
addikt
válasz
PumpkinSeed #3660 üzenetére
case (400-al osztható 100al nem)
case (400-al osztható 4-el nem)
FeleslegesDe hol a 4-gyel oszthatóak?
-
kispx
addikt
válasz
PumpkinSeed #3658 üzenetére
"Én switch case-re gondoltam először.
"
Azt, hogy?Szerintem if
ha (szokoev_feltelei igazak)
szokoev
else
nem szokoevEgyébbként ugyanaz mondtuk a szökőév definíciójának.
-
kispx
addikt
válasz
PumpkinSeed #3655 üzenetére
"Mely évek a szökőévek?
Szökőévek a következők: minden néggyel osztható év, kivéve a százzal is oszthatókat. Szökőévek viszont a 400-zal osztható évek. Vagyis a századfordulók évei közül csak azok szökőévek, amelyek 400-zal is oszthatók."
Igaz, wiki, de most nem lő mellé
-
Davs
tag
válasz
PumpkinSeed #3655 üzenetére
Szokoev az az ev, ami oszthato neggyel maradek nelkul, nem?
szoval 2000, 2004, 2008 szokoevek, 2001-3, 2005-7 nem -
PumpkinSeed
addikt
Nem tud valaki egy alapvető instrukciót adni arról, hogy a szökőéves programmal hogyan induljak el? Azt tudom, hogy 400-al kell oszthatónak lennie és valahogy úgy van, hogy 100-al is és ha nem osztható 100-al akkor 4-el. De erre pontosan nem emlékszem. De viszont nem tudom, hogy hogyan akarna ez kinézni.
(#3654) kispx:
-
kispx
addikt
válasz
PumpkinSeed #3653 üzenetére
Nem az történt.
Hanem, hogy float változot szeretett volna beolvasni a program, de karaktersorozatot kapott. Így a beolvasás sikertelen volt. (Ezt a scanf visszatérési értékkel letudod ellenőrizni). A változók tartalmát nem írta felül, viszont a ciklus újra végrehajtódott. -
Frenky89
addikt
Rendben és elnézést kérek, amiért nem tudtam értelmesen feltenni a kérdésemet.
-
Jester01
veterán
-
Karma
félisten
válasz
Frenky89 #3647 üzenetére
stdint.h-ból az int64_t nem segít? A stackoverflow alapján erre való. Mindenesetre jó hogy említed, milyen fordító a cél
-
eriktoth
tag
Igen, általános egyes léptetés és mondjuk,hogy kiírta a tömb[5]-et akkor azt már ne írj ki, de lehet rossz a gondolat menetem
-
eriktoth
tag
Üdv!
Van a kód:
for(............){
printf("kiir valami %d kiir mas valami %d\n",n,tomb[i]);
}A kérdés pedig, hogy lehetséges-e valahogy megjelölni, hogy melyik elemet írtam már ki, és mondjuk egy másik ciklusban, asztat már ne írja ki?
-
Frenky89
addikt
Sziasztok!
Hogyan tudnék platformfüggetlenül létrehozni egy 64 bit hosszú változót/területet, amire egyben tudnék alkalmazni <<, &, | műveleteket?
-
eriktoth
tag
Üdv! az alábbi módszerrel sikeresen megtalálom egy tömb első két legnagyobb elemét, olyan kérdésem lenne, hogy ezt hogyan lehetne több elemel megcsinálni, mondjuk 10-20 vagy akár 50 elemű tömbbel, hogy maximumtól folyamatosan írja az értékeket:
if(Counter[0]<Counter[1]){
max1=Counter[1];
max2=Counter[0];
}else{
max1=Counter[0];
max2=Counter[1];
}
for(i=0;i<50;i++) {
if(max1<Counter[i]) {
max2=max1;
max1=Counter[i];
}
else if(max2<Counter[i]) {
max2=Counter[i];
}
}
printf("%d %d\n",max1,max2); -
kingabo
őstag
válasz
chabeee #3631 üzenetére
Rosszul állítod be a visszafelé mutató pointert az insert_after-ben. Először át kéne menni az új elemre és annak állítani a prevjét. Jelenleg minden prev saját magára mutat.
nodee->next = (node*)malloc(sizeof(node));
nodee->prev = nodee;
nodee = nodee->next;
nodee->data = data;...
helyettnodee->next = (node*)malloc(sizeof(node));
nodee = nodee->next;
nodee->prev = nodee;
nodee->data = data;szerk: lehet vhogy kiemlést is betenni a kódba? Nekem nem jött össze.
szerk #2: a nodee-n kívül az előtte és az utána jövőnek is karban kéne tartani a pointereit. (sztem célszerű lerajzolni, hogy mit hogy kell átkötni)
-
chabeee
aktív tag
hello agian,
a printback-nél mit rontok el? egyszerüen nem akarja kiírni pedig sztem hiba nincs benne, lessétek meg please:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
int nev;
struct Node *next;
struct Node *prev;
} node;
void insert_after(node *nodee, int data, int nev){
node *start = nodee;
while(nodee->next != start) {
nodee = nodee->next;
}
nodee->next = (node*)malloc(sizeof(node));
nodee->prev = nodee;
nodee = nodee->next;
nodee->data = data;
nodee->nev = nev;
nodee->next = start;
}
void insert_before(node *nodee, int data, int nev){
node *newNode = (node *) malloc(sizeof(node));
newNode->data = data;
newNode->nev = nev;
newNode->next = nodee->next;
newNode->prev = nodee;
nodee->next = newNode;
(nodee->next)->prev = newNode;
}
int find(node *nodee, int key){
node *start = nodee;
nodee = nodee->next;
while(nodee != start) {
if(nodee->data == key) {
return 1; //Element Found!
}
nodee = nodee->next;
}
//Element Not Found!
return 0;
}
void delete(node *nodee,int data){
node *start = nodee;
while(nodee->next != start && (nodee->next)->data != data) {
nodee = nodee->next;
}
if(nodee->next == start) {
printf("Element %d is not presented in the list \n", data);
return;
}
node *temp;
temp = nodee->next;
nodee->next = temp->next;
free(temp);
return;
}
void print(node* start, node* nodee){
if(nodee == start) {
return;
}
printf("%d %d ", nodee->data, nodee->nev);
print(start,nodee->next);
}
void printBack(node* start, node* nodee){
if(nodee == start) {
return;
}
print(start,nodee->prev);
printf("%d %d ", nodee->data, nodee->nev);
}
int main() {
int query;
node *start = (node*)malloc(sizeof(node));
start->next = start;
start->prev = start;
printf("1 - Insert_after\n");
printf("2 - Insert_before\n");
printf("3 - Delete\n");
printf("4 - Print\n");
printf("5 - Print Back\n");
printf("6 - Find\n");
while(1) {
printf("query: ");
scanf("%d", &query);
//insert_to_the_end
if(query == 1) {
int data;
int nev;
scanf("%d", &data);
scanf("%d", &nev);
insert_after(start, data,nev);
}
//insert_to_the_begginning
if(query == 2) {
int data;
int nev;
scanf("%d", &data);
scanf("%d", &nev);
insert_before(start, data,nev);
}
//delete
else if(query == 3) {
int data;
scanf("%d", &data);
delete(start, data);
}
//print
else if(query == 4) {
printf("The list is: ");
print(start,start->next);
printf("\n");
}
//printback
else if(query == 5) {
printf("The list is: ");
printBack(start,start->prev);
printf("\n");
}
//find
else if(query == 6) {
int data;
scanf("%d",&data);
int status = find(start,data);
if(status) {
printf("Elements Found\n");
} else {
printf("Elements Not Found\n");
}
}
}
return 0;
} -
Lacces
őstag
válasz
chabeee #3626 üzenetére
http://thecodecracker.com/c-programming/circular-linked-list/. Vasárnap igazán utána nézhettél volna... Keres rá neten: "circular linked list"
kispx: Mikor érdemes amúgy cirkulált listát használni?
-
Lacces
őstag
válasz
chabeee #3618 üzenetére
Biztos cirkulált listánál akarsz beszúrni az elejére végére?
Lehet én vagyok a buta most, de a cirkulált lista, az egy olyan lista, amelynek nincs eleje se vége... mert körbe láncoltak az elemek... "utolsó" elem az "első" elemre hivatkozik, mint egy népi körtánc... én legalábbis mindig azt hittem ez a cikrulált lista.
-
chabeee
aktív tag
hello,
3 feladatot nem tudok megoldani cirkuláris láncolt listákkal, valaki tudna ebben segíteni?- a lista elemeinek listázása visszafelé;
- elem felvitele a lista elejére
- elem felvitele rendezetten (a lista legyen kulcs szerint növekvő sorrendben).
Megjegyzés: a program a felvitelt csak egyféleképpen engedje meg. Ha az első felvitel rendezett módon történik, akkor ne lehessen később már a lista elejére vagy végére felfűzni. És fordítva, ha az első felvitel nem rendezetten történik, akkor ezt a funkciót később már ne lehessen kiválasztani.main.c
előre is köszönöm
üdv csabi. -
Karma
félisten
Hát egy probléma biztosan van már a main függvényedben és a szignatúrákban: a double**-ot ha függvényben hozol létre, double***-ként kéne a Matrix címét átadni. Ugyanis a jelenlegi formájában NULL marad végig.
Most nem vagyok C fordító közelben, de nem néznéd meg debuggerrel melyik sor száll el? A watch funkció haar rávilágíthat.
BTW nekem a *** kezd bűzleni, nem kéne máshogy megoldanod a kétdimentiós tömböt?
-
Davs
tag
Hali!
Dinamikusan szeretnek a realloc() segitsegevel egy 2D-s double ** tombot csinalni. Az alabbi kod "mtx == NULL"-al kilep (amugy segfaultol).
http://pastebin.com/RSg2dexP
a generatematrix funkciomban lesz szerintem valami baj, de egyszeruen nem latom. Tudnatok ravetni egy pillantast? -
Lacces
őstag
válasz
chabeee #3611 üzenetére
Angol weboldalon a teljeség igénye nélkül a forráskód C-ben a duplán láncolt listához.
Angol, ha nem tudod, akkor fordítsd le magadnak, bőven jó. Ha nem megy, akkor rajzolád le.
Vagy a könyvtár és a Számítógép programozás című könyveket tanulmányozd ezügyben, vagy egy másik magyar nyelvű könyvet, viccen kívül
Ha meg megy az angol, akkor mehet a google kereséslinked list animation. És láss csodát
mint itt (csak várni kell az animácóra
)
-
chabeee
aktív tag
Sziasztok
Tudna-e valaki egy forráskódot adni ami egy kétirányban láncolt fejes, cirkulált listát valósít meg, amiben lehet új elemet felvenni és törölni. Megértés és tanulás érdekében kellene. Ha magyarázatot is tudtok adni hozzá, az lenne a legjobb számomra, de az nem feltétlenül szükséges. Előre is köszönöm!
Üdv. Csabi. -
e=mc²
őstag
válasz
Jester01 #3609 üzenetére
Koszonom szepen, kezdem kapizsgalni!
Megirtam a sajat bekero fuggvenyem, viszont ha minden sort fgets-el kerek be a rendszamhosszt is eggyel meg kellett novelni. Es igy mar mukodik rendesen.
Igaz nem hulyebiztos (tehat ha direkt irnak rosszul bele persze hibas lesz), de nem is ez a cel jelenleg.
-
Jester01
veterán
A scanf("%s") ugyanúgy nem ellenőrzi a hosszt, tehát túlcsordulás veszélyes.
Hogy a program miért nem működik azt már a #3603-ban leírtam. A scanf hagyja a pufferben a sorvéget ezért a rákövetkező fgets üres sort lát. A mostani kóddal ezért a település neve lesz üres.
Az ember azt hinné az adatbevitel egyszerű, de ez sajnos nem így van
Mivel mindenhol sorokat akarsz olvasni, mindenhol fgets kell és máris jó lesz. Persze igazából egy hibakezelős verzió kellene, ami észreveszi, ha több betűt ír be a lökött felhasználó.
Például valami ilyesmi jöhet szóba.
-
e=mc²
őstag
-
e=mc²
őstag
Bocs, hogy ilyet kerdezek, de hogy kell "elnyelni puszta kezzel"?
Most fgets-el probalkoztam, de az eredmeny...
Igazabol szerintem scanf-el kellene valahogy megoldani, mert a tobbi beolvaso fuggvenyt eddig nem hasznaltuk es megemlitve sem voltak...
Az a baj, hogy ertem en a logikajat, de megoldani mar sajna nem mindig megy...
-
Karma
félisten
válasz
Jester01 #3603 üzenetére
Jogos, félreértelmeztem a leírást, amit a gets-ről olvastam. (Csak annyit írt, hogy nem másolja az újsort a kimeneti stringbe, de arról nem szólt, hogy eldobja-e. A szabvány viszont írja.) Nem sűrűn szoktam ilyet használni
Azért az ilyen fővesztéses kikiáltás mellé szerintem elfér, hogy azért tilos, mert 1) nincs túlcsordulás elleni védelem benne és ezért baromira veszélyes és 2) most már deprekálta a szabvány. Hátha jobban rögzül.
-
Jester01
veterán
mert a gets az stdin pufferben hagyja az újsor karaktert
Elvileg (és nálam gyakorlatilag) nem hagyja ott. De a scanf meg amúgy is megeszi automatikusan.Egyébként gets-et tilos használni, fővesztés terhe mellett. Helyette fgets ajánlott.
MOD: Konkrétan a település nevét bekérő scanf hagyja a pufferben a sorvéget, így a gets fog üreset adni és a közterület marad ki, nem a házszám.
-
Karma
félisten
Azért nem kéri be a házszámot, mert a gets az stdin pufferben hagyja az újsor karaktert, amit az enterlenyomás otthagy - így a következő olvasás azt hozza be a felhasználóra várás helyett.
Azt egy külön getcharral el kell nyelned puszta kézzel.
Egyébként a település nevében is lehet ám szóköz.
-
dabadab
titán
Mondjuk abszolut nem ertem, hogy a scanf() miert ilyen nagy liebling a C hazikat felado tanarok kozott - csak a nyug van vele, amugy tok felesleges, nem tanit igazan semmilyen koncepciot meg a valos eletben sem hasznalja a kutya sem. Akkor mar inkabb hasznalnak az argc-t meg az argv-t, ha mar valamit.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- BestBuy topik
- Windows 11
- Milyen processzort vegyek?
- iPhone topik
- Napelem
- Mikrokontrollerek Arduino környezetben (programozás, építés, tippek)
- Hobby rádiós topik
- Változó design, tekerhető lünetta: megjött a Galaxy Watch8 és a Classic
- Pécs és környéke adok-veszek-beszélgetek
- Gaming notebook topik
- További aktív témák...
- HP ProBook 430 G8, 13,3" FHD IPS, I5-1135GU CPU, 16GB DDR4, 256GB SSD, WIN 11, 27% áfás számla, 1 év
- Playstation Portal - 3 hónap Bolti Garanciával
- BESZÁMÍTÁS! ÚJ AMD Ryzen 5600X 5700X 5800X 5900X processzor 3 év garancia 27% áfa termékbeszámítás
- BESZÁMÍTÁS! ÚJ AMD Ryzen 8500G / 8600G AMD Ryzen 7 8700G / 7800X3D processzor 3 év garancia 27% áfa
- Remek áron Lenovo ThinkPad x395 AMD Ryzen 7 pro-3700U/16GB/256 SSD/AMD Radeon Vega 10 Grap/FHD/IPS
- Bomba ár! HP ProBook 450 G10 - i5-1335U I 16GB I 256SSD I 15,6" FHD I Cam I W11 I Garancia!
- Apple iPhone 13 Pro Max 128GB, Kártyafüggetlen, 1 Év Garanciával
- IKEA Format lámpák eladóak (Egyben kedvezménnyel vihető!)
- Hp Prodesk 600 G3/ G5/ G6 SFF-MT / i5 8-9-10 gen, Hp EliteDesk 800 G4 / Win11- Számla, garancia
- Dell Latitude 5495 Full HD IPS Ryzen 5 pro 2500u Radeon Vega Mobile Gfx i5-8350u verő Bp MPL Foxpost
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest