Új hozzászólás Aktív témák
-
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...
-
cellpeti
veterán
válasz cellpeti #1351 üzenetére
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...
-
Karma
félisten
válasz cellpeti #1352 üzenetére
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.”
-
cellpeti
veterán
Azt hogy tudnám megcsinálni,hogy a teljesítménynél,ha üres sort adok,akkor lépjen ki?
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...
-
Karma
félisten
-
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
-
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 charint strlen(char *str){
char *tmp=str;
if(!str)
return 0;
while(*str++);
return str-tmp;
}
vagy inkabb
return (int)(str-tmp); -
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); -
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...
-
bama
csendes tag
3man nagyon köszönöm neked a segitséget!!!!
-
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. -
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!''
-
-
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!''
-
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?
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
-
shev7
veterán
válasz Sk8erPeter #1377 üzenetére
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!''
-
Karma
félisten
A pointer mérete is fix 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) // ekvivalensekDe 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.”
-
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...
-
cellpeti
veterán
Na ezzel most nagyon jót kérdeztél.
[ Szerkesztve ]
Tigris, tigris, csóvafény...
-
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!''
-
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.
_______________________________________________________
(#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...
[ Szerkesztve ]
Sk8erPeter
-
Karma
félisten
válasz Sk8erPeter #1384 üzenetére
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.”
-
cellpeti
veterán
válasz Sk8erPeter #1384 üzenetére
Az elején muzály választani,mert különben nem enged tovább!
Tigris, tigris, csóvafény...
-
cellpeti
veterán
Sziasztok!
CodeBlocks-ban nem lehet tenni ]-et???
Tigris, tigris, csóvafény...
-
Karma
félisten
válasz cellpeti #1388 üzenetére
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
“All nothings are not equal.”
-
shev7
veterán
válasz Sk8erPeter #1384 üzenetére
"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!''
-
cellpeti
veterán
A CodeBlocks-ban tudna valaki segíteni? Mert még mindig nem működik!
[ Szerkesztve ]
Tigris, tigris, csóvafény...
-
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 ]
-
cellpeti
veterán
Most GNU GCC Compileren van? az jó?
Tigris, tigris, csóvafény...
-
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
-
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. :\
Ú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!
- LEGO klub
- Autós topik látogatók beszélgetős, offolós topikja
- Toyota topik
- Apple Watch Sport - ez is csak egy okosóra
- Luck Dragon: Asszociációs játék. :)
- PlayStation rajongói nyereményjáték
- Házimozi, és Hifi kábelezés!
- Elektromos rásegítésű kerékpárok
- Xbox Series X|S
- Mindenki AI-t akar, már 2025-re is eladták a HBM chipeket
- További aktív témák...
- Új állapotú-11.Generációs Core i3-Lenovo Laptop-Magyar-Legolcsóbban-fél év garival.
- Huawei P20 Pro Kártyafüggetlen hibátlan telefon
- TOP PC konfig /i7 14700K, 32GB DDR5 RAM, 1TB Gen4 SSD/ szuper akciós! BeszámítOK
- Linksys EA6900
- DELL OptiPlex 3040 SFF / i3-6100 - i5-6500 - i7-6700 / HDMI / DVD-RW / több db / 27% áfás számla