Jump to content
GSForum - Segélyvonal

Programozás C/C++-ban


Recommended Posts

Posted

Lex, ha nem nagy meló, nem csinálnád meg az egyik föggvényemmel a példa kedvéért? Elküldöm a forrást, ha kell. Azért kérem ilyen szájbarágósan, mert nem készítettem még moduláris programot, fogalmam sincs hogy álljak neki. Annyit tudok, hogy csak egy main() fv. lehet benne.

Posted

Az eredeti verzió:

---- Saját.c

void my_strcpy(char * ide, char* ezt)

{

for (int i=0; ide=ezt; i++);

}

======================

A header file-os verzió:

-------- Saját.c

#include "fvtár.h"

 

int main(void)

{

char alma[]="12345";

my_strcpy(alma, "korte");

return 0;

}

---------- fvtár.h

void my_strcpy(char * ide, char* ezt);

 

---------- fvtár.c

#include "fvtár.h"

void my_strcpy(char * ide, char* ezt)

{

for (int i=0; ide=ezt; i++);

}

=================

A linkelést neked kell beállítani, A MinGW Developer Studio-t nem ismerem, annak idején Dev C++-szal dolgoztam, amiben Mingw fordító volt.

A lényeg, hogy a saját és fvtár is a projektedhez legyen rakva, ha projektekkel dolgozik a Mingw. Egy Developer Studio elnevezésbõl ennyi minimum dukál.

Posted

@horukk:

Próbáld meg úgy elképzelni az #include "fajlnev.h"-t, hogy ugyanazt csinálja, mintha te a .c programodba ehelyett a sor helyett copy-paste-tel egyszerûen bemásoltad volna a falnev.h tartalmát. ;)

 

Ja, egyébként az #include "valami" és #include <valami> között az a különbség, hogy az elõbbinél a fordító a saját könyvtáradban keresi a fájlt, az utóbbinál pedig az include könyvtárban, ahol a többi is (pl: stdio.h) van.

Posted

Kösz a segítségeket. Próbálok összehozni belõlük valamit.

 

Másik kérdés: printf()-el nem tudok ékezetes betûket írni, de fprinf()-el igen. A fordító miatt lehet vagy a c nem tud ékezetet kezelni?

 

Következõ: itt ez a végtelen ciklus.

 

for(i=1;i<=35;i++){

printf("\n\t%2d",i);

if(i==35){

i=0;

}

}

Hogyan lehetne véget vetni neki billentyû lenyomásra? (pörögjön a számsor, majd mondjuk space lenyomására írja ki i értékét) Ha beleépítem a getch() fv.-t, úgy nem jó. Szerintem modulárisan lehetne csak megcsinálni.

Posted

Tökéletesen mûködik a saját header fájl a project könyvtárból és a standard lib-bõl is. :) Annyiban módosítottam Lex helpjét, hogy fvtár.c-t nem használtam, hanem fvtár.h-ban van a fv.törzs is. Persze az eredeti help is tökéletesen mûködik.

 

csutomi elõbbi hozzászólását azzal egészíteném ki, hogy #include"" esetén a saját könyvtárban és a standard lib-ben egyaránt keresi a fájlt, míg #include<> esetén csak a std lib-ben.

Posted
#include"" esetén a saját könyvtárban és a standard lib-ben egyaránt keresi a fájlt

Igen, ez tökéletesen igaz, köszi a helyesbítést.

 

Az ékezetes betûk a Windows miatt vannak. Linux vagy DOS alatt tökéletesen mûködnek. Próbáld meg egy DOS-os szövegszerkesztõvel beírni az ékezeteket. (pl: a dos parancssorba írd be, hogy edit, aztán töltsd be a fájlodat szerekeszd át és mentsd el) Így mûködni fog.

 

Használj egy másik függvényt: int kbhit (void);

Ha nincs billentyû leütés, akor nulla a visszatérési értéke.

A conio.h-ban van benne, remélem olyanod van.

A ciklusból való kilépéshez pedig a break; kifejezést.

 

 

Egy tipp: A programkód idézéséhez használd a CODE gombot, így könnyebben el tudjuk olvasni a mûvedet. ;)

Posted

Ciklusváltozót a cikluson belül nem célszerû módosítani, mert késõbb hibákhoz vezethet. Ha végtelen ciklust akarsz, akkor a for 3. részét (i++) hagyd el, és akkor nem növeli i értékét. Mivel itt szükséged van i növelésére, ezért a for ciklus köré még egy ciklust (for, do, while) kell illeszteni, vagy i-t nem ciklus változóként használni, hanem sima változóként, amit egy billentyûzet vizsgáló ciklusba (lásd csutomi hsz-át) raksz és növelsz, ill. vizsgálsz.

