Jump to content
GSForum - Segélyvonal

Programozás C/C++-ban


csutomi

Recommended Posts

Fujitsu

Végül is talán kézenfekvő lett volna nőgyógyásznak tanulni, minekutána úgyis egész nap a "munkadarabon" jár az eszem, de valószínűleg ez nem pont erről szól. :P Viszont azt támogatnám, hogy az urológiai vizsgálatokat fiatal, dekoratív hölgyek végezzék. :D

Link to comment
Share on other sites

TheSaurida

Én a három gyerek során végigültem párszor a sort a nőgyógyászat előtt... hát... (noch dazu, Baranyában). Nem csak csinos fiatal hölgyek ültek ott, sőt. Csoda, hogy van olyan nőgyógyász, aki (ennek ellenére?) megnősül.

<off> Egy másik, régi vicc abból az időből, amikor a fizetést még kápéban kaptuk:

Tömött busz/villamos, egyszer csak egy fiatal nő felszisszen:

- De uram, mit képzel?!

- Ne haragudjon, kisasszony, tévedni tetszik... Ma kaptunk fizetést, elfogyott a papírpénz, berolnizott húszasokban kaptam meg a pénzt, az van a zsebemben, és azt tetszett érzékelni...

- Akkor gratulálok, jó munkahelye van, ha így két megálló között fizetésemelést kapott...

Az urológiai vizsgálatról jutott eszembe.

Nővér: Marikám, vagy hozd ide a szemüvegemet, vagy vizsgáld meg te az urat, mégiscsak fiatalabb vagy nálam húsz évvel.</off>

Link to comment
Share on other sites

Fujitsu

Ejnye, nem szép dolog, hogy itt offolsz. :fetreng:

 

Ha már urológia, nem árt tudni, hogy a prosztata egészségének megőrzésére az egyik legfontosabb módszer, hogy rendszeresen üríteni kell. :) Az urológusok ezt azzal magyarázzák, hogy felépítését tekintve a dülmirigy nagyon hasonló szerv, mint a nyálmirigy, csak utóbbinak megvan az az óriási előnye, hogy rendszeresen üríteni tudja a váladékát a szájüregbe; így azzal nem is nagyon szokott probléma lenni. A prosztatában viszont ott pang az anyag, hamar erjedésnek indul, táptalaja lesz a baktériumoknak, aztán a többi jön magától. Karcinogénnek is tartják úgy mellesleg.

 

Szóval bár a különféle világvallások dogmáinak lefektetői még nem nagyon tudtak erről, azért tudjunk róla, hogy nem valami okos dolog őrizgetni magunkban a miniszterelnököt. ;)

Link to comment
Share on other sites

TheSaurida

Igaz, igaz... mintha csak magam mondtam volna...

Na jó, írjunk gyorsan C/C++-ban egy dülmirigy-ürítő programot.

(A szájüregről is eszembe jutott valami, de hagyjuk.)

Link to comment
Share on other sites

Fujitsu

Megírta már a Jóisten, az a firmware fut az agyunkban. :D A konfig persze egyénenként különbözik kissé. Igaz az is, néhányaknál pár változót kioptimált a fordító...

 

Igen, az ideális az, ha a dülmirigyet is a szájüregbe lehet üríteni, de az egy sokváltozós sztori. Mondjuk ebben az országban erőteljes túlkínálat van hivatásos terapeutákból. :)Ide mondjuk nem ártana áthallgatni egy félévet Erasmusszal.

Link to comment
Share on other sites

TheSaurida

Jóisten = Első Programozó?

Link to comment
Share on other sites

Fujitsu

Első mérnök. :) Erről jutott eszembe a klasszikus vicc, amikor hárman vitatkoznak, hogy ki tervezte az emberi testet:

– Szerintem gépészmérnök volt, nézzétek ezeket a csuklókat, illesztéseket! – így az egyik.

– Szerintem villamosmérnök lehetett, milliónyi elektromos kapcsolatot tervezett bele – mondja a másik.

– Biztos, hogy építész volt – ellenkezik a harmadik. – Ki más tervezné a szennyvízcsatornát a szórakoztatóközpont mellé?

 

Erről meg most az ugrott be, hogy felvettem az elolvasandóim listájára Giulia Endersnek, egy cuki frankfurti medikuscsajnak a könyvét a bélrendszerről (magyarul Bélügyek címmel jelent meg). Kíváncsi leszek, mi újat fogok megtudni. :)

