Hirdetés

2024. május 1., szerda

Gyorskeresés

Hozzászólások

(#1351) cellpeti


cellpeti
veterán

üdv!

Nekem lenne egy progim,ami bekéri a motor teljesítményét lóerőben,utánna meg be kell kérni a hengerűrtartalmat ccm-be.
Ha a teljesítménynél üres sort adunk be,akkor ki kell lépnie. De ha nem számot adtál be,akkor is dobjon egy hiba üzit,mind a teljesítménynél,mind a hengerűrtartalomnál. Addig meg van,hogy bekéje mind2t.

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int getline(char s[],int lim){
int i,c;
for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n')
c=getchar();
return (i);
}

int ell(char s[])
{
int i,h,ok=1;
h=strlen(s);
for(i=0;i<h;i++) { if (!isdigit(s[i])) ok=0;}
return ok;
}

void main(void)
{
int ok,loe,kobc;
char loero[10],ccm[10];


do
{
ok=0;
printf("Kerem a teljesitmenyet loeroben: ");
getline(loero,10);
ok=ell(loero);
loe=0;
loe=atoi(loero);
}while(ok!=1);

do
{
ok=0;
printf("\nKerem a motor hengerurtartalmat kobcentiben: ");
getline(ccm,10);
ok=ell(ccm);
kobc=0;
kobc=atoi(ccm);

}while(ok!=1);

printf("\nA motor loereje: %dLE\n",loe);
printf("\nA motor hengerurtartalma: %dccm\n\n",kobc);
}

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1352) cellpeti válasza cellpeti (#1351) üzenetére


cellpeti
veterán

Na eddig megvan az,hogyha üres sort adok meg akkor kiírja,illetve csak a számokat fogadja el és akkor is kiírja a hiba üzeneteket!
Olyat szeretnék még kérdezni,hogy mikor üres sort adok meg neki,akkor kilépjen a progi??

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int getline(char s[],int lim){
int i,c;
for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n')
c=getchar();
return (i);
}

int nume (char s[])
{
int i;
if(s[0]=='-' || s[0]=='+')i=1; else i=0;
for(; s[i]; ++i)
if (s[i]<'0' || s[i]>'9') return 0;
return 1;
}

void main(void)
{
int ok,loe,kobc;
char loero[10],ccm[10];


do
{
ok=0;
printf("Kerem a teljesitmenyet loeroben: ");
if(!getline(loero,10))
{
printf("Ures sort adott meg!\n");
ok=1;
}
else
{
if(!nume(loero))
{
printf("Nem szam a bekert karakter!\n");
ok=1;
}
else
loe=atoi(loero);
}
}while(ok==1);

do
{
ok=0;
printf("Kerem a motor hengerurtartalmat kobcentiben: ");
getline(ccm,10);
ok=nume(ccm);
kobc=atoi(ccm);
}while(ok!=1);

printf("\nA motor loereje: %dLE\n",loe);
printf("\nA motor hengerurtartalma: %dccm\n\n",kobc);
}

Tigris, tigris, csóvafény...

(#1353) Karma válasza cellpeti (#1352) üzenetére


Karma
félisten

Kilépéshez használd az exit(0) függvényt ;)

Egyébként van egy teljesen felesleges rész: a nume-t és az atoi-t simán összevonhatod egy sscanf hívásba, amivel két legyet ütsz egy csapásra: ha nem szám, akkor 0-t ad vissza (megvan a hibadetektálás), ha szám, akkor meg 1-et, és a paraméterben átadott változóban ott lesz az érték. A használatára itt egy egyszerű példa.

[ Szerkesztve ]

“All nothings are not equal.”

(#1354) cellpeti válasza Karma (#1353) üzenetére


cellpeti
veterán

Nem használhatok scanf()-et,csak printf()-et!

Tigris, tigris, csóvafény...

(#1355) doc válasza cellpeti (#1354) üzenetére


doc
nagyúr

a sscanf, scanf es printf harom teljesen kulonbozo fuggveny!

(#1356) Gyuri16 válasza Gyuri16 (#1349) üzenetére


Gyuri16
senior tag

bump :F

/dev/input/event* megse lesz jo, mert (azon kivul, hogy nem tudom hogyan kell ertelmezni) csak root joggal lehet olvasni. nekem olyan megoldas kellene, hogy barki tudja futtatni.

Nem vagyok egoista, csak uborkagyalu!

(#1357) cellpeti válasza doc (#1355) üzenetére


cellpeti
veterán

értelek!

de gondolom,ha sima scanf()-et se használhatok,tuti nem nem lehet használni a sscanf()-et se!

Tigris, tigris, csóvafény...

(#1358) Karma válasza Gyuri16 (#1356) üzenetére


Karma
félisten

Valószínűleg ez is az okai között van annak, hogy miért van olyan kevés keylogger Linuxra :U Egyébként van itt egy érdekes cikk: Part 1, Part 2.

“All nothings are not equal.”

(#1359) cellpeti


cellpeti
veterán

Azt hogy tudnám megcsinálni,hogy a teljesítménynél,ha üres sort adok,akkor lépjen ki? :U

do
{
ok=1;
printf("Kerem a teljesitmenyet loeroben: ");
getline(loero,10);
ok=nume(loero);
if(ok==0) {printf("\nRossz adatbevitel! Csak szam lehet a bevitt adat!\n\n");}
else {loe=atoi(loero);}
}while(ok!=1);

Tigris, tigris, csóvafény...

(#1360) Gyuri16 válasza Karma (#1358) üzenetére


Gyuri16
senior tag

most jatszottam xev-vel ez eleg jol kiirja, hogy mit nyomkodok.
koszi az olvasnivalot, megnezem (titkon remeltem, hogy fog menni valahogy egyszerubben)

Nem vagyok egoista, csak uborkagyalu!

(#1361) Karma válasza cellpeti (#1359) üzenetére


Karma
félisten

A getline függvényed, ha jól megnézed (mintha valahol használnád is...?), a beolvasott karakterek számát adja vissza. Ez nyilván 0, ha üres sorról van szó. A getline-os sorod cseréld ki erre például:

if (!getline(loero, 10))
{
exit(0);
}

“All nothings are not equal.”

(#1362) bama


bama
csendes tag

Sziasztok srácok!!!

Nagyon megköszönnééem a segitségtenétek a c be kezdem programozni 1 ös vagyok egyetemen és a tanárunk felad egy hibás egyszerü C programot amibe van 5 hiba ahány hibát találunk annyi az érdemjegyünk!!Elég kutyaütő vagyok benne segitenétek megkeresni a hibákat benne??Nagyon megköszönném!!!

A program

int strlen(char*str){
char*tmp=*str;
if(!strt)
return 0;
while(str+#);
return*str-*tmp;
}

Lehet hogy több hiba vann benne mert a barátom egy lapra irta kézzel aztán elég rondán iirrrr
ide irnátok a teljes programot nekem kijavitvaaaaa !!NAgyon sürgös lenne!!!!!!!!!!!!!!!!!!!!

nagyon köszönom

kioto

(#1363) 3man válasza bama (#1362) üzenetére


3man
csendes tag

Adott a feladat:

int strlen(char*str){
char*tmp=*str;
if(!strt)
return 0;
while(str+#);
return*str-*tmp;
}

Eloszor is
1.)tmp egy cim, mig *str egy char
2.)nincs olyan hogy strt
3.4) while(str+#); ebbol a sorbol hianyzik egy * es egy +
5.) a visszateresi ertek int,es nem char

int strlen(char *str){
char *tmp=str;
if(!str)
return 0;
while(*str++);
return str-tmp;
}
vagy inkabb
return (int)(str-tmp);

(#1364) 3man válasza bama (#1362) üzenetére


3man
csendes tag

Ugy remlik, cimeket nem illik kivonni, akkor pedig ez a jo

return (int)str-(int)tmp;

(#1365) 3man válasza bama (#1362) üzenetére


3man
csendes tag

Az utolso sor az esetek 99.99 szazalekaban jol mukodik, de..

A cim 32 bites lehet, ahogy az int is, de az int elojeles. Ez problemat okozhat, ha a str joval 0x7fffffff alatt van, mig a karakterlanc vege joval 0x8000000 folott.
Ekkor az int-re konvertalasnal az elso szam pozitiv lesz, mig a masodik negativ., es a kulombseguk is negativ, ha a karakterlanc eleg nagy. Gyakorlatilag nem lehet akkora karakterlancot letrehozni, hogy a hiba elojojjon, de ez akkor is hiba.
A visszateresi erteknek unsigned int-nek kellene lennie.

erdemes probalgatni, mikor lesz negativ az eredmeny, es mikor nem.
int a=0xbfffffff;
a-=0x30000000;
printf("%d \n",a);

(#1366) 3man válasza bama (#1362) üzenetére


3man
csendes tag

es nem mindegyik ir ronda

xd

(#1367) cellpeti


cellpeti
veterán

Milyen függvénnyel lehet pl *-ból egy kis keretet csinálni,akár az egész ablak köré,de akár egy pár sok köré?

Tigris, tigris, csóvafény...

(#1368) bama


bama
csendes tag

3man nagyon köszönöm neked a segitséget!!!!:D:D:D:D:D

(#1369) 3man válasza bama (#1368) üzenetére


3man
csendes tag

Ez nagyon alapszint, gondolom azert nem valaszolt senki.

Ha mar alapszint. Mikor mutato valami, es mikor char?
Ehhez csak a definiciot kell mindig megnezni.
Az str igy volt definialva
int strlen(char *str)
Ezt fel lehet bontani tobbfelekepp.
char * , str
char , * str
Ebbol mar latszik, mikor mit jelent a kifejezes. Ha csak str-t irok, akkor az char *
ha *str-t, akkor az char.

Lehetne ilyen is a definicio
char **str
Ekkor tobb felbontasi lehetoseg kinalkozik. De a definiciobol mindig lehet tudni, mit jelent az adott kifejezes. Az utobbinal **str az char tipust ad, mig *str egy char *-ot.

A c nyelvben a mutato egyben egy tomb elso elemere is mutat.
Tehat a char *str megegyezik a char str[] definicioval. Ebbol kovetkezik, hogy minden mutatot indexelhetunk, mint egy tombot, es minden tomb neve egyben mutato, ami egy cimet tarol.

(#1370) shev7 válasza 3man (#1364) üzenetére


shev7
veterán

miert is nem illik cimeket kivonni? siman kivonhatoak egymasbol es megadja a string hosszat

btw szerinted ez mit csinal? vagyis inkabb mikor lesz igaz?

*str++

[ Szerkesztve ]

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1371) Karma válasza shev7 (#1370) üzenetére


Karma
félisten

Most olvastam a hivatalos dokumentációban (Stroustup C++ könyve), hogy pointert csak akkor szabad kivonni egymásból, ha azonos tömbre mutatnak. Szerencsére ez a példakódban lévő karaktertömb esetében teljesül.

[ Szerkesztve ]

“All nothings are not equal.”

(#1372) shev7 válasza Karma (#1371) üzenetére


shev7
veterán

hat maskulonben tenyleg nincs sok ertelme... keves egyebb felhasznalasi teruletet tudom elkepzleni a pointerek kivonasanak :D

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1373) 3man válasza Karma (#1371) üzenetére


3man
csendes tag

Igy van, a pointer nem azert van, hogy szamoljunk vele. De mukodik a dolog, mert a forditok megengedik.

(#1374) shev7 válasza 3man (#1373) üzenetére


shev7
veterán

megengedik? azert annal kicsit tobbrol van szo...

az strlen fuggveny is ugy van implementalva, hogy a visszateresi ertek pointerek kulonbsege, pont mint a peldaban...

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1375) 3man válasza shev7 (#1374) üzenetére


3man
csendes tag

Nyilvan jobban tudod..

(#1376) Karma válasza 3man (#1375) üzenetére


Karma
félisten

Vagy csak szorgalmasabb volt, és megnézte egy C library forrását.

“All nothings are not equal.”

(#1377) Sk8erPeter válasza Karma (#1376) üzenetére


Sk8erPeter
nagyúr

Tényleg, ha már pointerek és tömbök hasonlóságáról van szó, kérdeznék: tanultuk, hogy hasonlóság van a kettő között, de van különbség memóriakezelésben. Milyen szempontból? :F
Ha pointerként hivatkozol (pl. int *p) az elvileg ugyanazt adja, mint a tömb első (nulladik) elemének címe. De akkor mi a jelentős különbség?

Sk8erPeter

(#1378) shev7 válasza Sk8erPeter (#1377) üzenetére


shev7
veterán

tomb merete fix :)

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1379) Karma válasza shev7 (#1378) üzenetére


Karma
félisten

A pointer mérete is fix :U 32 bites architektúrán 32 bit például.

Szerintem arra céloztak anno a hasonlósággal, hogy a subscript operátor valójában ekvivalens egy kis pointeraritmetikával.

int array[5];
int* pointer = array;

array[5] === pointer[5] === *(pointer+5) // ekvivalensek

De most hogy nézem, rájöttem a különbségre is: míg a pointer szabadon módosítható, a tömbváltozó nem, konstans értéke van.

“All nothings are not equal.”

(#1380) cellpeti


cellpeti
veterán

Üdv!

Letöltöttem a Code Blocks-ot.
Intel C/C++ Compiler álítottam be neki.

Megnyitottam benne egy C-Free-ben írt programot,ami lefutott ott is és TC-be is. Majd mondom neki,hogy futassa(F9) és meg sem mozdul. Tudna valaki segíteni ebben?

Tigris, tigris, csóvafény...

(#1381) Karma válasza cellpeti (#1380) üzenetére


Karma
félisten

Van fenn egyáltalán Intel C/C++ fordítód? MSYS-es GCC szokott lenni mellécsomagolva, szerintem azt kellett volna választanod. De emlékeim szerint még külön mutatja is, mit detektál.

“All nothings are not equal.”

(#1382) cellpeti válasza Karma (#1381) üzenetére


cellpeti
veterán

Na ezzel most nagyon jót kérdeztél. :U

Itt a kép!

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1383) shev7 válasza Karma (#1379) üzenetére


shev7
veterán

ugy ertettem, hogy ha pointert mint tombot hasznalunk futasi idoben valtoztathato a "tombnek" a merete. Ha arra van szukseg fogod es nagyobbat foglalsz

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1384) Sk8erPeter válasza Karma (#1379) üzenetére


Sk8erPeter
nagyúr

"míg a pointer szabadon módosítható, a tömbváltozó nem, konstans értéke van."
Most ezt nem nagyon értem: a tömbváltozó is módosítható. Mármint a tömbben tárolt érték. Nyilván a pointer átállítható, hogy más elem címére mutasson.
Na de akkor mi a releváns különbség a memóriakezelésben?

(#1383) shev7 : ezt sem értem, mert dinamikusan is, futásidőben is lehet memóriát foglalni tömbnek, attól függően, hogy mondjuk mekkora egy másik tömb, aminek az elemeit át szeretnénk másolni egy új tömbbe, attól függően módosítjuk a foglalt memóriaméretet.
:F

_______________________________________________________

(#1380) cellpeti: nem értem, minek állítgattad át? Letöltöd, telepíted, működik. Tök felesleges állítgatni valamit, ha nem tudod, mi az... :U

[ Szerkesztve ]

Sk8erPeter

(#1385) Karma válasza Sk8erPeter (#1384) üzenetére


Karma
félisten

A tömbváltozó alatt én az "array"-t értettem, ami gyakorlatilag egy pointer az első elemre. Ez a konstans, nem lehet elállítani onnan, ellentétben egy pointerrel.

Tehát nem lehet olyat mondani, hogy
array = pointer + 1;

[ Szerkesztve ]

“All nothings are not equal.”

(#1386) Sk8erPeter válasza Karma (#1385) üzenetére


Sk8erPeter
nagyúr

Asszem értem. :) Köszi a felhomályosítást! ;)

Sk8erPeter

(#1387) cellpeti válasza Sk8erPeter (#1384) üzenetére


cellpeti
veterán

Az elején muzály választani,mert különben nem enged tovább!

Tigris, tigris, csóvafény...

(#1388) cellpeti


cellpeti
veterán

Sziasztok!

CodeBlocks-ban nem lehet tenni ]-et???

Tigris, tigris, csóvafény...

(#1389) Karma válasza cellpeti (#1388) üzenetére


Karma
félisten

De lehet, csak az Alt+G-n már van egy másik shortcut :( A beállítások között ki kell törölni. Úgy emlékeztem, hogy csak a Dev C++-ban van ilyen szívás...

Szerintem egyébként az angol billentyűkiosztás sokkal jobb a kódoláshoz, a Windows magyarja nagyon gáz :N

“All nothings are not equal.”

(#1390) shev7 válasza Sk8erPeter (#1384) üzenetére


shev7
veterán

"ezt sem értem, mert dinamikusan is, futásidőben is lehet memóriát foglalni tömbnek, attól függően, hogy mondjuk mekkora egy másik tömb, aminek az elemeit át szeretnénk másolni egy új tömbbe, attól függően módosítjuk a foglalt memóriaméretet."

En ugy tudom, hogy tombre ilyet nem lehet. Ha azt mondom, hogy int x[5] akkor az elete vegeig 5 elemu tomb lesz. Sot en ugy tudom standard C-ben olyan sincs hogy

f(int x){
int array[x];
}

Ellenben ha fogsz egy pointert akkor a pointerrel akkora teruletet foglalsz le amekkorat akarsz, es futasi idoben ugy varialod ahogy akarod.

Es a memoriakezelesrol:
Ha a tombodet nem globalis valtozokent deklaralod, akkor a tombnek a helyet a stack-en foglalja le. Ugyan ez igaz a pointer-re is, tehat a pointer altal mutatott cim is a stack-en lesz. Ellenben, ha a pointer-hez allokalsz memoriateruletet, azt mar a heap-en fogja lefoglalni.

[ Szerkesztve ]

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1391) Karma válasza shev7 (#1390) üzenetére


Karma
félisten

Így van, a tömböknek fix a mérete.
Tegnap éjjel én is ezt akartam írni, csak aztán feladtam :R

“All nothings are not equal.”

(#1392) cellpeti


cellpeti
veterán

A CodeBlocks-ban tudna valaki segíteni? Mert még mindig nem működik!

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1393) bpx válasza cellpeti (#1392) üzenetére


bpx
őstag

írták fentebb hogy állítsd át a kiosztást vagy töröld a hotkeyt

vagy írd be ascii kód szerint: alt (bal oldali) + 93

(#1394) cellpeti válasza bpx (#1393) üzenetére


cellpeti
veterán

Nem arról van szó! Hanem arról,hogy nem futattja a progit amit írok benne. De mind1!
Most ajánlottak másik C környezetet.

C-Free

Tigris, tigris, csóvafény...

(#1395) bpx


bpx
őstag

ja ok, most látom volt előbb is kérdésed

miért intel compiler-t válaszottál? raktál fel külön, kiírta arra is hogy detected?
amikor futtatni próbálod, alul a logban véletlenül nem ezt írja?

"***** - Debug" uses an invalid compiler. Skipping...
Nothing to be done.

hagyd a GNU compiler-en és azzal megy rendesen

[ Szerkesztve ]

(#1396) cellpeti válasza bpx (#1395) üzenetére


cellpeti
veterán

Az a cumi,hogy nem ír ki semmit!

Tigris, tigris, csóvafény...

(#1397) cellpeti


cellpeti
veterán

Most GNU GCC Compileren van? az jó? :U

Tigris, tigris, csóvafény...

(#1398) Karma válasza cellpeti (#1397) üzenetére


Karma
félisten

Elvileg annak kéne lennie a jónak...

“All nothings are not equal.”

(#1399) Sk8erPeter válasza shev7 (#1390) üzenetére


Sk8erPeter
nagyúr

Akkor lehet, hogy valami fogalmi képzavar esete forog fenn nálam, vagy nem vágom,
de az alábbi példaprogram jól szemlélteti a dinamikus memóriafoglalást, amire gondoltam, itt az eredeti tömbből egy új tömbbe gyűjti az eredeti tömbben szereplő, átlag alatti számokat, és pont akkora memóriát foglalunk le az új tömbnek, amennyire szükség van, nem többet, nem kevesebbet:

#include <stdio.h>
#include <stdlib.h>
double *atlagalatt(double tomb[], int meret, int *ujmeret){
double *ujtomb;
int i, db, to;
double szum, atlag;

/* mi az atlag */
szum=0;
for (i=0; i<meret; ++i)
szum+=tomb[i];
atlag=szum/meret;

/* hany olyan van */
db=0;
for (i=0; i<meret; ++i)
if (tomb[i]<atlag)
db++;

/* foglalas es paranoia */
ujtomb=(double*)malloc(db*sizeof(double));
if (!ujtomb) {
*ujmeret=0;
return NULL;
}

/* masolas */
to=0;
for (i=0; i<meret; ++i)
if (tomb[i]<atlag)
ujtomb[to++]=tomb[i];
*ujmeret=db;
return ujtomb;
}

int main(){
double eredeti[100];
double *uj;
int ujmeret;
int i;

for (i=0; i<100; ++i)
eredeti[i]=rand()%100/10.0;

uj=atlagalatt(eredeti, 100, &ujmeret);
for (i=0; i<ujmeret; ++i)
printf("%4.2g ", uj[i]);
free(uj);
}

Szerk.: Forrás: [link]

Sőt, ha már linkeltem, itt látható a 4-es feladatban a futásidőben történő memóriafoglalás:

#include <stdio.h>
#include <stdlib.h>

char ** darabol(char *s,char *m,int *db){
int n=0,i,last=0;
char **p;
// szavak számolása
for(i=0;s[i]!=0;i++){
int j;
for(j=0; m[j]!=0 && s[i]!=m[j]; j++);
if(m[j]!=0 && i!=last){
n++;
last=i+1;
}
}
p=(char**)malloc(n*sizeof(char*));
if(p==NULL)exit(-1);
for(i=n=last=0;s[i]!=0;i++){
int j;
for(j=0; m[j]!=0 && s[i]!=m[j]; j++);
if(m[j]!=0 && i!=last){
p[n]=(char*)malloc(i-last+1);
if(p[n]==NULL)exit(-1);
for(j=last;j<i;j++)p[n][j-last]=s[j];
p[n][j-last]=0;
n++;
last=i+1;
}
}
*db=n;
return p;
}

int main(int db,char ** par){
FILE * fp;
char sor[1025];
int meret;
if(db<3)return -1;
fp=fopen(par[1],"rt");
if(fp==NULL)return -1;
while(fgets(sor,1025,fp)!=NULL){
char **p=darabol(sor,par[2],&meret);
while(meret--)free(p[meret]);
free(p);
}
}

[ Szerkesztve ]

Sk8erPeter

(#1400) Vasinger!


Vasinger!
nagyúr

Sziasztok!

Ma nyúltam először C#-hoz életemben, és el is akadtam a háziban. Már majdnem kész van, de nem tudom kipróbálni, hogy eddig jó e, mert ha futtatom, újraindul.

Emlékszem órán valamit ki kellett törölni, de sehogy sem sikerül.

Ami még szemet szúrt, hogy a sorok megvoltak számozva a suliban, itthon feltettem, de nem látom sehol sem, hogy hol kell bekapcsolni. :\

Copyright © 2000-2024 PROHARDVER Informatikai Kft.