Az ékezetekhez. Gondolom, a Mingw mellett nem akarsz DOS-os szerkesztõt használni. Szerintem a szerkesztõdben be lehet állítani, hogy milyen kódlappal kezelje a szövegeidet. Attól függõen, hogy XP v. 98 parancssort használsz, ezt magyar Windows-ra kell állítani (1250) vagy 852-es DOS-ra. Ha ez sem segít, akkor a Win32 API-ban vannak konvertáló függvények (AnsiTo...ToAnsi).

Nem tudom, van-e könyved C-rõl. Ha nincs célszerû beszerezni, mert alaposabb és jobb felépítésû ismereteket szerezhetsz belõle, mint a netrõl. Sima C (nem C++) alapmû a Brian W. Kernighan, Dennis M. Ritchie: A C programozási nyelv. Elég érthetõen és nem túl hosszan magyarázzák el a lényeget. Õk találták ki a C-t tehát elég kompetensek a témában. :)

Posted

#include <conio.h>

int i=0;

void main(void)
{
  while(!kbhit())
    if(++i>35)i=0;
  printf("\n%2d\n",i);
}

 

Ez igazán C-ül van. A while addig fut, ameddig nem ütsz le egy bilentyût.

A ciklusban egy if van, ami elõször megnöveli az i változó értékét, aztán összehasonlítja a 35-tel, ha nagyobb, akkor nullázza.

Posted
Elég érthetõen és nem túl hosszan magyarázzák el a lényeget. Õk találták ki a C-t tehát elég kompetensek a témában. :)

Hát, aki abból a könyvbõl megtanulja a C-t, megemelem a kalapom elõtte. Tudom, hogy az a Biblia a C programozók számára, és 15 éve ahányszor találkozom, mindig olvasgatok belõle, csak az a baj, hogy egy könyvnek nem lehet kérdéseket feltenni, a példák meg ANSI C-ben vannak, ami nem biztos, hogy lefordul azon a compileren, ami épp a kezed ügyében van. A könyv nyelvezete sem könnyíti meg a dolgot, elég gyorsan el lehet hagyni a fonalat.

 

De ha van valaki, vagy egy Segélyvonal fórum, ahonnan választ kaphatsz a kérdéseidre, úgy egészen más. ;)

Posted

Én még nem láttam olyan compilert, amin az ANSI C ne fordult volna le. :pislog:

Posted

Köszönöm. int kbhit (void) fv.-nyel megtudtam csinálni.

Az ékezeteket nem tudtam beállítani a MinGw-ben, de az legyen a legnagyobb bajom.

Könyvem csak elektronikus formában van néhány, köztük az említett is megvan. De azokból nem kaptam választ ezekre a kérdésekre. Ez a fórum hatékonyabb :)

Ha lesz kérdés, jövök még!

Posted

@Balázs:

Jössz nekem egy kalapemeléssel. :D

Egy könyvnek valóban nem lehet kérdéseket feltenni, de ahhoz, hogy kérdezni tudj, szükségesek az alapok. A K&R könyv szerintem nem bonyolult. Igaz nem lehet olyan szaporán olvasni, mint a Nagy indiánkönyvet. :) A könyv sok kérdést tisztába tesz és megérthetõ belõle sok összefüggés. És jó példák vannak benne.

 

Én se láttam még olyan fordítót, ami ne ismerte volna az ANSI C-t. Most nem a C++-ról beszélünk, aminek ANSI megvalósítását valóban nem sikerült tökéletesen megcsinálniuk a fejlesztõknek. A C++ sokkal elvontabb. A C elég egzakt, így könnyebb programozni.

Posted

Lett kérdés. Mégpedig ez: fájlból milyen fv.-nyel lehet stringeket kiolvasni? Konkrétabban: fájlba kiírattam a különbözõ tipusú változók tartalmát (karaktertömbök és sima int változók). A fájlban ezek szóközzel vagy tabulátorral vannak elkülönítve egymástól. Több sorba kerültek. Vissza szeretném nyerni õket változókba az eredeti típusok szerint.

Posted
@Balázs:

Jössz nekem egy kalapemeléssel. :D

Egy könyvnek valóban nem lehet kérdéseket feltenni, de ahhoz, hogy kérdezni tudj, szükségesek az alapok.

Nincs kalapemelõs smiley-nk, kapsz helyette bravót. :D:bravó:

 

