Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [Lalikiraly:] Gigabyte G5 MF notebook bemutató
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] eBay-es kütyük kis pénzért
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] Spyra: akkus, nagynyomású, automata vízipuska
- [Re:] PLEX: multimédia az egész lakásban
- [Re:] [Szevam:] Érzelmi magabiztosság/biztonság - miért megyünk sokan külföldre valójában?
- [Re:] [Mr Dini:] Ha szeretnéd rootolni az LG Smart TV-d, tedd meg most!
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
Jester01
veterán
Hát a tömbödet kézzel kell végignézni (ez persze nem túl hatékony, mint ahogy az strlen sem).
De ha amúgy is te foglaltad le akkor nyilván tudod mekkora, csak nem kell "elfelejteni".
Jester
VaZso
senior tag
Értem, ill. jól gondoltam...
Azért nem tudom előre a hosszát, mert egy fileból olvasom ki az értékeket.
Annak sem lenne sok értelme, ha globális szinten tárolnám egy változóba, mert listák közül is lehet akármennyi.
Ez lett belőle:
int ptLen(char **data) {
if (!data)
return 0;
int i=0;
while (data[++i])
;
return i-1;
}
Karma
félisten
Annak sem lenne sok értelme, ha globális szinten tárolnám egy változóba, mert listák közül is lehet akármennyi.
Ilyenkor jön be az, hogy egy structban együtt tárolod a pointert és a tömb hosszát
“All nothings are not equal.”
3man
csendes tag
Ezt fejtettem ki lentebb, csak valami miatt nem erti, miert akarunk mi raeroltetni struct-ot, mikor o csak egy char * -ot akar hasznalni.
Ezert jobb lenne c++ ban kezdeni, mert kisse mas es celravezetobb gondolkodasmod alakul ki.
Ott letrehozhatsz egy olyan osztalyt, amit te a "char *" helyett fogsz MINDENUTT hasznalni. Ez letarolhatja az aktualis meretet a stringnek, lehet operatorokat letrehozni, amelyek segitsegevel ugyan ugy kezelheted a valtozot, mintha char * lenne. Amikor a program a data [index] utasitashoz er, akkor meghivodik az osztaly [] operatora, amit te barhogy megirhatsz. Ellenorizheted, hogy az index nem negativ, es az eppen aktualis string mereten belul van vagy nem. Messze hatekonyabb lesz a program, es biztonsagosabb.
De mar megint OFF voltam.
[ Szerkesztve ]
Echo2211
csendes tag
Sziasztok!
ANSI C-ben kellene megírnom egy kezdő szintű programot, de ehhez túl szerények az ismereteim. Itt kicsit hosszadalmas lenne leírni a feladatot, így inkább privátban küldeném el egy hozzáértőnek.
Ha valaki tudna nekem segíteni, nagyon hálás lennék! (Életmentés esete forog fenn! )
Köszi előre is!
shev7
veterán
ar?
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
TrakToros
csendes tag
Sziasztok!
Volna 1 feladat amit meg kellene oldanom, de sajnos nem vágom a C-t és a bash-t se nagyon 3 napja kínlódom vele, de nem jutottam sokra google-val sem Hosszúnak tűnik, de aki ért hozzá nem hiszem, hogy nehéz lenne, ezért könyörgöm valaki csinálja meg nekem, fontos lenne.
"Írjon C programot, amely elvégez egy muveletet több szálon, üzenetsoron keresztüli IPC segítségével.
A program dolgozza fel a bemeno paramétereket és a "-t" opcióval megadott számot tárolja el, mint a
létrehozandó szálak számát.
A szülo processzbol inditsunk annyi szálat amennyit a -t kapcsolóval megadtunk. Tartsuk nyilván a szálak indexét, amit 1-tol számoljunk. Készítsünk egy üzenetsort IPC_PRIVATE kulccsal.
A szülo processz a következo feladatokat lássa el:
Olvasson be két egész számot a standard inputról és küldje el azokat az üzenetsorra az összes szál számára. (Minden számot külön sorban kérjen be.) A szülo ezek után várja meg a szálak muveleteinek eredményét (amik bool értékek lesznek) majd keresse meg a legmagasabb szál-indexu igaz értéket, és ezt az indexet írja ki a standard outputra.
A szálak a következo muveletet hajtsák végre:
Minden szál olvassa ki a szülotol kapott két számot az üzenetsorrol, és ossza el mindekettot a saját szál indexével (1-tol számozódik).
Ha az eredmény maradék nélkül osztható mindkét szám esetében, az eredmény legyen igaz, különben hamis.
Az eredményt küldjük el a szölo processz számára az üzenetsoron keresztül.
Ne felejtsük el a szálakat összevárni a gyerek processzben (pthread_join használatával).
A kommunikációhoz az üzenetsort használjunk és küldjünk annyi üzenetet amennyi szükséges. Az üzenet soron kívül más IPC módszert ne használjunk. Az üzenetsor kulcsa IPC_PRIVATE legyen.
A program paraméterei:
A program ellenorizze a paramétereket és ha a paraméterek között
szerepel "-h", akkor írja ki a program m.ködését. Ha a paraméterek
között szerepel a "-t" kapcsoló, akkor a következ. paramétert
alakítsa számmá, ez lesz létrehozandó a szálak száma. (használat
pl: run.sh -t 3)
(A program számolja ki a standard inputon megadott 2 szám legnagyobb közös osztóját a megadott határig.) "
Előre is köszönöm szépen! (szerencsére csak most az 1x kaptam ilyen feladatot)
Vasárnap reggelre kellene. Még1x köszönöm előre is. (És bocs, hogy az egész "karotokat" akarom )
[ Szerkesztve ]
A traktorosok,kombájnosok jó emberek:)
Darth_Revan
veterán
Ha valaki el tudná küldeni priviben ennek a megoldását azt én is megköszönném. Gyakorlaton nem maradt idő venni ezt a témát, de persze ha nem lesz kész akkor bukta...gg
Dead_slow
tag
Üdv!
Elég kezdő vagyok programozás témában, az alábbi feladat megoldásában kellene segítség, csak egy feltétel kell bele, de már fáradt vagyok és nagyon tompa, valszeg rettenet triviális a megoldás, ezért ne röhögjetek ki
Szóval a feladat: Egy sakktbálára bábokat helyezünk el. Programunk kirajzolja a táblát, majd bekér egy lépésszámot. Ezután minden bábot a lépésszámnak megfelelő számú mezővel előre léptet(nagyobb sorszámú sorok felé), majd újra kirajzolja a táblát. A tábláról lelépő figurák természetesen nem kell kirajzoli.
Nekem ezzel van gondom, ha túl nagy lépésszámot adok meg akkor átlép egy következő oszlopba.
Eddig jutottam
#include<stdio.h>
#include<stdlib.h>
char tabla[10][10];
int sor,oszlop,lep;
char imp[3];
void init(){
for(sor=0;sor<9;sor++){
for(oszlop=0;oszlop<9;oszlop++)
tabla[sor][oszlop]=' ';
}
}
void lerak(){
char babu;
do{
printf("Kerem a babut es a poziciojat pl.:(Ha1): ");
scanf("%s",imp);
babu=imp[0];
oszlop=imp[1]-'a';
sor=imp[2]-1-'0';
if(imp[0]!='*')
tabla[oszlop][sor]=babu;
}while(imp[0]!='*');
}
void rajzol(){
int i,j;
printf("\n ");
for(i=0;i<8;i++)
printf("%c ", 'A'+i);
printf("\n");
for(i=0;i<8;i++){
printf("%d ", i+1);
for(j=0;j<8;j++)
printf("|%c", tabla[j][i]);
printf("|\n");
}
}
void leptet(){
int i,j,k;
k=0;
printf("lepeszsam:");
scanf("%d",&k);
printf("\n ");
for(i=0;i<8;i++)
printf("%c ", 'A'+i);
printf("\n");
for(i=0;i<8;i++){
printf("%d ", i+1);
for(j=0;j<8;j++)
printf("|%c", tabla[j][i-k]);
printf("|\n");
}
}
int main(){
init();
lerak();
rajzol();
leptet();
system("PAUSE");
return 0;
}
[ Szerkesztve ]
Gyuri16
senior tag
ebben a sorban van a hiba:
printf("|%c", tabla[j][i-k]);
ha k>i akkor nem lesz jo. ha pl j=2, i=2, k=3 akkor tabla[2][-1] lesz az eredmeny ami a tabla[1][9] re fog mutatni, ezert lehet hogy mas oszlopba lep at. tehat eleg ele tenni egy ifet, es ha k>i akkor ures helyet rajzolni oda
Nem vagyok egoista, csak uborkagyalu!
Dead_slow
tag
Köszönöm, a fáradtság úgy néz ki legyőzött. Így már minden szép és jó.
void leptet(){
int i,j,k;
k=0;
printf("lepeszsam:");
scanf("%d",&k);
printf("\n ");
for(i=0;i<8;i++)
printf("%c ", 'A'+i);
printf("\n");
for(i=0;i<8;i++){
printf("%d ", i+1);
for(j=0;j<8;j++){
if(k>i)
printf("|%c",tabla[' '][' ']);
else
printf("|%c",tabla[j][i-k]);
}
printf("|\n");
}
}
Gyuri16
senior tag
eleg erdekes dolgot irtal, nem egeszen ertem mit akartal ezzel a sorral:
printf("|%c",tabla[' '][' ']);
ha jol gondolom (ha nem akkor valaki javitson ki) az tortenik hogy a ' ' atvaltozik szamra (32) es azzal indexeled a tombot, es kiirsz valamit, rosszabb esetben megfagy a program mert olyan helyre nyulkalsz ahova nem szabadna.
en siman kiiratnak egy "| "-t igy:
printf("| ");
Nem vagyok egoista, csak uborkagyalu!
Dead_slow
tag
Mondtam, hogy nagyon nem vágom ,de ettől függetlenül ezer dologgal teszteltem és egyszer sem fagyott meg.
Gyuri16
senior tag
de a te megoldasod nalam "|"-t ir ki "| " helyett az elso sorokban, azon kivul nem korrekt (ha beadando akkor pontlevonas).
kicsit jatszottam vele es sikerult rossz helyzetet eloidezni. a kododba raktam egy masik tombot ami pont akkora hogy a tabla[32][32](ami a tabla[' '][' ']) cim benne legyen, es arra a cimre raktam egy 'x' jelet. itt a forraskod reszlete (abban nem vagyok biztos, hogy ez most nalad is mukodni fog e igy, nem tudom pontosan hogyan foglalja le a memoriat, eloszor az en tombomet a tabla ele rakta, vegul sikerult ravennem, hogy utana tegye):
char tabla[10][10];
char kuk2[225];
int sor,oszlop,lep;
char imp[3];
void init(){
for(sor=0;sor<9;sor++){
for(oszlop=0;oszlop<9;oszlop++)
tabla[sor][oszlop]=' ';
}
kuk2[224]='x';
}
ezen kivul minden olyan mint amit te irtal. itt a kimenet:
gyuri@TGyuri:~/phprogs$ gcc -o sakk sakk.c && ./sakk
Kerem a babut es a poziciojat pl.:(Ha1): Ha1
Kerem a babut es a poziciojat pl.:(Ha1): *
A B C D E F G H
1 |H| | | | | | | |
2 | | | | | | | | |
3 | | | | | | | | |
4 | | | | | | | | |
5 | | | | | | | | |
6 | | | | | | | | |
7 | | | | | | | | |
8 | | | | | | | | |
lepeszsam:4
A B C D E F G H
1 |x|x|x|x|x|x|x|x|
2 |x|x|x|x|x|x|x|x|
3 |x|x|x|x|x|x|x|x|
4 |x|x|x|x|x|x|x|x|
5 |H| | | | | | | |
6 | | | | | | | | |
7 | | | | | | | | |
8 | | | | | | | | |
amint latod kiirta az x-et a masik tombbol. ez egy nagyobb projektnel ahol tobb valtozod van elofordulhat ilyen ugyeskedes nelkul is
Nem vagyok egoista, csak uborkagyalu!
Dead_slow
tag
Köszönöm, a kiegészítést/magyarázatot!
Már az előző hozzászólás után módosítottam a kódot, nem rég kezdtem el foglalkozni a dologgal, mármint nem a C nyelvvel, hanem az egész programozás témával remélem azért később jobban fog menni és nem okoz majd ekkora nehézséget egy ilyen egyszerűbb program megírása.
Dead_slow
tag
Üdv!
Újabb problémám lenne, ezúttal a feladat a következő:
Egy NxN-es méretű négyzetrácsos táblára bábokat helyezünk el, egy mezőre maximum egyet. A program bekéri a tábla méretét, majd egyenként a bábok pozicioját (pl.3). Az utolsó báb után egy x karaktert ütünk.
A program ezután kijelzi a táblát, valamint minden sorhoz és oszlophoz kijelzi az ott található bábok számát (a nullát nem kell kiírni).
#include<stdio.h>
int i,j,sorszum,oszlopszum,meret;
char tabla[40][40];
char imp[2];
void init(){
for(i=0;i<meret;i++){
for(j=0;j<meret;j++){
tabla[i][j]=' ';
}
}
}
void beker(){
do{
printf("Kerem a tabla meretet: ");
scanf("%d",&meret);
printf("Kerem a babu poziciojat:");
scanf("%s",imp);
if(imp[0]!='x')tabla[imp[1]-'1'][imp[0]-'A']='x';
}while(imp[0]!='x');
}
void rajzol(){
printf("\n ");
for(i=0;i<meret;i++)
printf("%c ", 'A'+i);
printf("\n");
for(i=0;i<meret;i++){
printf("%2d", i+1);
for(j=0;j<meret;j++){
if(tabla[i][j]==' ')
printf("| ");
else{
sorszum++;
printf("|%c",tabla[i][j]);
}
}
printf("|");
if(sorszum>0) printf(" %d",sorszum);
sorszum=0;
printf("\n");
}
printf("\n ");
for(j=0;j<meret;j++){
oszlopszum=0;
for(i=0;i<meret;i++){
if(tabla[i][j]=='x'){
oszlopszum++;
}
}
if(oszlopszum>0) printf("%d ", oszlopszum);
else printf(" ");
}
printf("\n");
}
int main(){
init();
beker();
rajzol();
system("PAUSE");
return 0;
}
Akármit csinálok az sorok végén mindig a bekért tábla méret jelenik meg az x-ek száma helyett. Mi lehet a gond?
Gyuri16
senior tag
1, initet akkor hivd meg, amikor mar beolvastad a meretet (beker()-ben a scanf(...meret) utan, es aztan a mainbol kikell venni az initet)
2, beker()-ben a do ciklus eleg ha a printf("Kerem a babu poziciojat:"); elott kezdodik (meretet eleg egyszer beolvasni)
ezeket kijavitva nalam mukodik
Nem vagyok egoista, csak uborkagyalu!
Dead_slow
tag
Köszönöm!
Így, már működik.
[ Szerkesztve ]
Dead_slow
tag
Üdv!
Újabb problémával jelentkezem, feladat következő:
Írjon cenzúrázó programot. A program beolvas egy mondatot, majd egy tiltott karaktersorozatot. A mondatban kicseréli a karaktersorozat minden előfordulását 3 csillag karakterre(cenzúrázott szó helyett 3 csillagot rajzol). Végül kiírja a cenzúrázott mondatot.
A feladat megoldása során csak gets, scanf, és a printf függvények használhatók. NEM szabad előre megírt stringkezelő függvényeket használni.
Szokás szerint elkezdtem megírni , de ezt a részt hogy a beolvasott tiltott szó helyére 3 csillagot tegyen nem tudom megcsinálni, megírtam úgy hogy minden karakterét a szónak csillagra cseréli, de ez ugye így nem jó.
#include <stdio.h>
int main(){
int i,j,szohossz,mondathossz;
char szo[20],mondat[100];
printf("mondat:");
gets(mondat);
printf("szo:");
scanf("%s", szo);
i=0;
while(szo[i]!=0){
i++;
}
szohossz=i;
i=0;
while(mondat[i]!=0){
i++;
}
mondathossz=i;
for(i=0;i<=mondathossz-szohossz;i++){
for(j=0;j<szohossz;j++){
if(szo[j]!=mondat[i+j])
break;
}
if(j==szohossz){
for(j=0;j<szohossz;j++){
mondat[i+j]='*';
}
i=i+szohossz-1;
}
}
printf("%s\n", mondat);
system("PAUSE");
return 0;
}
Köszönöm
Gyuri16
senior tag
azon a ponton amikor mar tudod, hogy cenzurazni kell, kovetkezot csinalod:
-ha szohossz < 3 akkor odebbtolod* a string tobbi reszet annyi hellyel jobbra, hogy beferjen a 3 csillag
-ha szohossz >= 3 akkor odairsz 3 csillagot es szohossz-3al balra tolod a maradek szoveget
* odebbtolas azt jelenti, hogy minden egyes betut x hellyel odebb masolsz. vigyazni kell, hogy a string eleg nagy legyen. mivel tobb hellyel kell mozgatni hatulrol kezdenem, tehat ha pl jobbra kell eltolni, akkor eloszor az utolso elemet tennem x hellyel jobbra, aztan az utolso elottit, stb. ha pedig ballra akkor eloszor az elsot.. meg nem art odafigyelni, hogy a string veget jelzo 0at is masold. (ajanlom fuggvenykent megirni, hogy tudd egyszeruen kulon tesztelni)
Nem vagyok egoista, csak uborkagyalu!
Gabessss
csendes tag
Sziasztok!
Én segítséget kérnék C programozáshoz,nem nagyon értek hozzá és be kell adnom egy megírt c programot a suliba nagyon örülnék ha valaki tudna nekem ebben segíteni.
az msn címem:gabeeee1@hotmail.com
előre is köszönöm
Dirty_Pio
csendes tag
Sziasztok, van egy kis problemam a listakkal c -ben. Nem a hagyomanyos pointeres modon szeretnem megoldani a feladatot, azaz letrehozni egy listat es kivenni, beletenni elemeket es kiiratni, hanem a kurzoros megoldassal, amikor egy listat vektor segitsegevel szimulalsz. Itt jon a kod:
#include <stdio.h>
#include <stdlib.h>
#define maxlen 100
typedef char tipcursor;
typedef int tipnod;
typedef struct tipelem{
tipnod element;
tipcursor next;
}tipelement;
typedef tipcursor tiplista;
void init(tipelement z[maxlen])
{
int i;
for (i=0;i<maxlen-1;i++)
z[i].next=i+1;
z[maxlen].next=-1;
}
tiplista add(tiplista *d,tiplista p,tipelement z[maxlen],tipnod e)
{
if (p==-1) {
p=*d;
z[*d].element=e;
*d=z[*d].next;
z[p].next=-1;
}
else{
tipcursor k=p;
while ((z[k].element<e)&&(k!=-1)&&(z[k].next!=-1))
{
k=z[k].next;
}
tipnod temp;
while (k!=-1)
{
temp=z[k].element;
z[k].element=e;
e=temp;
if(-1==(k=z[k].next)) z[k].next=*d;
}
z[*d].element=e;
temp=*d;
*d=z[*d].next;
z[temp].next=-1;
}
return p;
}
void list(tiplista s,tipelement z[maxlen])
{
while (s!=-1)
{
printf("%i ",z[s].element);
printf("%i ",z[s].next);
s=z[s].next;
}
}
int main(void)
{
tipelement zona[maxlen];
tiplista l=-1,m=-1,*disp;
disp=(tiplista*)malloc(sizeof(tiplista));
*disp=0;
init(zona);
l=add(disp,l,zona,16);
l=add(disp,l,zona,5);
list(l,zona);
l=add(disp,l,zona,41);
list(l,zona);
return 0;
}
Nos a problemam az, hogy a program nem helyezi jol be az elemeket a helyukre, azaz miutan betettem a 16-ost utana az o helyere teszi az 5-t, de nem tolja arrebb a 16-t, pedig az add fuggvenybe minden jol megy, csak kiirataskor mar nem oks a lista.
Elore is koszonom.
[ Szerkesztve ]
Jester01
veterán
Már az init függvényedben is van egy túlcímzés z[maxlen].next=-1; .
Az add függvényben sem "megy minden jól": if(-1==(k=z[k].next)) z[k].next=*d; Továbbá a temp változót két típusként is használod, egyszer tipnod egyszer meg tiplista. Ezeket javítva látszólag működik a kód, bár a typedef char tipcursor; igen szerencsétlen választás mivel nem tudhatod előjeles vagy nem. Márpedig ha nem az, akkor -1 sose lesz és végtelen ciklusba kerül a program.
Láncolt listába beszúráskor amúgy nem kellene az elemeket másolgatni.
Jester
Agger
csendes tag
Üdv mindenkinek! Segítség kellene, sajnos még csak kezdő vagyok. Ez lenne a feladat: Billentyűzetről bekért tankörlétszám és zárthelyi eredmények ismeretében meg kell határozni, hogy a különféle osztályzatokból hány darab született, valamint a tankörátlagot. Az eredményeket írassa ki! Ez egy zh feladat, addig eljutottam, hogy bekérem a jegyeket, de sehogy se akar összejönni a különböző jegyek megszámolása, ez lenne a kérdésem, hogy ezt, hogy kell csinálni? Előre is kösz a segítséget
Jester01
veterán
Például ha 5 fajta osztályzat van, akkor csinálsz egy öt elemű tömböt. Majd ahogy jönnek be a jegyek a megfelelő számlálót növeled.
Jester
Dead_slow
tag
Üdv!
Ismét kérdéssel fordulnék a topik olvasóihoz, a feladat a következő lenne:
Egy egyszerű teleknyilvántartó programot készítünk téglalap alakú telkek kezelésére. A program bekéri a telkek számát, majd bekéri és eltárolja a telkek helyrajzi számát, a tulaj nevét, telek hosszát és szélességét. Ezután a program kiírja azon telek vagy telkek adatait, amelyeknél a legnagyobb a hossz és a szélesség különbsége.
Eddig jutottam, meghatározza a legnagyobb szélesség-hosszúságú és hosszúság-szélességű tel(ke)ket, csak nem tudom, hogy tudnám rávenni, hogy ahhoz/azokhoz az érték(ek)hez tartozozó mezőket írja ki.
#include<stdio.h>
#include<stdlib.h>
struct telek{
char nev[41];
char hely[41];
int hossz, szeles, kulonb;
};
struct telektar{
int db;
struct telek *telkek;
};
void lefoglal(struct telektar *ft){
printf("Kerem a telkek szamat:");
scanf("%d",&(*ft).db);
(*ft).telkek=(struct telek*)malloc(sizeof(struct telek)*(*ft).db);
}
void beker_telek(struct telek *t){
printf("Tulaj neve: \n");
scanf("%s",(*t).nev);
printf("Helyrajziszam: \n");
scanf("%s",(*t).hely);
printf("Hosszusag: \n");
scanf("%d",&(*t).hossz);
printf("Szelesseg: \n");
scanf("%d",&(*t).szeles);
}
void beker_telektar(struct telektar *tt){
int i;
for(i=0;i<(*tt).db;i++){
beker_telek(&(*tt).telkek[i]);
}
}
void listaz(struct telektar *lt){
int i,j,max;
for(i=0;i<(*lt).db;i++){
if((*lt).telkek[i].kulonb=(*lt).telkek[i].hossz-(*lt).telkek[i].szeles>0){
(*lt).telkek[i].kulonb=(*lt).telkek[i].hossz-(*lt).telkek[i].szeles;
printf("kulonbseg: %d\n",(*lt).telkek[i].kulonb);
}
else{
(*lt).telkek[i].kulonb=(*lt).telkek[i].szeles-(*lt).telkek[i].hossz;
printf("kulonbseg: %d\n",(*lt).telkek[i].kulonb);
}
}
max=0;
for(j=0;j<(*lt).db;j++){
if(max<(*lt).telkek[j].kulonb){
max=(*lt).telkek[j].kulonb;
}
}
printf("legtorzabb telek: %d",max);
}
void felszabadit(struct telektar *ft){
free((*ft).telkek);
(*ft).telkek=NULL;
}
int main(){
struct telektar b;
lefoglal (&b);
beker_telektar (&b);
listaz (&b);
felszabadit (&b);
return 0;
}
[ Szerkesztve ]
Jester01
veterán
Mivel a legnagyobb különbséget már megtaláltad így semmi más dolgod nincs mint mégegyszer végigmenni a telkeken és kiírni azon telkek jellemzőit amiknél a különbség megegyezik a maximummal. (A feladatkiírás szerint több is lehet, különben elég lenne az első ciklusban egyszerűen megjegyezni az elem indexet is.)
Jester
Dead_slow
tag
Köszönöm, ezzel a kiegészítéssel a listaz függvény végére már tökéletesen működik:
int k;
for(k=0;k<(*lt).db;k++){
if(max==(*lt).telkek[k].kulonb){
printf("legtorzabb tel(k)ek:\nHelyrajziszam:%s\nTulajdononsa:%s\n Szelessege:%d\n Hosszusaga:%d\n ",(*lt).telkek[k].hely,(*lt).telkek[k].nev,(*lt).telkek[k].hossz,(*lt).telkek[k].szeles);
}
Retekegér
HARDVERAPRÓD
Hogyan tudom kiíratni egy tömb elemeit sorbarendezés után?
<< Heimdal >>
Karma
félisten
Pl. írsz egy for ciklust 0-tól a tömb mérete-1-ig?
“All nothings are not equal.”
Retekegér
HARDVERAPRÓD
Ja, nem a ciklus megvalósítása érdekel, hanem a képernyőre való kiírás
<< Heimdal >>
Karma
félisten
Arra meg ott a printf függvény, első paraméterében megadhatod a kiírás formátumát (én pl. semmit se tudok jelenleg a tömböt elemeinek típusáról ), utána pedig a többi paraméterben a változókat adhatod meg.
Pl. egy egészeket tartalmazó array nevű tömbre (l elemű), soronként egy érték:
int i;
...
for (i = 0; i < l; i++)
{
printf("%d\n", array[i]);
}
“All nothings are not equal.”
Retekegér
HARDVERAPRÓD
Akkor talán máshol lesz a bibi, ennek a tömbnek az elemeit szeretném kiíratni:
#include <stdio.h>
#include <stdlib.h>
#define SZAM 12
main ()
{
int i, x;
int tomb[SZAM]={4,3,6,7,1,0,9,2,4,8,5,7};
int ismetles=1;
printf("12 elemu tomb rendezese\n");
while (ismetles)
{
ismetles=0;
for (i=0; i<SZAM-1; i++)
{
if (tomb[i]>tomb[i+1])
{
x=tomb[i];
tomb[i]=tomb[i+1];
tomb[i+1]=x;
ismetles=1;
}
}
}
printf("A sorba rendezett tomb: %d\n", tomb[i]);
system("pause");
return 0;
}
<< Heimdal >>
Karma
félisten
Kéne egy ciklus, ami végigmegy a tömb elemein
Most csak az utolsó elemet iratod ki (vagy épp ami i-ben van).
“All nothings are not equal.”
Sk8erPeter
nagyúr
Dehát pont az előbb írta le Karma, hogyan írasd ki a tömb elemeit
printf("A sorba rendezett tomb: \n");
for (i = 0; tomb[i]; i++)
{
printf("%d\n", tomb[i]);
}
(Sortörésekkel elválasztva.)
[ Szerkesztve ]
Sk8erPeter
Retekegér
HARDVERAPRÓD
Okés, kicsit figyelmetlen voltam és rossz helyre raktam be a return-t, így már műxik:
#include <stdio.h>
#include <stdlib.h>
#define SZAM 12
main ()
{
int i, x;
int tomb[SZAM]={4,3,6,7,1,0,9,2,4,8,5,7};
int ismetles=1;
printf("12 elemu tomb rendezese\n");
while (ismetles)
{
ismetles=0;
for (i=0; i<SZAM-1; i++)
{
if (tomb[i]>tomb[i+1])
{
x=tomb[i];
tomb[i]=tomb[i+1];
tomb[i+1]=x;
ismetles=1;
}
}
}
for (i=0; i<SZAM; i++)
{
printf("A sorba rendezett tomb: %d\n", tomb[i]);
}
printf("\n");
system("pause");
return 0;
}
Thx a segítségért!
<< Heimdal >>
Sk8erPeter
nagyúr
Nem az volt a probléma, hogy "rossz helyre raktad be a return-t", hanem hogy nem írattad ki a tömb elemeit ciklussal...
Sk8erPeter
Retekegér
HARDVERAPRÓD
Azon már túlléptem, viszont a ciklus beiktatása után így nézett ki a program:
for (i=0; i<SZAM; i++)
{
printf("A sorba rendezett tomb: %d\n", tomb[i]);
system("pause");
return 0;
}
}
Ezért még nem működött megfelelően.
<< Heimdal >>
gakoska
tag
Sziasztok!
Van egy sürgős feladatom C-ben. Ehhez kétszeresen láncolt listában kellene elemeket létrehozni a többi elemhez képest bárhol, keresni a listában, kiírni és törölni őket.
Ha van valakinek ilyen kódja, ami alapvetően ezeket csinálja meg, legyen szíves küldje el nekem. Nagyjából tudom hogyan kellene, de sokat segítene egy működő kód, helyes szintaktikával, és mindenképpen C-ben, ne C++ban.
Köszönöm előre is
Scroll Lock
tag
Sziasztok!
A felhasználó által definiált méretű tömböt szeretnék létrehozni C nyelvben, de a fordító hibát jelez:
int main (void)
{
double f[2][2]={{3,5},{5,3}};
int n;
scanf("%d",&n);
double x[n][2]};
Másik kérdésem, hogy az "int (*p2)[10];" kifejezés pontosan azt jelenti, hogy van egy pointerem, amely egy olyan tömbre mutat, amely 10 db elemmel rendelkezik? Azt én szabom meg, hogy az a tömb amire mutat hány dimenziós? Tehát a lényeg az, hogy végső soron 10 db elem legyen benne?
Előre is köszönöm a segítséget.
[ Szerkesztve ]
Jester01
veterán
1) C-ben így nem tudsz dinamikus tömböt csinálni. Pointerekkel és malloc-kal kell játszani.
2) Nem, annak a tömbnek pontosan 1 dimenziósnak kell lennie
Jester
Oliverda
félisten
Hello!
Nem vagyok biztos abban hogy jó helyen kopogtatok de valaki esetleg meg tudnád itt mondani hogy ebből hogyan lehetne win alatt futtatható exe fájlt csinálni?
"Minden negyedik-ötödik magyar funkcionális analfabéta – derült ki a nemzetközi felmérésekből."
doc
nagyúr
elvileg egy C forditoval, de nem tudom hogy ezek az include-ok mennyire elerhetoek windows alatt... (gyanitom hogy mint minden mas, ez is eleg vert izzados melo, de legalabbis rakas vackot fel kell tenni hozza)
esetleg felrakhatsz egy Cygwin-t, ami egy Linux-szeru kornyezetet biztosit a gepen, ami alatt mar le tudod forditani a 'hagyomanyos' modon
Karma
félisten
Belekukkantva a CVS-be ez egy darab forrásfájl, ami szinte csak POSIX headereket importál, úgyhogy én a Cygwinre szavazok.
“All nothings are not equal.”
sorath
csendes tag
Üdvözletem mindenkinek
A következő problémám van
adott ez a feladat amit megtudok írni csak alap feltétele h:
A programok a kapott paramétereket kizárólg a main függvény argc, argv[] változóin keresztül vehetik át. Semmiféle getchar, scanf és egyéb felhasználói input nem elfogadható!
És argc,argv változókkal nem tudom megcsinálni esetleg vki tud segíteni hogyan essek neki? Előre is nagyon köszönöm!!
Írjon egy programot, amely a paraméterül kapott min és max érték között kikeresi és listázza a primszámokat.
Tipp: Paraméterek ellenőrzése: legalább 2 (min,max), számok legyenek. Ha min > max akkor swap(min,max).
A primszámok csak önmagukkal és egyel oszthatók. Algoritmus keresése erre a szabályra.
For ciklus min-max értékikg, majd a fenti algoritmus alkalmazása a ciklusváltozóra.
Primszám tesztelő algoritmus:
pl.: ciklus futtatésa 1-től a szam-1-ig, ha szám % ciklusváltozó == 0 akkor nem prim, kilépés!
Ha kiér a ciklusból, akkor a kapott szám prim.
Ez szándékosan a LEGROSSZABB(!) hatásfokú algoritmus, lehet sokkal jobbat találni!
Szükséges libc függvények: printf()
doc
nagyúr
melyik resze nem megy?
nem tudod hogy mi az az argc/argv, vagy hasznalni nem tudod? ez utobbi esetben teljesen mindegy hogy milyen modon kaptad meg a stringeket
sorath
csendes tag
használni nem tudom scanf el simán megy de nem is ismerem argc,v használtatát
Sk8erPeter
nagyúr
argc, argv:
Vegyük azt, hogy a main függvényednek így néz ki a fejléce:
int main(int argc, char *argv[])
{
/* blabla */
}
Itt az argc azt határozza meg, hány paramétered van+1. Azért +1, mert ebben a számban benne van magának a futtatandó programodnak a neve is (pl. akarmi.exe a futtatandó fájlod; de NEM maga a programnév, mint string van benne, hanem csak plusz egy "paraméter").
Az argv pedig sztringre mutató mutatók tömbje, azért char * argv[] (ez ekvivalens ezzel: char **argv); ez megmondja, hány string szerepel a parancssorban. A 0. index maga a program neve (a korábban említett akarmi.exe), mint string, az 1. index (és az azt követő indexek) pedig az(ok), ami(ke)t a fájl neve mögé írtál: akarmi.exe parameter1 (parameter2 parameter3...)
Eszerint ellenőrizgethetsz: pl. azt is csekkolhatod ilyen módon, hogy a program neve után pontosan annyi paramétert adtak-e meg, mint amennyit elvártál, és/vagy a paraméter(ek) neve megegyezik-e valamilyen értékkel, amitől függően hajtasz végre mondjuk egy műveletet, stb...
A Te esetedben ("min és max érték között kikeresi és listázza a primszámokat") pl. így hívod meg a programot a parancssorból:
akarmi.exe 10 50
Még az elején include-old az stdlib-et, és akkor átalakíthatod a paraméterként kapott sztringet egész számmá az atoi függvénnyel:
#include <stdlib.h>
Végezz egy ellenőrzést, hogy a paraméterek száma nem kisebb-e a szükségesnél (kell a min és a max is):
if(argc<3)
/* hibaüzenetek, kilépés hibával */;
A korábban int-ként deklarált min és max változóknak pedig add át a megfelelő értékeket:
min = atoi(argv[1]);
max = atoi(argv[2]);
Ezt követően pedig végezd el a prímtesztelést.
Összefoglalva (a konkrét kiegészítés már a Te dolgod):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int min, max;
if(argc<3)
/* hibaüzenetek, kilépés hibával */;
min = atoi(argv[1]);
max = atoi(argv[2]);
/* ide jöhet a prímtesztelés */
}
Sk8erPeter
sorath
csendes tag
Nagyon szépen köszönöm holnap neki is esek
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
Mai Hardverapró hirdetések
prémium kategóriában
- -54% Dell XPS 9510: i7 11800H, 16GB,512GB,RTX 3050Ti,500nit,100%sRGB,Dell ProSupport gari 2025.3.8.
- -52% Dell Precision 5570 workstation: i7 12700H,16GB,512GB,RTX A1000,500nit,100%sRGB,gari 2026.2.10
- Dell Inspiron 3537 használt laptop
- Használt PC kitűnő állapotban
- ELADÓ 2022. ÉVBEN VÁSÁROLT 3060 Ti és 3080 Trinity RIGEK / KÜLÖN IS ÉRTÉKESÍTEM