Link to comment
Share on other sites

[OP]Destroy-man

Megírta már a Jóisten, az a firmware fut az agyunkban. :D

Szóval a GC is implementálva van az agyunkba. :P Csak néha (kellő alkohol fogyasztása mellett) szivárogtatja a memóriát is. :D

Link to comment
Share on other sites

  • 4 months later...
kléni
Programozni tanuló gyerekek azt a feladatot kapták, hogy írjanak egy programot, amely beolvas egy pozitív számot (N), és kiírja az annál kisebb pozitív páratlan számokat növekvő sorrendben (ez mindig (int)n/2 darab szám). A kiírt számok között legalább egy szóköz vagy újsor karakter van, és ezenkívül bárhol előfordulhat tetszőleges számú szóköz vagy újsor karakter, de bármilyen más kimenet tiltott (pl. "Kérem N értékét").

 

A gyerekek programjait automatikusan szeretnénk ellenőrizni, ehhez a kimenetüket az ellenőrző programunk standard bemenetére irányítottuk. Az Ön feladata egy olyan C függvény megírása az ellenőrző programhoz, amely eldönti a standard bemenetről, hogy az egy helyes kimenet-e. A függvény paraméterül kapja N értékét, visszatérési értéke pontosan igaz, ha a bemenetről olvasott fájl egy helyes kimenet.

 

Tipp: a scanf függvény visszatérési értéke sikeres beolvasás esetén a behelyettesített változók darabszáma (egy szám beolvasásakor 1), fájl vége esetén EOF.

Már megoldottam a feladatot getchar() használatával. De szerintetek hogyan lehetne ezt a feladatot scanf() alkalmazásával megoldani?

 

Edit: megoldódott. Elég egy scanf("%c", &ch), onnantól meg már ugyanaz, mint a getchar()-os megoldásom. Csak amikor scanf-ben gondolkodtam, akkor %d-re gondoltam, ami átugorná a whitespaceket.

 

(szeretjük a hozzászólás törlési lehetőséget.)

Link to comment
Share on other sites

payskin

Nem kell ezt törölni, hátha hasznos lesz másnak is

Link to comment
Share on other sites

Fujitsu

Ha karakterként olvasol, akkor ahhoz, hogy számot kapj, a karakterekből helyiértékenként össze kell raknod a számot (hiszen nyilván több számjegyű értékek is előfordulhatnak). Magyarán levonsz az éppen olvasott karakterértékből 49-et ('0'-t), és ezt még súlyoznod kell az aktuális helyiérték szerint; és ha végeztél a számmal, ezeket a súlyozott értékeket szummázod. Ez a getcharos út egy szám kinyerésére; de ahogy te használod a scanf függvényt, az is ugyanez. (Ha balról jobbra olvasod a számjegyeket, akkor a súlyozás kicsit bonyolultabb lesz, mert meg kell tudni azt is, hány számjegyből áll a szám.)

 

Ha adott formátumban jönnek a számok a bemenetre (ahogy esetedben is), akkor ez megkerülhető a scanf-fel, amivel egyből számként tudod kezelni az értéket. Ez sokkal egyszerűbb.

Link to comment
Share on other sites

kléni

#include <stdio.h>
int helyes(int n)
{
   char ch;
   char lastCh = ' ';
   int i = -1;
   int j = 1;
   int ls;
   while ((ch = getchar()) != EOF)
   {
       if (ch != ' ' && ch != '\n')
       {
           ls = lastCh == ' ' || lastCh == '\n';
           if (ch < '0' || ch > '9' || (ls && ch == '0'))
               return 0;
           if (ls)
           {
               if (i != -1)
               {
                   if (i != j || j >= n)
                       return 0;
                   j += 2;
               }
               i = 0;
           }
           i *= 10;
           i += ch - '0';
       }
       lastCh = ch;
   }
   return i == (n % 2 ? n - 2 : n - 1);
}
int main(void)
{
   printf("%d\n", helyes(7));
   return 0;
}

Így oldottam meg, és a (ch = getchar()) részt lecserélve scanf("%c", &ch)-ra ugyan úgy menne.

