Új hozzászólás Aktív témák
-
vassgaby89
csendes tag
ilyen apróságon megakadni :S köszi megvan mostmár
egyébként a szegmentálási hiba mit jelez? mert gyakran találkozom vele :S pl itt is:
#include <stdio.h>
#include <stdlib.h>int main(void) {
int tomb1[256],tomb2[256],i,j,k,l,osszeg1,osszeg2,db1,db2;
printf("Hány elemű az első számsor?\n");
scanf("%d\n",db1) ;for(i=1; i<=db1; i+=1)
scanf("%d", tomb1[i]);printf("Hány elemű a második számsor?\n");
scanf("%d\n",db2) ;for(j=1; j<=db2; j+=1)
scanf("%d", tomb2[j]);osszeg1 = 0;
for(k=1; k<=db1; k+=1)
osszeg1 = (osszeg1 + tomb1[k]);osszeg2 = 0;
for(l=1; l<=db2; l+=1)
osszeg2 = (osszeg2 + tomb2[l]);if (osszeg1 > osszeg2)
printf("%d\n", osszeg1);
else printf ("%d\n", osszeg2);return EXIT_SUCCESS;
}illetve azt szeretném még tudni,h 1 változó több for ciklusban is felhasználható, v csak egyben??
-
doc
nagyúr
válasz vassgaby89 #851 üzenetére
a szegmentalasi hiba azt jelzi hogy valamit elszurtal...
pl. ha olyan indexebe akarsz irni egy tombnek (illetve olvasni belole) ami nincs is neki
pl. mivel itt nem 0-tol, hanem 1-tol toltod a tomboket, ha 256 db erteket akarsz belerakni, az utolso a tomb1[256] lesz, ami mar nem letezik (mivel a 256 elemu tomb az tomb1[0] - tomb1[255]-ig tart)MOD: csak most vettem eszre a masodik kerdest
termeszetesen akarhol, akarhogyan felhasznalhatod, csak figyelj ra hogy ne zavarjon be, tehat tudd hogy eppen mi van benne mikor hasznalod
itt pl. nyugodtan lehet egyetlen ciklusvaltozo a negy helyett[ Szerkesztve ]
-
vassgaby89
csendes tag
köszi a helpeket,sokat segít! a számsorossal meg is vok, még a prímeset gyomrozom.. be akartam vezetni 1 boolean változót és a deklarálásba azt írtam,h "bool prime;" de belekötött :S
nem tod,mi lehet a probléma? -
Davey7
senior tag
.
.
.
int szam, osszeg=0,egesz=0,maradek=0;
char mertekegyseg;
while (szam != 0 && mertekegyseg != '0') {
scanf("%d %c", &szam, &mertekegyseg);
.
.
.ennek a programnak addig kéne beolvasnia a dolgokat amíg 0 0-t nem kap.
ehelyett én írom pl.:
5 t
10 g
165 m
0 gés itt kilép! pedig az van mondva,hogy ha a karakter is 0 akkor lépjen ki. mi lehet a baj?
-
Gyuri16
senior tag
-
Davey7
senior tag
ez fura...
mert ugye az "és" kapcsolat a logikában akkor teljesül,ha mindkettőre teljesül a "vagy" kapcsolatnál pedig vagy az egyikre vagy a másikra teljesül a feltétel.
és nekem most az kell,hogy addig fusson a ciklus amíg mindkettő egyszerre nem 0. szóval szerintem ez "és" kapcsolat.
priviben vagy akár itt elmagyaráznád,hogy miért kell a vagy?mert nem értem...
-
Gyuri16
senior tag
na szoval, nezzuk amit te irtal:
while (szam != 0 && mertekegyseg != '0')
eloszoris: while ciklus addig fut, amig a feltetel igaz.
szam != 0 && mertekegyseg != '0'
ez akkor igaz, ha mindket resz igaz, tehat a szam nem 0, es a mertekegyseg se 0. => ha pl a szam == 0 es a mertekegyseg != 0 (az a pelda amit irtal), akkor ott false && true lesz, ami false, tehat a ciklus kilepez -> while (szam != 0 && mertekegyseg != '0') magyarul: addig fusson a ciklus, amig egyik se nulla
amit te akarsz: nem (szam= 0 es mertekegyseg= 0), ami leirva:
!( szam == 0 && mertekegyseg == 0)
ebbol De Morgan azonossagokkal megkapod amit irtam vagyokkal:
szam != 0 || mertekegyseg != 0
ami szavakban: addig csinald a ciklust amig legalabb az egyik nem 0Nem vagyok egoista, csak uborkagyalu!
-
blaces
tag
Sziasztok!
Van néhány kód aminél nem értem, hogy miért ennyi az eredmény, vagy én nem tudom már nyomon követni,
int i=5, j=0;
while ( --i>0 && j++<5)
printf("%d, %d\n", i, j);Itt i=0, j=4 megoldókulcs szerint, de miért?
int i=0, j=0;
while (i++<5 && j++<5)
printf("%d, %d\n", i, j);Itt i=6, j=5
int i=0
for (i++; ++i<=10; i++)
printf("szöveg");Ez miért csak egyszer fut le? nem 5-ször kéne?
Mert én más megoldásra gondoltam, de az nem jó... lehet rosszul gondolkozom.
Csak jó lenne ha valaki érthetően eltudná magyarázni, hogy miért
Köszi a segítséget előre is -
Gyuri16
senior tag
tudod mi a kulonbseg e ketto kozott: ++i es i++ ?
a masik dolog hogy a c hogyan ertekeli ki a && et.ellenorzeshez tegyel meg egy printf-t a ciklus utan, hogy lasd mi maradt a valtozokban
int i=5, j=0;
while ( --i>0 && j++<5)
printf("%d, %d\n", i, j);ha lefuttatod ezt irja ki:
4, 1
3, 2
2, 3
1, 4
azt jelenti, hogy i=1, j=4, es ekkor megy a feltetelre a whilenal. mivel az i-nel prefixes a --, ezert a i>0 kiertekelese elott egyel csokkenti az erteket, igy i=0 lesz, es mar nem igaz a i>0, tehat a && jel utan mar lenyegtelen mi van, j marad 4.int i=0, j=0;
while (i++<5 && j++<5)
printf("%d, %d\n", i, j);odaig rendben van hogy i=5, j=5. itt jon a kovetkezo iteracio: i<5 nem ervenyes, igy a ciklus mar nem fog vegrehajtodni, de a postfixes ++ a i<5 utan meg teljesul, ezert 6 lesz
int i=0
for (i++; ++i<=10; i++)
printf("szöveg");lefuttattam, nekem 5 szor irja ki..
//remelem ertheto amit irok, mar kicsit faradt vagyok..
Nem vagyok egoista, csak uborkagyalu!
-
blaces
tag
Amúgy ez nem lenne jobb?
while (!(szam && mertekegyseg))
Szerintem erre akart gondolni haver...
Ilyen példát láttam könyvben és én is alkalmaztam egyszerű proginál:
while (a%2 ==0) az ekvivalens ezzel while (!(a%2)) ---> ugyanis !() ilyenkor a ! jel a zárójelben lévő kifejezésnek 0-t ad eredményül ebben a példában. -
Gyuri16
senior tag
en ilyet nem irnak, c-ben lehet ilyennel jatszani, de szvsz nem szep. viszont amit te irtal nem mukodne tobb okbol sem.
eloszoris a mertekegyseg az char es '0' != 0
aztan while (!(szam && mertekegyseg))
ha mindketto int lenne, akkor pl 1&&1 = 1, !1 = 0 (false), tehat a ciklus nem hajtodik vegrete azt akarod, hogy akkor legyen false (0) ha mindketto 0
tehat a helyes megoldas szerintem while (szam || mertekegyseg)Nem vagyok egoista, csak uborkagyalu!
-
kokogab
csendes tag
Hella ez lenne a feladatom és nem nagyon boldogulok vele. Részletek vannak csak nem nagyon akar összeállni. SEGITSETEK!!! Köszi
C-ben kellene megoldani.Egy gépalkatrész, mint merev test mozgását három, koordinátáival adott pontja mozgásával szemléltetjük. Mutassa be e háromszög adott forgáspont körüli forgásának helyzeteit 15º-os eltérésekkel! A három pont és a forgáspont koordinátáit előzetesen billentyűzetről adjuk meg!
[ Szerkesztve ]
-
kokogab
csendes tag
Részketeket már megtudok csinálni belőle mint a háromszög megrajzolása:
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);vagy hogy hogyan kéne nagyából megcsinálni:
key=''
while (key!=q)
{
törli_képernyőt;
kirajzol_háromszög(y,x,z);
számol_ujkordinátát;
readline_vár_egy_billentyűt(key);
}DE vaéahogy nem áll össze az egész. HELP!!!
[ Szerkesztve ]
-
scorpy02
aktív tag
Üdv!
Azt miként tudnám a legegyszerűbben meghatározni, hogy ha megadok egy dátumot pl. 2009.6.21 formában, akkor ez milyen napra esik?
Köszi!
-
Davey7
senior tag
válasz Jester01 #844 üzenetére
Még mindig bajlódok a 4-es feladattal.
Ez a kód jött ki,de nem működik megfelelően:int i,j,k, visszaford, max, index = 0; //az index azt jelenti,hogy hol áll épp az abc-ben
char karakterek = 97;
scanf("%d %d", &visszaford, &max); //itt olvasom be a visszafordulási ill. azt az értéket,hogy meddig írja ki
for (i = 0; i < max; i++) {
for(j=0;j < visszaford;j++) { //ez a rész ír előrefele
printf("%c", karakterek);
karakterek++;
index++;
}
if (index >= visszaford) {
for (k=0; k!=max-visszaford;k++){ //ez pedig visszafele
--karakterek;
printf("%c", karakterek);
}
}
}Itt a program lényeges része,azt tudom,hogy az index-szel van a baj,de nem jövök rá,hogy mi.
-
Jester01
veterán
Hát mert nem úgy csináltad, ahogy mondtam
Egy ciklus kell összesen, nem 3. Viszont kell egy változó ami mutatja éppen le vagy fel mész.
Valahogy így:int lepes = 1;
int index = 0;
for(i = 0; i < max - 1; i++)
{
printf("%c", 'a' + index);
index += lepes;
if (index >= visszaford)
{
index = visszaford - 2; /* a minta szerint a felso fordulopontot csak egyszer irjuk ki */
lepes = -1;
}
if (index < 0) {
index = 0; /*a minta szerint az also fordulopontot ketszer irjuk ki */
lepes = 1;
}
}Jester
-
blaces
tag
Sziasztok!
Nem tagadom beadandó házifeladat A lenti kódból látszik is, hogy milyen kezdő vagyok...
A feladat ez akar lenni: Írj programot, amely a népszerű kő-papír-olló játék végeredményét segít eldönteni! Ezt a játékot ketten játsszák és több körből áll. A program írja a standard outputra, hogy melyik játékos nyert! Ha az első, a kimeneten az "elso" szó jelenjen meg, ha a második, akkor a "masodik", ha pedig döntetlen lett a játék végeredménye, akkor a "dontetlen" szó! (A körök összesített eredményét kell kiíratni.) A program bemenetként megkapja a körök számát, majd utána soronként két betűt, szóközzel elválasztva. Ez a két betű jelenti az első, ill. a második játékos választását (k - kő, p - papír, o - olló). Mindig az nyeri a kört, akinek a választása "erősebb" a másik játékosénál (a kő kicsorbítja az ollót, az olló elvágja a papírt, a papír becsomagolja a követ).
példa bemenetre:
3
p k
k o
p p
erre a kimenet: elso#include <stdio.h>
int main(){
int n, elso, masodik;
char p, k, o;
int i=1;
int elsonyer=0;
int masodiknyer=0;
scanf("%d", &n);
while(i<=n){
scanf("%c %c", &elso, &masodik);
if(elso=='p' && masodik=='k')
elsonyer+=1;
else if(elso=='p' && masodik=='o')
masodiknyer+=1;
else if(elso=='k' && masodik=='p')
masodiknyer+=1;
else if(elso=='k' && masodik=='o')
elsonyer+=1;
else if(elso=='o' && masodik=='p')
elsonyer+=1;
else if(elso=='o' && masodik=='k')
masodiknyer+=1;
i++;
}
if (elsonyer>masodiknyer)
printf("elso\n");
else if (elsonyer<masodiknyer)
printf("masodik\n");
else
printf("dontetlen\n");
return 0;
}A körök számát bekéri, aztán beadom neki, hogy:"p k" nyomok egy entert, erre eredményül azt írja ki, hogy döntetlen
Hol lehet a hiba?
-
Benmartin
senior tag
szia!
a gond a beolvasással van, a két számláló változód végig nulla marad, vagyis egyik feltétel sem teljesül a programod futása során.
a gond a scanf("%c %c")-el van ugyanis egy lehetséges "p k" input beütésénél a programod egy "p k\n" stringet kap meg, amit nem tudsz feldolgozni "%c %c"-vel.
megoldás: scanf("%s %s",&elso,&masodik);
ja és: elso, masodik típusa char legyen, ne int.
üdv.
[ Szerkesztve ]
-
blaces
tag
válasz Benmartin #880 üzenetére
Szia!
kijavítottam (így értettem a javítást):
#include <stdio.h>
int main(){
int n;
char elso, masodik, p, k, o;
int i=1;
int elsonyer=0;
int masodiknyer=0;
scanf("%d", &n);
while(i<=n){
scanf("%s %s", &elso, &masodik);
if(elso=='p' && masodik=='k')
elsonyer+=1;
else if(elso=='p' && masodik=='o')
masodiknyer+=1;
else if(elso=='k' && masodik=='p')
masodiknyer+=1;
else if(elso=='k' && masodik=='o')
elsonyer+=1;
else if(elso=='o' && masodik=='p')
elsonyer+=1;
else if(elso=='o' && masodik=='k')
masodiknyer+=1;
i++;
}
if (elsonyer>masodiknyer)
printf("elso\n");
else if (elsonyer<masodiknyer)
printf("masodik\n");
else
printf("dontetlen\n");
return 0;
}De még mindig ugyanaz a baja...
Viszont ha scanf("%c %c",&elso, &masodik)-ot használok, akkor hajlando másodjára is bekérni a karaktereket, de ugyanúgy döntetlent ír ki
-
blaces
tag
válasz Benmartin #882 üzenetére
Köszi, megy!
Miért kellett globálisan deklarálni? Valahányszor csináltunk valamit a laboron, akkor mindig main-en belül volt a deklarálás, meg a globális változónak úgy tudom akkor van jelentősége ha több függvényt használok.
és a scanf("%s %s", &elso, &masodik)-nál azért kellett %s %c helyet, mert a %s után karakterlánc (elso, masodik van), és nem pedig egy karakter( pl: a, b)?
Csak szeretném érteni, miért így jó a program
-
Benmartin
senior tag
globális meg lokális deklaráció között a foglalás helyében van nagy különbség (előbbi RAM, utóbbi verem).
igazából nem tudok magyarázatot adni, hogy miért ment globálisan deklarált változónál (bár sejtem: valószínűleg %s-nél megpróbálta beleírni a '\0' karaktert a pointer végére és az egyik allokációnál sikerült a másiknál meg nem, talán ez lehet). mindenesetre a megoldás, amit mutattam nem túl szép, pontosan amiatt, hogy igazából nem szabadna char-ba %s-el olvasni, mert string beolvasásnál +1 karakter mindig kell a végére (emiatt lehet túlcsordulás).a scanf("%c %c")-vel az a probléma, hogy amikor beolvasol bármit az inputról, akkor jön vele mindig egy '\n' karakter az enter miatt és ezt nem tudod hol eltárolni, szóval bennemarad billpufferban, a következő beolvasásnál meg szépen előveszi a puffer tartalmat és beleteszi a változódba, viszont ha kiüríted ezt a puffert, akkor rendesen fog működni a beolvasás.
a szabványos inputra (stdin) kell meghívnod az fflush függvényt, szóval a while előtt, majd minden scanf("%c %c") olvasás után hajtsd végre a következő utasítást: fflush(stdin), ezáltal eltűnnek a pufferból az input végén "varakozó" soremelés karakterek.
remélem segítettem és érthető.
-
blaces
tag
válasz Benmartin #884 üzenetére
Köszönöm
A while és a scanf közé raktam az fflush(stdin) függvényt
while(i<=n){
fflush(stdin);
scanf("%c %c",&elso,&masodik);és így simán ment %c-vel is, és köszönöm hozzá a magyarázatot érthető volt és sokat segített! Ekkor már ugye nem volt a %s-es hiba így elkezdtem kísérletezni.
Kiszedtem a globális változókat (char elso, masodik) és beraktam a main()-be. És érdekes módon ment! Hibátlanul
-
blaces
tag
válasz Jester01 #885 üzenetére
köszi a segítséget mindkettőtöknek!
scanf(" %c %c",&elso,&masodik); - így tényleg megy.
jelenleg két könyvet olvasok át ez ügyben, de nem találtam ehhez hasonló példát, ahol két karaktert olvass be, vagy hogy miért kell szóköz oda, vagy mit hogyan befolyásolja a /n ezt az egészet.
Szóval nálam a hiba a /n miatt volt, ami az okozta, hogy ha egy sorból kellett olvasnia két karaktert, akkor az első karakter után berakott egy sortörést, és a scanf a második sorból akarta olvasni a második karaktert? és emiatt valamilyen túlcsordulás történt?
-
Jester01
veterán
Ahogy Benmartin írta, az a baj, hogy az enter amit a felhasználó lenyom szintén bekerül a pufferbe. A %c önmagában nem ugorja át a whitespace-t (mi ennek a magyar neve?) de a szóköz az igen.
Tehát pl. ha a következő két sort adta be a felhaszáló: A<szóköz>B<enter>C<szóköz>D<enter> akkor a "%c %c" mit csinál? Berakja az A-t az első változóba, a szóköz miatt átugorja a bemenetben lévő szóközt, majd a B-t berakja a második változóba. Eddig szép és jó. Na de ha most még egy "%c %c" olvasás következik, az szembetalálja magát a pufferben lévő soremeléssel és azt teszi be az első változóba a C helyett. A formátumban lévő szóköz most a C karakterrel foglalkozik, de mivel az nem whitespace ezért nem történik semmi. A második változóba ezután szépen bekerül a C a D helyett. Ha viszont van egy szóköz a formátum elején is, akkor az megeszi a soremelést és minden megint jó.
Jester
-
blaces
tag
válasz Jester01 #889 üzenetére
kösz, így értem, hogy miért volt rá szükség. A példával eltudom már képzelni a próblémát.
Lortech nekem ez már egy picit magas habár gondolom hogy valami olyasmit akartál írni, hogy az elsonyer+=1 helyett elsonyer++ használjak. A többi részt nem nagyon értettem a szépítésnek, bocsi.
Meg jobb az ha csak annyit finomítok rajta amennyit értek, mert ha meg kell védeni a progit (van valami plágium ellenörző) akkor eltudjam magyarázni. De szívesen megtanulnám a rövidebb(szebb) formákat is. -
blaces
tag
Ez meg egy másik beadandó, én így tudtam értelmezni és megoldani... de ez olyan is...
A feladat ez:
[I]Írj programot, amely a standard inputról olvas karaktereket az EOF fájlvége jelig, és kiírja a képernyőre a bemenetnek megfelelő "mobiltelefonos kódolást", vagyis azt, hogy melyik gombot hányszor kell lenyomnunk, ha egy mobiltelefon segítségével szeretnénk előállítani az adott karaktersorozatot! A betűk elhelyezkedése a következő: (mint a mobil telefon)Az adott gomb száma annyiszor jelenjen meg a kimeneten, ahányszor azt le kell ütnünk! Például, ha az 5-ös gombot kell megnyomnunk háromszor, a program ezt 555-tel jelezze! Új billentyű lenyomásakor az előző és az új között ne legyen az outputon szóköz, csak abban az esetben, ha ismét ugyanaz a gomb következik, amelyet ezt megelőzően használtunk! A kis- és nagybetűk között nincs különbség.
Pl:
bemenet:Szauervein Szabolcs
kimenet: 777799992883377788833444661777799992 226665552227777 [/I]#include <stdio.h>
int main() {
char nev[10000];
int i=0;
int j=0;
gets(nev);
while(i<(strlen(nev))){
if (nev[i]=='a' || 'A') {
if (nev[i-1]=='a' || 'A' || nev[i-1]=='b' || 'B' || nev[i-1]=='c' || 'C') {
printf(" "); }
printf("2"); }
else if (nev[i]=='b' || 'B') {
if (nev[i-1]=='b' || 'B' || nev[i-1]=='a' || 'A' || nev[i-1]=='c' || 'C') {
printf(" "); }
printf("22"); }
else if (nev[i]=='c' || 'C') {
if (nev[i-1]=='c' || 'C' || nev[i-1]=='a' || 'A' || nev[i-1]=='b' || 'B') {
printf(" "); }
printf("222"); }
else if (nev[i]=='d' || 'D') {
if (nev[i-1]=='d' || 'D' || nev[i-1]=='e' || 'E' || nev[i-1]=='f' || 'F') {
printf(" "); }
printf("3"); }
else if (nev[i]=='e' || 'E') {
if (nev[i-1]=='e' || 'E' || nev[i-1]=='d' || 'D' || nev[i-1]=='f' || 'F') {
printf(" "); }
printf("33"); }
else if (nev[i]=='f' || 'F') {
if (nev[i-1]=='f' || 'F' || nev[i-1]=='d' || 'D' || nev[i-1]=='e' || 'E') {
printf(" "); }
printf("333"); }
else if (nev[i]=='g' || 'G') {
if (nev[i-1]=='g' || 'G' || nev[i-1]=='h' || 'H' || nev[i-1]=='i' || 'I') {
printf(" "); }
printf("4"); }
else if (nev[i]=='h' || 'H') {
if (nev[i-1]=='h' || 'H' || nev[i-1]=='g' || 'G' || nev[i-1]=='i' || 'I') {
printf(" "); }
printf("44"); }
else if (nev[i]=='i' || 'I') {
if (nev[i-1]=='i' || 'I' || nev[i-1]=='g' || 'G' || nev[i-1]=='h' || 'H') {
printf(" "); }
printf("444"); }
else if (nev[i]=='j' || 'J') {
if (nev[i-1]=='j' || 'J' || nev[i-1]=='k' || 'K' || nev[i-1]=='l' || 'L') {
printf(" "); }
printf("5"); }
else if (nev[i]=='k' || 'K') {
if (nev[i-1]=='k' || 'K' || nev[i-1]=='j' || 'J' || nev[i-1]=='l' || 'L') {
printf(" "); }
printf("55"); }
else if (nev[i]=='l' || 'L') {
if (nev[i-1]=='l' || 'L' || nev[i-1]=='j' || 'J' || nev[i-1]=='k' || 'K') {
printf(" "); }
printf("555"); }
else if (nev[i]=='m' || 'M') {
if (nev[i-1]=='m' || 'M' || nev[i-1]=='n' || 'N' || nev[i-1]=='o' || 'O') {
printf(" "); }
printf("6"); }
else if (nev[i]=='n' || 'N') {
if (nev[i-1]=='n' || 'N' || nev[i-1]=='m' || 'M' || nev[i-1]=='o' || 'O') {
printf(" "); }
printf("66"); }
else if (nev[i]=='o' || 'O') {
if (nev[i-1]=='o' || 'O' || nev[i-1]=='m' || 'M' || nev[i-1]=='n' || 'N') {
printf(" "); }
printf("666"); }
else if (nev[i]=='p' || 'P') {
if (nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q' || nev[i-1]=='r' || 'R' || nev[i-1]=='s' || 'S') {
printf(" "); }
printf("7"); }
else if (nev[i]=='q' || 'Q') {
if (nev[i-1]=='q' || 'Q' || nev[i-1]=='p' || 'P' || nev[i-1]=='r' || 'R' || nev[i-1]=='s' || 'S') {
printf(" "); }
printf("77"); }
else if (nev[i]=='r' || 'R') {
if (nev[i-1]=='r' || 'R' || nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q' || nev[i-1]=='s' || 'S') {
printf(" "); }
printf("777"); }
else if (nev[i]=='s' || 'S') {
if (nev[i-1]=='s' || 'S' || nev[i-1]=='r' || 'R' || nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q') {
printf(" "); }
printf("7777"); }
else if (nev[i]=='t' || 'T') {
if (nev[i-1]=='t' || 'T' || nev[i-1]=='u' || 'U' || nev[i-1]=='v' || 'V') {
printf(" "); }
printf("8"); }
else if (nev[i]=='u' || 'U') {
if (nev[i-1]=='u' || 'U' || nev[i-1]=='t' || 'T' || nev[i-1]=='v' || 'V') {
printf(" "); }
printf("88"); }
else if (nev[i]=='v' || 'V') {
if (nev[i-1]=='v' || 'V' || nev[i-1]=='t' || 'T' || nev[i-1]=='u' || 'U') {
printf(" "); }
printf("888"); }
else if (nev[i]=='w' || 'W') {
if (nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='y' || 'Y' || nev[i-1]=='z' || 'Z') {
printf(" "); }
printf("9"); }
else if (nev[i]=='x' || 'X') {
if (nev[i-1]=='x' || 'X' || nev[i-1]=='w' || 'W' || nev[i-1]=='y' || 'Y' || nev[i-1]=='z' || 'Z') {
printf(" "); }
printf("99"); }
else if (nev[i]=='y' || 'Y') {
if (nev[i-1]=='y' || 'Y' || nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='z' || 'Z') {
printf(" "); }
printf("999"); }
else if (nev[i]=='z' || 'Z') {
if (nev[i-1]=='z' || 'Z' || nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='y' || 'Y') {
printf(" "); }
printf("9999"); }
else if (nev[i]=='0') {
if (nev[i-1]=='0') {
printf(" "); }
printf("0"); }
else if (nev[i]==' ') {
printf("1"); }
i++;
}
}
printf("\n");
return(0);
}Az a baj, hogy most sulis gépen vagyok... itt csak devc++ van, és a printf előtt valami szintaktikai hibát jelezz. Előtte majdnem jó volt a program, csak akkor minden egyes megegyező karakter elé szóközt rakott ki... Nem tudom mi a gond.
Másik megoldásom az lett volna, hogy karaktertömböt hozok létre, és akkor azon megy egy keresés. De viszont ennél nem volt ötletem, a szóköz (space) próblémára, hogy azt hogyan valósítsam meg.
-
Jester01
veterán
Van egy felesleges bezáró kapcsos zárójeled és hiányzik egy #include <string.h> Ettől mondjuk még nem működik, de legalább lefordul.
Ezek így nem jók: if (nev[ i ]=='a' || 'A') helyette if (nev[ i ]=='a' || nev[ i ] == 'A') kell. Így talán jó lesz.
Amúgy a tömbös megoldásnál egyszerűen mejegyzed mi volt az előző lenyomott gomb és ha a mostani ugyanaz, akkor kiteszed a szóközt.
[ Szerkesztve ]
Jester
-
Lortech
addikt
jó sok if. nekem valami ilyesmi szimpibb lenne.
char * tomb[] = {"2\0", "22\0", "222\0","3","33","333","4","44",
"444","5","55","555","6","66","666","7","77","777","7777","8",
"88","888","9","99","999","9999"};
int abetu = 'a';
int Abetu = 'A';
char nev[10000];
gets(nev);
int i = 0;
//* char elozo=0;
while(i<(strlen(nev)))
{
if (i > 0 && nev[i] == nev[i-1]) {printf(" "); }
//*vagy if (elozo == nev[i]) {printf(" ");}
//* elozo = nev[i];
if (nev[0] < abetu) {printf("%s",tomb[nev[0]-Abetu]);}
else {printf("%s",tomb[nev[0]-abetu]);}
i++;
}Thank you to god for making me an atheist
-
Jester01
veterán
Ja, ilyesmi lenne a tömbös. Csak nem jó Mert azt kell nézni, hogy a leképezett számjegy ugyanaz-e mint az előző, nem pedig a betű. Ha "a" betű után jön "b" betű, akkor is kell a szóköz, ugyebár. Becsúszott néhány nev[0] a nev [ i ] helyett, de ez gondolom csak elírás, ugyanúgy mint a felesleges \0 a tömbben.
Ha nagyon kötözködni akarnék akkor további észrevételek (nem rosszindulatból ):
* az a tömb igazából const char* tomb[] kellene legyen
* A gets annyira rossz, hogy a gcc szól is érte (fgets helyette)
* while feltételbe strlen nem jó ötlet hatékonyság miatt
* printf helyett fputs/fputc és tsai (ha egyszer semmi formázás nincs, akkor minek a printf)
* toupper/tolower valamelyike (vagy ha nagyon trükkös valaki, akkor bit művelet)
*.ellenőrizni kellene, hogy betű jött-e egyáltalánJester
-
Lortech
addikt
válasz Jester01 #899 üzenetére
Ez elég tesco gazsdaságos program lett tényleg, egy pár szemetet beleraktam a már meglévők mellé is (/0, nev[0]). De a lényeg részemől valami finesz belevitele volt a logikába, az ebből a szempontból lényegtelen és hibás részeket egy az egyben átvettem, ha megnézed.
-áhá, az ismétlős tényleg így működik. Több mint egy éve nem írtam hagyományos telefonon, el kellett volna olvasni a feladatot.
-const: nekem mindegy, van jelentősége azonkívül, hogy tényleg konstansként van használva és odakívánkozik a const ?
-gets és tsai: másoltam, nem értem, miért tanítják ezeket az elavult és kerülendő dolgokat a diákoknak. pl. [link]
-strlen: másoltam, tényleg ki kéne váltani egy azonnali értékkel.
-printf: szintén.
-toupper: az jogos, egy-két sor megspórolható.
-szám / egyéb nekem úgy tűnik, nem volt feladat. Persze input vizsgálat kéne.Thank you to god for making me an atheist
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- ZOTAC GeForce GTX 1080 AMP Edition 8GB GDDR5X 256bit
- Filmes gép gyűjtemény
- Nikon D5000 + AF-S DX NIKKOR 18-105 mm
- Bontatlan Seagate & Western Digital HDD-k 3TB - 12TB -ig - Számla + Garancia, Ár alatt! BeszámítOK!
- DJI Mini 4 pro FMC drón - 3 akku, RC2 táv, 2 táska, Filterek, 2025. decemberig garancia, DJI Care