Hirdetés

2024. május 1., szerda

Gyorskeresés

Hozzászólások

(#1601) Jester01 válasza VaZso (#1600) üzenetére


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

(#1602) VaZso válasza Jester01 (#1601) üzenetére


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;
}

(#1603) Karma válasza VaZso (#1602) üzenetére


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

(#1604) 3man válasza Karma (#1603) üzenetére


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 ]

(#1605) Echo2211


Echo2211
csendes tag

Sziasztok!

ANSI C-ben kellene megírnom egy kezdő szintű programot, de ehhez túl szerények az ismereteim. :U 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! :D )

Köszi előre is!

(#1606) shev7 válasza Echo2211 (#1605) üzenetére


shev7
veterán

ar? :DDD

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

(#1607) TrakToros


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:)

(#1608) Darth_Revan válasza TrakToros (#1607) üzenetére


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

(#1609) Dead_slow


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 :D

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 ]

(#1610) Gyuri16 válasza Dead_slow (#1609) üzenetére


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!

(#1611) Dead_slow válasza Gyuri16 (#1610) üzenetére


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");
}


}

(#1612) Gyuri16 válasza Dead_slow (#1611) üzenetére


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!

(#1613) Dead_slow válasza Gyuri16 (#1612) üzenetére


Dead_slow
tag

Mondtam, hogy nagyon nem vágom :DDD ,de ettől függetlenül ezer dologgal teszteltem és egyszer sem fagyott meg.

(#1614) Gyuri16 válasza Dead_slow (#1613) üzenetére


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!

(#1615) Dead_slow válasza Gyuri16 (#1614) üzenetére


Dead_slow
tag

Köszönöm, a kiegészítést/magyarázatot! :R
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.

(#1616) Dead_slow


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.:B3). 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?

(#1617) Gyuri16 válasza Dead_slow (#1616) üzenetére


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!

(#1618) Dead_slow válasza Gyuri16 (#1617) üzenetére


Dead_slow
tag

Köszönöm!
Így, már működik.

[ Szerkesztve ]

(#1619) Dead_slow


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 :D, 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 :R

(#1620) Gyuri16 válasza Dead_slow (#1619) üzenetére


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!

(#1621) Gabessss


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

(#1622) Dirty_Pio


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 ]

(#1623) Jester01 válasza Dirty_Pio (#1622) üzenetére


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

(#1624) Agger


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

(#1625) Jester01 válasza Agger (#1624) üzenetére


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

(#1626) Dead_slow


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 ]

(#1627) Jester01 válasza Dead_slow (#1626) üzenetére


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

(#1628) Dead_slow válasza Jester01 (#1627) üzenetére


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);
}

(#1629) Retekegér


Retekegér
HARDVERAPRÓD

Hogyan tudom kiíratni egy tömb elemeit sorbarendezés után?

<< Heimdal >>

(#1630) Karma válasza Retekegér (#1629) üzenetére


Karma
félisten

Pl. írsz egy for ciklust 0-tól a tömb mérete-1-ig?

“All nothings are not equal.”

(#1631) Retekegér válasza Karma (#1630) üzenetére


Retekegér
HARDVERAPRÓD

Ja, nem a ciklus megvalósítása érdekel, hanem a képernyőre való kiírás :)

<< Heimdal >>

(#1632) Karma válasza Retekegér (#1631) üzenetére


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

(#1633) Retekegér válasza Karma (#1632) üzenetére


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

(#1634) Karma válasza Retekegér (#1633) üzenetére


Karma
félisten

Kéne egy ciklus, ami végigmegy a tömb elemein :U
Most csak az utolsó elemet iratod ki (vagy épp ami i-ben van).

“All nothings are not equal.”

(#1635) Sk8erPeter válasza Retekegér (#1633) üzenetére


Sk8erPeter
nagyúr

Dehát pont az előbb írta le Karma, hogyan írasd ki a tömb elemeit :D
printf("A sorba rendezett tomb: \n");
for (i = 0; tomb[i]; i++)
{
printf("%d\n", tomb[i]);
}

(Sortörésekkel elválasztva.)

[ Szerkesztve ]

Sk8erPeter

(#1636) Retekegér válasza Karma (#1634) üzenetére


Retekegér
HARDVERAPRÓD

Okés, kicsit figyelmetlen voltam és rossz helyre raktam be a return-t, így már műxik: :D
#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 >>

(#1637) Sk8erPeter válasza Retekegér (#1636) üzenetére


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

Sk8erPeter

(#1638) Retekegér válasza Sk8erPeter (#1637) üzenetére


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

(#1639) gakoska


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

(#1640) Scroll Lock


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 ]

(#1641) Jester01 válasza Scroll Lock (#1640) üzenetére


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

(#1642) Oliverda


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

(#1643) doc válasza Oliverda (#1642) üzenetére


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

(#1644) Karma válasza doc (#1643) üzenetére


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

(#1645) sorath


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()

(#1646) doc válasza sorath (#1645) üzenetére


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

(#1647) sorath válasza doc (#1646) üzenetére


sorath
csendes tag

használni nem tudom scanf el simán megy de nem is ismerem argc,v használtatát

(#1648) Sk8erPeter válasza sorath (#1647) üzenetére


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

(#1649) sorath válasza Sk8erPeter (#1648) üzenetére


sorath
csendes tag

Nagyon szépen köszönöm holnap neki is esek:)

(#1650) sorath válasza sorath (#1649) üzenetére


sorath
csendes tag

ez sehogy se megy ezzel az argc,v vel hogyan adom meg neki h mennyi legyen max? és hogyan tudom kiíratni scanf nélkül?

Copyright © 2000-2024 PROHARDVER Informatikai Kft.