Tény, amikor nekem 90-ben ebbõl kellett volna megtanulnom C-ül, csak a C64-es BASIC és assembly volt a fejemben, és ez kevés volt ahhoz, hogy megértsem. Ráadásul senki nem volt, aki elmagyarázta volna, és a példaprogramok nem futottak az akkori Turbo C alatt. (ANSI nem ANSI, nem futott). Elég gyorsan feladtam. Aztán késõbb, amikor már belém vertek egy kis programozói szemléletet, és volt mögöttem néhány év tapasztalat, újra találkoztunk, de akkor sem lettünk barátok.

 

Most az az érdekes szituáció állt elõ, hogy évente egyszer összefutunk: decemberben mikor kimegyek egy hétvégére az Bécsországban élõ barátokhoz, a vendégszobában fent van a polcon. Ezt szoktam olvasgatni elalvás elõtt. És még most is az az érzésem, hogy a 10. oldal után minden mondatot kétszer-háromszor el kell olvasnom ahhoz, hogy biztos legyek benne, értem, amit olvasok. :)

 

Hát ilyen baráti viszonyt ápolok Kernighan és Ritchie urakkal. :P Elnézést kérek, ezért a kis intermezzóért.

Posted
Lett kérdés. Mégpedig ez: fájlból milyen fv.-nyel lehet stringeket kiolvasni? Konkrétabban: fájlba kiírattam a különbözõ tipusú változók tartalmát (karaktertömbök és sima int változók). A fájlban ezek szóközzel vagy tabulátorral vannak elkülönítve egymástól. Több sorba kerültek. Vissza szeretném nyerni õket változókba az eredeti típusok szerint.

Kéne a kód, amivel kiraktad a fájlba az adatokat.

Posted

@horukk:

Gondolom, az fprintf megfelelõjét keresed. Én így csinálnám a visszaolvasást:

fájlnév: FAJLOM.DAT
tartalma: Ez az én 1 fájlom.
-------------------------------
fájlnév: beolvas.c
tartalma:
#include <stdio.h>

int main (void)
{
  char ez[3], az[3], en[3], fajlom[7];
  int egy;
  FILE *f;
 
  f = fopen("FAJLOM.DAT", "rt");
  fscanf(f, "%s%s%s%d%s", ez, az ,en, &egy, fajlom);
  fclose(f);

return 0;
}

 

(Nem kezeltük itt azt az esetet, amikor nem lehet megnyitni a fájlt.)

Ezt már tudod általánosítani. Például többsoros fájlra.

 

@Spányik Balázs:

Nem vagy egyedül a könyvvel kapcsolatban. Szerintem sem földi halandóknak való, inkább olyan matematikus féléknek. :P

Posted

Mostanában így lestrapálva én sem ilyesmit olvasok esténként. De délelõtt, frissen, lehet használni. Ez a könyv volt a C "tankönyvünk" a fõiskolán úgy 15 éve. Mivel akkor más nem volt, örültünk ennek is. Én Turbo C-ben írtam a szakdolgozatomat és mennek rajta a példák, legfeljebb beállítási gondok lehettek nálad. De - gondolom - így 15 év távlatából, ez már édes mindegy.

Bocs az :off_mérges: -ért!

Posted

Köszi csutomi, ez alapján szerintem menni fog.

 

arpsoft, íme a kód:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#define  SIZE 6

FILE *fp;

struct utaslista{
    char jarat_sz[9];
    char datum[7];
    char nev[33];
    int km;
    int jelleg;
};

struct utaslista utazas[SIZE];
struct utaslista* m_utazas;
int beker();
int kiirat();

int beker(){    //utaslisra feltoltese.
    int i;
    m_utazas=utazas;
    for(i=0;i<SIZE;i++){
 printf("\nKerem a jarat szamat: "); scanf("%s",(m_utazas+i)->jarat_sz);
 printf("\nKerem az utazas datumat (pl:050903): "); scanf("%s",(m_utazas+i)->datum);
 printf("\nKerem az utas nevet: "); scanf("%s",(m_utazas+i)->nev);
 printf("\nKerem az ut hosszat: "); scanf("%d",&(m_utazas+i)->km);
 printf("\nKerem az utazas jelleget (szolgalati=1, egyeni=2): "); scanf("%d",&(m_utazas+i)->jelleg);
    }
    return 1;
}

