Hirdetés

2024. május 19., vasárnap

Gyorskeresés

Hozzászólások

(#851) vassgaby89


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??

(#852) doc válasza vassgaby89 (#851) üzenetére


doc
nagyúr

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 ]

(#853) Jester01 válasza doc (#852) üzenetére


Jester01
veterán

Illetve ami még súlyosabb, hogy a scanf-ben lemaradtak az & (és) jelek.

Jester

(#854) vassgaby89


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?

(#855) doc válasza Jester01 (#853) üzenetére


doc
nagyúr

oops, ez fel sem tunt, erre viszont gondolom siman egybol segfaultol :)

sima c-ben nincs bool valtozo, hasznalj chart vagy intet helyette (0 a hamis, nem 0 az igaz)

[ Szerkesztve ]

(#856) Davey7


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?

(#857) Gyuri16 válasza Davey7 (#856) üzenetére


Gyuri16
senior tag

while (szam != 0 && mertekegyseg != '0')

ez azt mondja, hogy addig csinalja a ciklust, amig egyik se 0, ha te azt akarod hogy addig csinalja amig mindketto egyszerre nem 0 akkor igy:

while (szam != 0 || mertekegyseg != '0')

Nem vagyok egoista, csak uborkagyalu!

(#858) Davey7 válasza Gyuri16 (#857) üzenetére


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... :(((

(#859) Gyuri16 válasza Davey7 (#858) üzenetére


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 kilep

ez -> 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 0

Nem vagyok egoista, csak uborkagyalu!

(#860) Davey7 válasza Gyuri16 (#859) üzenetére


Davey7
senior tag

aha! nagyon köszönöm!
én így csináltam elsőnek azaz (szam==0 && mertekegyseg=='0') csak haver kijavította. csak a !-jel nem volt ott nekem.

ha így írom,hogy : while !( szam == 0 && mertekegyseg == 0) - ez helyes? le fog fordulni?

(#861) Gyuri16 válasza Davey7 (#860) üzenetére


Gyuri16
senior tag

nincs mit
while !( szam == 0 && mertekegyseg == 0)
hat nekem igy hibat dobott, szoval meg egy zarojel kell kore (de erre te is rajossz ha kiprobalod :) )..
while (!( szam == 0 && mertekegyseg == 0))

Nem vagyok egoista, csak uborkagyalu!

(#862) blaces


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 :F
Köszi a segítséget előre is :R

(#863) Gyuri16 válasza blaces (#862) üzenetére


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!

(#864) blaces válasza Gyuri16 (#863) üzenetére


blaces
tag

köszönöm, érthető volt :)

(#865) blaces válasza Davey7 (#860) üzenetére


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.

(#866) Gyuri16 válasza blaces (#865) üzenetére


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 vegre

te azt akarod, hogy akkor legyen false (0) ha mindketto 0
tehat a helyes megoldas szerintem while (szam || mertekegyseg)

Nem vagyok egoista, csak uborkagyalu!

(#867) kokogab


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 ]

(#868) kokogab


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 ]

(#869) Jester01 válasza kokogab (#868) üzenetére


Jester01
veterán

Segítenénk, ha megmondanád mivel akadtál el.

Jester

(#870) kokogab válasza Jester01 (#869) üzenetére


kokogab
csendes tag

hát úgy konkrétan hogy a 15 fokos forgatás az hogy csináljam meg?

(#871) Jester01 válasza kokogab (#870) üzenetére


Jester01
veterán

Az elforgatáshoz a közismert képletet kell használni:
x' = x * cos(fi) - y * sin(fi)
y' = x * sin(fi) + y * cos(fi)

Ez origó körül forgat, ha más pont körül kell, akkor először eltolod az origóba, majd vissza.

Jester

(#872) kokogab válasza Jester01 (#871) üzenetére


kokogab
csendes tag

köszi
Az origoba hogy tolom el?

(#873) Jester01 válasza kokogab (#872) üzenetére


Jester01
veterán

Kivonod az elforgatás középpontját.

Jester

(#874) scorpy02


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!

(#875) Jester01 válasza scorpy02 (#874) üzenetére


Jester01
veterán

mktime függvénnyel. A doksi szerint a konverzió mellékhatásaként kiszámolja többek között a hét napját is :K

Jester

(#876) kokogab válasza Jester01 (#873) üzenetére


kokogab
csendes tag

köszi a segitséget

(#877) Davey7 válasza Jester01 (#844) üzenetére


Davey7
senior tag

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.

(#878) Jester01 válasza Davey7 (#877) üzenetére


Jester01
veterán

Hát mert nem úgy csináltad, ahogy mondtam :P
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

(#879) blaces


blaces
tag

Sziasztok!

Nem tagadom beadandó házifeladat :U 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? :U

(#880) Benmartin válasza blaces (#879) üzenetére


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 ]

(#881) blaces válasza Benmartin (#880) üzenetére


blaces
tag

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 :DD

(#882) Benmartin válasza blaces (#881) üzenetére


Benmartin
senior tag

deklaráld globálisan (mainen kívül) az elso, masodik változót.

(#883) blaces válasza Benmartin (#882) üzenetére


blaces
tag

Köszi, megy! :R

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 :)

(#884) Benmartin válasza blaces (#883) üzenetére


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ő.

(#885) Jester01 válasza Benmartin (#884) üzenetére


Jester01
veterán

%c -vel kell beolvasni és kell elé egy szóköz a formátum stringbe, akkor átugorja a \n-t.
fflush(stdin) nincs, fflush csak kimenetre van, bemenetre nincs.

Jester

(#886) blaces válasza Benmartin (#884) üzenetére


blaces
tag

Köszönöm :K

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 :R

(#887) Benmartin válasza blaces (#886) üzenetére


Benmartin
senior tag

viszont Jester01 még jobbat mondott és igaza is van.

mondjuk ettől még jelen esetben működött fflush(stdin), csak helyből elutasítják a használatát.

[ Szerkesztve ]

(#888) blaces válasza Jester01 (#885) üzenetére


blaces
tag

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?

(#889) Jester01 válasza blaces (#888) üzenetére


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

(#890) Lortech válasza blaces (#881) üzenetére


Lortech
addikt

Csak szépészet:
(1 log feltétel. )döntetlen { ; }
else (3 log feltétel) első nyer {elso++}
{else masodik++}

Thank you to god for making me an atheist

(#891) blaces válasza Jester01 (#889) üzenetére


blaces
tag

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 :DDD 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.

(#892) Lortech válasza blaces (#891) üzenetére


Lortech
addikt

Nem, vmi ilyesmi.
if (e == m) ;
else if ((e == 'k' && m== 'o') || (e == 'o' && m== 'p') || (e == 'p' && m == 'k'))
{elso++;}
else {masodik++;}
}

Thank you to god for making me an atheist

(#893) blaces válasza Lortech (#892) üzenetére


blaces
tag

elméletben értem, de gyakorlatban még nem bírtam megvalósítani ezt. Majd ha kész lesz még kettő akkor visszatérek rá. Kösz.

(#894) blaces


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.

(#895) Jester01 válasza blaces (#894) üzenetére


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

(#896) blaces válasza Jester01 (#895) üzenetére


blaces
tag

köszönöm a segítséget :)

(#897) blaces válasza Jester01 (#895) üzenetére


blaces
tag

véletlenül kétszer küldtem el a hsz-t és nem tom, hogy kell törölni. Bocs.

[ Szerkesztve ]

(#898) Lortech válasza blaces (#894) üzenetére


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

(#899) Jester01 válasza Lortech (#898) üzenetére


Jester01
veterán

Ja, ilyesmi lenne a tömbös. Csak nem jó :P 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 :R ):
* 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án

Jester

(#900) Lortech válasza Jester01 (#899) üzenetére


Lortech
addikt

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

Copyright © 2000-2024 PROHARDVER Informatikai Kft.