@Fujitsu: tényleg egyszerűbb scanf("%d", &ch)-t használni, de ha egy \t van a két szám között, át fogja ugorni, pedig akkor hibát kell adni. A többi számként formázott beolvasás is így működik, és nem tudok arról, hogy ki lehetne zárni ebből a szóközön és \n-en kívül a többi whitespace karaktert.

Link to comment
Share on other sites

Fujitsu

Mert miért kéne kizárni? Miért kéne hibát dobni a tabulátorra? Ha tetszőleges számú szóközt üthetek két szám között, akkor miért érdekel engem a tabulátor? Micsoda marhaság már ez? :D A scanf nem arra van, hogy karakterenként olvass vele. Az a getchar vagy a getc(stdin). Szerintem itt bizony pont az a lényeg, hogy egyből számként olvass; ezért is írták, hogy a scanf a fájl végén EOF-fal tér vissza.

 

Ha mindenképp így kell megcsinálni, akkor lehet azt, hogy a getcharral olvasok, csekkelem, hogy épp mit; ha épp számot, akkor a számjegyeket benyomom egy sztringbe. Ha véget ért a számolvasás, akkor a sztringből sscanf-fel kikapom a számot, oszt’ jónapot. De persze jó az is, hogy számjegyenként összerakod.

 

Egy jó tanács: ha szoftverrel akarsz foglalkozni, szokj rá arra, hogy olyan kódot írsz, amit rajtad kívül mások is el tudnak olvasni. Általánosságban véve elmondható, hogy a futóindexeket leszámítva nem szeretjük az egy-két karakteres változóneveket, mert a farkam sem tudja, hogy mit akarsz jelölni velük. Olyan elnevezéseket használj, amik rövidek, de egyértelműek – utóbbi a legfontosabb. (Az egyértelműség szkópja pedig azokra terjed ki, akiknek a kódot írod.) Nem lenne egy hátrány az sem, ha zárójeleznéd a kondíciókat.

 

És ha nem muszáj, ne használd a fórum kódbeágyazó funkcióját, mert az egy rakás szar. Inkább használd pl. a pastebint.

Link to comment
Share on other sites

kléni

A feladat kiírásában az van, hogy szóköz vagy újsor. Ki vagyok én, hogy olyan programot írjak, ami ettől eltér? :D

Link to comment
Share on other sites

Fujitsu

Hát én ezt magamban úgy fordítanám, hogy white space; de ha szó szerint értelmezzük, akkor tényleg csak ezek lehetnek. Írd meg mindkét módon, oszt' válasszon a tanár. ;) A karakterenkénti scanf-nek viszont nincs értelme; akkor már inkább használd az sscanf-et, ahogy írtam.

Link to comment
Share on other sites

arpsoft

Namost nekem már a feladat kiírásával gondom akadt.

1. Honnan tudom, hogy helyes az eredmény, ha nem tudom, melyik számot adták meg a gyerekek a programjuknak? Értsd: benne van-e az összes szám a kimenetben.

2. A kiírás szerint bárhol előfordulhat szóköz illetve új sor. Akár a számokon belül is. Honnan tudom, hogy hol kezdődik és hol végződik mondjuk egy 4 jegyű szám, amiben van 2 új sor?

 

Amennyiben ez mind nem így értelmezendő, én előállítanám magamnak a helyes karaktersorozatot úgy, hogy nincs benne egy szóköz meg új sor sem, kiirtanám a bemenetről is ezeket, aztán összehasonlítanám a két eredményt.

Link to comment
Share on other sites

Fujitsu

Az N-t, vagyis hogy melyik számig kell felírni a sort, paraméterül kapja a függvény. Az meg azért elég triviális, hogy a számok számjegyei között nem lehet szóköz vagy új sor, ha egyszer az a szeparátor karakter. Persze lehetne pontosabb a feladat szövege, de engem pl. jobban zavar, hogy nincs kikötve, N értéke mekkora lehet. (Az int, az nekem lehet 2 vagy 4 bájtos is, ráadásul ha csak pozitív egész lehet, akkor unsigned.) De mivel ez valami iskolai feladat lesz, nem érdemes fennakadni most ezeken.

 

A te ötletedhez kell dinamikus memóriakezelés, és ha az N véletlenül egy 32 bites unsigned int, akkor akár (2^32 – 1) / 2 * 4 bájtnyi memória, azaz 8 GB RAM nem is lesz elég. :) Felejtő.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...