int kiirat(){    //utaslista kiirasa.
    int i;
    for(i=0;i<SIZE;i++){
 printf("\n\t%8s\t%6s\t%12s\t%5d\t%2d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,utazas[i].km,utazas[i].jelleg);
    }
    fp=fopen("UTAZAS.DAT","wt");
    fprintf(fp,"\n\t   Jarat\t  Datum\t       Nev\t  Km\tJelleg");
    fprintf(fp,"\n\t--------------------------------------------------------");
    for(i=0;i<SIZE;i++){    //utaslista UTAZAS.DAT fajlba irasa.
 fprintf(fp,"\n\t%8s\t%6s\t%12s\t%5d\t%2d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,utazas[i].km,utazas[i].jelleg);
    }
    fclose(fp);
    return 1;
}

int kiolvas(){
    char c;
    char t[500];
    int i=0;
    m_utazas=utazas;
    fp=fopen("UTAZAS.DAT","rt");
    while (c != ' '){            
    c = fgetc (fp);
    t[i]=c;
    i++;
    }
   fclose (fp);
    printf("\n\n Az on altal beirt mondat %d karakterbol all.",strlen(t));
    return 0;
}


int main(){
    /*
    beker();
    printf("\n\t   Jarat\t  Datum\t       Nev\t  Km\tJelleg");
    printf("\n\t--------------------------------------------------------");
    kiirat();*/
    kiolvas();
    
    getch();
    return 0;
}

 

Benne pillanatnyilag a kiolvasás függvény aktív csak.

Posted

Nos, mivel az fprintf-ben space helyett tab-ot használtál, ezért az fscanf nem fogja tudni olyan egyszerûen beolvasni a dolgokat.

 

Ott is formázottan kell majd beolvasni!

char cTab;
.
.
.
fscanf(%c%8s%c%6s%c%12s%c%5d%c%2d",&cTab,&utazas[i].jarat_sz,&cTab,&utazas[i].datum,&cTab,&utazas[i].nev,&cTab,&utazas[i].km,&cTab,&utazas[i].jelleg,myfile);
.
.
.

Posted

A segítségekkel be tudtam olvasni az adatokat fájlból. Köszi.

Ez a kód:

for(i=0;i<SIZE;i++){
    fscanf(fp,"%s%s%s%d%d",(m_utazas+i)->jarat_sz,(m_utazas+i)->datum,(m_utazas+i)->nev,&(m_utazas+i)->km,&(m_utazas+i)->jelleg);
   }

 

Most azt nem sikerül megoldani, hogy pozicionáljam a beolvasás kezdetét. Pl: ki szeretnék hagyni 2 sort és csak utána olvastatnám be az adatokat.

Ha nem unjátok még, akkor ehhez is kérnék helpet.

Posted

És ez mûködik? Így, ahogy ide leírtad? :pislog:

 

Milyen fordítóval dolgozol?

 

Ha ki akarsz hagyni sorokat, akkor az fgets(char *s) függvénnyel olvastasd be õket egy tetszõleges string változóba.

Ha csak bájtokat akarsz kihagyni, akkor fseek(FILE *f,long lWhence,int iOffset)

a megoldás. Az f fájl aktuális olvasási pozícióját átállítja lWhence bájttal az iOffset-tõl, ami lehet SEEK_SET (eleje), SEEK_END (vége) és SEEK_CUR (a jelenlegihez képest).

Posted
És ez mûködik? Így, ahogy ide leírtad?

@arpsoft:

Gondolom, neked is ezzel a szerkezettel van a problémád:

(proba+2)->x

Ha nem, akkor bocs. Szerintem ezt inkább így használják gyakrabban:

proba[2].x

Azért, mert a

proba->x nem más, mint (*proba).x, amibõl következik, hogy

(proba+2)->x = (*(proba+2)).x = proba[2].x

 

Legalábbis szerintem. Ennek alapján jó, amit horukk írt.

Posted

arpsoft, a MinGW fordítóját használom. Úgy is mûködik, meg így is:

for(i=0;i<SIZE;i++){
    fscanf(fp,"%s%s%s%d%d",utazas[i].jarat_sz,utazas[i].datum,utazas[i].nev,&utazas[i].km,&utazas[i].jelleg);
   }

csutomi jól következtetett.

 

A sorkihagyást arpsoft helpje alapján így oldottam meg:

char string[100];
int i=0;
while(i<3){
    fgets (string , 100 , fp);
    //puts (string);
    i++;
    }

Így a negyedik sorra pozicionál, onnét folytatja az olvasást.

Köszönöm.

Posted

Nem, nekem azzal volt problémám, hogy nem figyeltem meg kellõ képpen az adatszerkezetet, ezért & jeleket hiányoltam. De rájöttem, hogy ahol hiányzik az &, azok stringek, tehát nem is kell. :upsz:

 

A pointer eltolással nem volt gondom, az teljesen világos volt. 8)

Posted

Az alábbi struktúra tömb másolás nem történik meg. Csak az elsõ betû másolódik át helyesen.

 *utas[i].neve=*utazas[i].nev;
  printf("\n%s",utas[i].neve);

Mitõl lehet?

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