Hirdetés

2024. május 2., csütörtök

Gyorskeresés

Hozzászólások

(#451) Zefír válasza Benmartin (#450) üzenetére


Zefír
őstag

:R

(#452) Dolby


Dolby
senior tag

Sziasztok!

Egy ismerősöm Borland C-t használ (3as verzió) és az új gépén (intel 2mag) ha futtatja a programot egyszerűen kilép

lehet h kell valamit telepíteni h a két magot tudja kezelni?

- Nyugalom, a hosszú élet ritka!

(#453) !wannabe


!wannabe
tag

Hi!

Eclipse-t hasznalok illetve probálnék. C++-ban mondjuk "hello world"-t futtatni de allandoan kifagy amikor a 'cout'-hoz erek. Hallottam, hogy be lehet állítani valamit, hogy ez ne legyen problem. Vmit be pipálni vagy vmit nem be 'x'-elni már nem tudom. Hátha itt tud vki segiteni.

(#454) amargo válasza !wannabe (#453) üzenetére


amargo
addikt

Nálam gond nélkül megy, nem x tem sehova semmit.

Mit jelent az, hogy kifagy?

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#455) !wannabe válasza amargo (#454) üzenetére


!wannabe
tag

pl amikor azt irom h:

std::cout

akkor a '::' utan megáll és nem csinál semmit. Elszürkül és tölt kb 4 masodpercig, aztan lehet folytatni a munkat. Neha '<<' utan csinalja. Kaptam egy olyan tippet, hogy a project --> properties-ben kapcsoljam ki az indexelest. Ez megtortent, de a dolgon nem valtoztatott.

Ha mar ennyire belejottem, akkor kerdezek vmi mast is.

#include <iostream>
using namespace std;

void beker(int& elemszam)
{
cout << "Kerem a tömb elemszámát: ";
cin >> elemszam;
}
void feltolt(int elemszam, int * tomb)
{
for(int i=0; i<elemszam; i++)
{
cout << "Kerem adja meg a tömb " << i <<". elemét: ";
cin >> tomb[i];
}
}
void kiir(int elemszam, int * tomb)
{
for(int i=0; i<elemszam; i++)
{
cout << tomb[i];
}
}
void csere(int elemszam, int * tomb)
{
for(int i=0; i<elemszam-1; i++)
{
for(int j=i+1; i<elemszam; i++)
{
if(tomb[i]>tomb[j])
{
int tmp = tomb[i];
tomb[i] = tomb[j];
tomb[j] = tmp;
}
}
}
}



int main()
{
int x;
int * A;
beker(x);
A = new int [x];
feltolt(x,A);
kiir(x,A);
csere(x,A);
delete [] A;
return 0;
}

Ez egy egyszeru cseres rendezes akar lenni. Igazabol ki kellene mostmar csak iratni, de mivel 'tomb[i]'-t iratok ki ezert ugyanugy irja ki az ertekeket ahogy a bemenetre adom. Szoval hogy kellene kiirni a cserevel elrendezett elemeket?

[ Szerkesztve ]

(#456) martonx válasza !wannabe (#453) üzenetére


martonx
veterán

És nem Eclipse-el is ugyanez a hiba?

Próbáltad Visual C++-al, vagy DEV C++-al, ugyanezt?

Én kérek elnézést!

(#457) martonx válasza !wannabe (#455) üzenetére


martonx
veterán

Nem futtattam le a kódod, de szerintem ha simán tomb[i]-t iratod ki, akkor jó lesz. Elvégre a tomb-ben nagyság szerint sorba lesznek rendezve.
Ahogy nézem a main függvényedben hamarabb iratod ki a tomb-öt, mint ahogy sorbarendezed :)

Én kérek elnézést!

(#458) Fire/SOUL/CD válasza !wannabe (#455) üzenetére


Fire/SOUL/CD
félisten

Hali!

Az a hiba, hogy a csere rutinban a belső ciklusodnál az "i" változót használod meg növeled, nem pedig a "j"-t... for(int j=i+1; i<elemszam; i++)

javítsd erre: for(int j=i+1; j<elemszam; j++)

És természetesen a csere függvény után újra irasd ki a tömböt...

Fire.

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#459) !wannabe válasza Fire/SOUL/CD (#458) üzenetére


!wannabe
tag

martonx
Eclipse-nél van ez a helyzet. Pont azt írom, hogy ez a bajom az eclipse-el. DevC-t használtam régen. Viszont azóta rákaptam a codeblocks-ra. Itt a suliba eclipse-t erőltetik, azonban kis programokat kell még írni ebben a félévben, olyanokat amiben az előbb segítettetek. Ehhez gedit-et használok és terminal-ban fordítok. Ma volt az első gyakorlat és eclipse ott is jobbra-balra fagyott. Nem fogom a kisZH-mat abban írni egészen biztos vagyok benne. Ha egy nagyobb projectet kell összehozni biztos hasznos meg kódkiegészítő stb....de éppen írtam aggregátornak is, hogy eclipse-ben kisZH-t írni olyan mint ágyúval hangyára lőni!

Fire
Köszi a segítséget, még annyit kellett, hogy a külső ciklust ne '1' től hanem '0'-tól indítsam mivel így a tömb 0. elemét mindig úgyhagyta. A lényeg, hogy most működik :)

[ Szerkesztve ]

(#460) amargo válasza !wannabe (#459) üzenetére


amargo
addikt

eclipse fagyogat?

Gondolom a hozzáértők beállítgatnak mindenfélét, és amire Te oda kerülsz a gépelé, egy romhalmaz fogad.
Ha a CodeBlocks vagy DEV C++ hozzá hasonlítod, az számomra elég erős. Pedig nem orvérzésig használom, de szoktam használni több könyvtárral, az elején, amíg nem tudtam felkonfigurálni, nekem is gondjaim voltak (ez tény)..

Inkább tedd ki pendrive-ra és onnan fejlesz (ha nincs laptop).

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#461) !wannabe válasza amargo (#460) üzenetére


!wannabe
tag

Bizony ez is benne van, hogy előttünk van egy csoport és nyomkodnak észnélkül :)
Nem az eclipse-hez hasonlítom a DEVC-t. Látom a különbséget, martonx kérdezte, hogy kipróbáltam-e már a DEVC-t. Arra válaszoltam, hogy igen és CB-t is használtam.
A notimon van eclipse az előző progit is abban írtam. Néha itt is fagy bár most úgytűnik jó napja van.
Egyébként miért baj, ha konzolbol fordítok?

[ Szerkesztve ]

(#462) amargo válasza !wannabe (#461) üzenetére


amargo
addikt

Félreértés: semmi baj, ha console-ból fordítasz.

Bár itt megkérdezném: miért azt használod?

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#463) !wannabe válasza amargo (#462) üzenetére


!wannabe
tag

Mert nem tudok mást használni. Eclipse-el elmondtam, hogy mi a bajom. Telepiteni meg nem tudok a benti gepekre, mert rndsz gazdai jogosultsag kellene. Maradt a gedit, mcedit páros.

[ Szerkesztve ]

(#464) amargo válasza !wannabe (#463) üzenetére


amargo
addikt

eclipse c/c++ 80M nem kell telepíteni.
Semmit nem konfiguráltam és simán lefordult egy helloworld.

Pendrive-ra is kirakhatod, talán kicsit lassabb lesz(vagy, amíg használod felmásolod a gépre), de legalább hordozható.

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#465) !wannabe válasza amargo (#464) üzenetére


!wannabe
tag

Köszönöm a segítséget Amargo. :K Viszont szerintem én maradok a gedit-nél kisZH-k erejéig, itthom meg pöröghet az eclipse.

(#466) vgergo


vgergo
aktív tag

Olyan problémám van, hogy az alábbi kódot lefordítom és
test.exe ertek futtatom
, akkor az output a következő:
ertek
YYYYYY

#include <iostream>
int main (int argc, char *argv[]) {
cout <<argv[1]<<"\n";
if (argv[1]=="ertek"){cout<<"XXXXXX";}else{cout<<"YYYYYY";}
}

Azt nem értem, hogy mikor kiíratom az argv[1]-t ertek-t kapom, de mikor ellenőrzöm akkor nem egyenlő ertek-kel.

Gondolom ezzel is ugyanaz a probléma, mint az előzővel.

switch (argv[1])
{
case "ertek0" :cout <<"X";break;
case "ertek1" :cout <<"C";break;
case "ertek2" :cout <<"V";break;
default :cout <<"Egyeb";break;}
}

[ Szerkesztve ]

(#467) doc válasza vgergo (#466) üzenetére


doc
nagyúr

stringet az strcmp vagy strcmpi fuggvennyel ellenorzunk, az argv[1]=="ertek" akkor igaz, ha az argv[1] ugyanoda mutat, mint ahol a programodban az "ertek" van letarolva, ez pedig nyilvan nem teljesul

(#468) Jester01 válasza doc (#467) üzenetére


Jester01
veterán

Vagy, mivel ez c++ kód akar lenni, a string osztályt használjuk amihez van operator== overload.

Jester

(#469) vgergo válasza doc (#467) üzenetére


vgergo
aktív tag

Köszönöm szépen a gyors segítséget.

(#470) !wannabe válasza vgergo (#469) üzenetére


!wannabe
tag

Az alábbi kódrészlet a tömb elemei közül választja ki a legkisebbet.
Valaki elmagyarázná, hogy hogyan működik?

double& min(int elemszam, double * tomb)
{
double* legkisebb=tomb;

for(int i=1; i<elemszam; i++)

if(*(tomb+i)<*legkisebb) legkisebb=tomb+i;

return *legkisebb;
}

(#471) doc válasza !wannabe (#470) üzenetére


doc
nagyúr

nem igazan a hagyomanyos megoldas, es foleg nem attekintheto...

szoval:
parameterkent atadod ugye a tomb elemeinek szamat, es egy mutatot a tombre

double* legkisebb=tomb; -> a 'legkisebb' egy double tipusra mutato mutato, indulaskor a tomb cimere mutat, ami a tomb legelso eleme

utana egy ciklusban vegigjarja a tomb osszes elemet a masodiktol (1. index) kezdve
a tomb valtozo a tomb legelejere mutat, ha hozzaadsz egy szamot, akkor az annyiadik elemet kapod meg, tehat a tomb+5 az 5. indexu (sorban a hatodik) elemre mutat
ha a (tomb+i) cimen levo ertek kisebb mint amire a legkisebb mutat, akkor a 'legkisebb' valtozo a megfelelo elemre fog mutatni (tomb+i)

a vegen meg visszaadja azt az erteket, amire a 'legkisebb' nevu mutato mutat

azert igy lenyegesen olvashatobb:

double min(int elemszam, double tomb[])
{
double legkisebb=tomb[0];
for(int i=1; i<elemszam; i++)
if(tomb[i]<legkisebb) legkisebb=tomb[i];
return legkisebb;
}

(#472) martonx válasza !wannabe (#470) üzenetére


martonx
veterán

Úgy látom lassan lehetne egy algoritmusos topikot is nyitni, a kérdések komolyságát elnézve.

Én kérek elnézést!

(#473) !wannabe válasza martonx (#472) üzenetére


!wannabe
tag

Ezt hogy érted? Triviálisat kérdezek és irónikusan mondod?

[ Szerkesztve ]

(#474) martonx válasza !wannabe (#473) üzenetére


martonx
veterán

Ez egy C++ topik, ahol mint a címe is mutatja nyelv specifikus kérdésekkel kellene foglalkozni (pl. miért nem fordul le ez vagy az, hogy kellene C++-ban megoldani ilyen vagy olyan problémát sb...
A sorbarendezés az egyik legtriviálisabb algoritmus, és te azt kérted, hogy magyarázzuk el, hogy működik. Egy egyszerű algoritmus magyarázatának SZVSZ semmi köze a C++-hoz, még ha éppen C++-ban is kell alkalmaznod az adott algoritmust.

Én kérek elnézést!

(#475) !wannabe válasza martonx (#474) üzenetére


!wannabe
tag

Rendben legközelebb off-ként fogom feltenni az ilyen jellegű kérdéseket, mert neharagudj, de ezért nem nyitok egy új topic-ot. Ha meg már van olyan akkor elnézést, hogy nem oda irtam, szóljatok és a következő odamegy.

(#476) doc válasza martonx (#474) üzenetére


doc
nagyúr

szerintem ez sokkal inkabb volt nyelvi kerdes mint algoritmikus (pointerek, tombok, stb), ha mar mindenaron bele akarsz kotni, akkor abba hogy ez inkabb C mint C++ :)

(#477) vampire_girl


vampire_girl
csendes tag

Sziasztok, nagyon nagy szuksegem lenne c++ segitsegre egy iskolai feladathoz, sok mulik rajta.
Tehat egy "teszt" c++ programot kell megirjak , ami abbol all hogy minden kerdes utan van egy a,b,c valasz. A kerdesem az lenne, hogy milyen utasitassal irhatnam fel azt hogy ha pl az a-t valasztjuk akkor 3-al nojjon az osszeg szama, ha b-t valasszuk akkor 2-vel es ha c-t akkor 1-el.

Nagyon fontos lenne, elore is halas vagyok ha esetleg vki segiteni tunda :F :R

redshine

(#478) martonx válasza vampire_girl (#477) üzenetére


martonx
veterán

Megszóltak, hogy túl sokat fikázom a kérdéseket, úgyhogy ezt a kérdést inkább nem kommentálom...

Én kérek elnézést!

(#479) vampire_girl


vampire_girl
csendes tag

bocs h segitseget mertem kerni , ugylatom tul nagyfej vagy ahhoz hogy segits, nha azert kosz h nem kommentaltad ;)

redshine

(#480) D@ni88


D@ni88
addikt

hali, kicsit tanácstalan vagyok, annyi gondom lenne hogy egy egységmátrixot kéne létrehozni, dinamikus tömbbel.
erre jutottam. esetleg valaki?

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int max1 =20;
setlocale(LC_ALL,"hun");
cout << "Adja meg az egységmátrix szélességét: ";
cin >> max1;


if (max1<2||max1>20)
{
cerr<<"Megadott paraméterek nem felelnek meg!"<<endl;
exit(1);
}
else
{
int **n =new int * [max1];
int k=1;

for (int i=0; i<max1; ++i)
{
for (int j=0; j<max1; j++)
{
if(i==j)
{
n[i][j]=1;
}
else
{n[i][j]=0;}
}
k++;

}

for (int i=0; i<max1; ++i)
{
for (int j=0; j<max1; j++)
{
cout.width(3);
cout << n[i][j];
}

cout << endl<<endl;
}

}
}

tudom hogy a végére még kell a tömb helyének a felszabadítása, de ez lényegtelen... mert nem csinál semmit, ki akar lépni...

(#481) amargo válasza D@ni88 (#480) üzenetére


amargo
addikt

int **n =new int * [max1];

Itt létrehoztál egy mutatókból álló tömböt egy mutatóra.
Azaz, a benne lévő mutatók területét még nem foglaltad le, hanem csak a mutatókból álló tömb méretét.

Ami hiányzik, hogy lefoglald a benne lévő mutatóknak is a helyét.
Tovább nem néztem, de ez mindenképpen szükséges, hogy ne csak a vakvilágnak próbálj meg értéket adni :)

Továbbá egy hasznos tanács ha a mélységével együtt struktúrába rendeled.
Egyszerűbb lesz kezelned.

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#482) D@ni88 válasza amargo (#481) üzenetére


D@ni88
addikt

de akkor mit kellene odaírni? mert egy 2d-s tömb is így néz ki wikin...köszi, csak ez a sok mutatós akármi kicsit bezavar... hogy utálom én őket :D

(#483) D@ni88 válasza D@ni88 (#482) üzenetére


D@ni88
addikt

na közben meglett :) köszi szépen :)

(#484) amargo válasza D@ni88 (#483) üzenetére


amargo
addikt

Egy lehetséges megoldást, azért beteszek. De örülök, hogy rájöttél. Ha csak beraktam volna a megoldást, nehezebben értenéd meg. De lehet tévedek.

struct matrix
{
int** pData;
int dom;
};

//---------------------------------------------------------------------
bool GetMatrix(matrix &pMatrix)
{
if( pMatrix.dom == 0 && pMatrix.dom == INT_MAX) //hiba a mátrix létrehozásánál, elég az alapokhoz.
{
return false;
}
pMatrix.pData = new int*[ pMatrix.dom ];
for(int i = 0; i < pMatrix.dom; i++)
{
pMatrix.pData[ i ] = new int[ pMatrix.dom ];
}
return true;
}//bool GetMatrix(matrix &pMatrix)

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#485) #82189568


#82189568
törölt tag

Sziasztok! Most kezdtem el C++ t tanulni eddig Pascalt tanultam, de fel kell zárkóznom, mert a 2. félévtől új suliba járok.
Tippek, trükkök , hogy hol , miből , lehetőleg sok példával végigvezetve lehet hatékonyan megtanulni a nyelvet ??

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

int main()
{
clrscr();
int nr=0;

cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] n";
cin >> nr;

switch(nr)
{
case 1:
cout << "Te a jelek szerint FIU vagy! n";
break;
case 2:
cout << "Te a jelek szerint LANY vagy! n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est n";
break;
}
system("PAUSE");
return 0;
}

Annyi lenne a kérdésem még, hogy hogyan lehetne megoldani, hogyha helytelen értéket kap a program akkor újra kérdezze és ne lépjen ki a programból ??

Köszönöm !

(#486) gygabor88 válasza #82189568 (#485) üzenetére


gygabor88
tag

www.freeprogrammingresources.com oldalról kiindulva találhatsz rengeteg cpp példakódot. Könyvnek Bjarne Stroustrup féle A C++ programozási nyelv című könyv az, ami mindent tartalmaz. Ebből nem egyszerű dolog tanulni, nem is kezdőknek írták, de ha keresel mellette példakódokat, akkor menni fog.

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

int main()
{
clrscr();
int nr=0;
bool ujra;

do {
ujra = false;
cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] n";
cin >> nr;

switch(nr)
{
case 1:
cout << "Te a jelek szerint FIU vagy! n";
break;
case 2:
cout << "Te a jelek szerint LANY vagy! n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est n";
ujra = true;
break;
}
}while(ujra);
system("PAUSE");
return 0;
}

(#487) #82189568 válasza gygabor88 (#486) üzenetére


#82189568
törölt tag

Köszönöm szépen a segítséget :C , végre találtam egy fórumot ahol segítenek is :)

Még mindig nem stimmel valami, gondolom includeolni kéne valamit.

(#488) gygabor88 válasza #82189568 (#487) üzenetére


gygabor88
tag

Ez a borland környezet már nagyon régi, bool típust nem ismeri fel a compiler. Használj helyette codeblocks környezetet. Conio már nem támogatott, include-nál meg nem használjuk a .h kiterjesztést ha alap könyvtárakat használunk. Mivel iostreamet használsz felesleges a stdio. Itt a működő kód:

#include <iostream>

using namespace std;

int main()
{
int nr=0;
bool ujra;

do {
ujra = false;
cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] n";
cin >> nr;

switch(nr)
{
case 1:
cout << "Te a jelek szerint FIU vagy! n";
break;
case 2:
cout << "Te a jelek szerint LANY vagy! n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est n";
ujra = true;
break;
}
}while(ujra);
system("PAUSE");
return 0;
}

[ Szerkesztve ]

(#489) #82189568 válasza gygabor88 (#488) üzenetére


#82189568
törölt tag

Köszönöm szépen a segítségedet, nagyon királyul működik, de valahogy Nekem a Borland C fekszik a legjobban ott tudom , hogy mit hova merre meddig, de biztos amit ajánlottál is jó, csak nem tudtam megfelelően használni, most 5.02es Borlandot tettem fel, ez már grafikus felületű.

Megmutattam ma ugyan ezt a kérdést a tanáromnak, de hirtelen Ő sem jött rá, hogy a régi Borlandba , hogy lehetne megoldani.

Ilyen úton próbáltunk elindulni :

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
clrscr();
char nr;

do {
cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] \n";
cin >> nr;
}while( (0<nr) && (nr<3) );

switch(nr){
case '1':
cout << "Te a jelek szerint FIU vagy! \n";
break;
case '2':
cout << "Te a jelek szerint LANY vagy! \n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est \n";
}
system("PAUSE");
return 0;
}

(#490) martonx válasza #82189568 (#489) üzenetére


martonx
veterán

Figyi. Ahogy feljebb már mondták, az ős Borland fordító nem ismeri a bool típust. Azaz elindulhatsz ezeregy irányba, akkor sem fogja ismerni.

Szóval érdemes barátkozni a grafikus felülettel. Azok a régi szép DOS-os idők már 14 éve elmúltak.

Én kérek elnézést!

(#491) #82189568 válasza martonx (#490) üzenetére


#82189568
törölt tag

Nem nekem van bajom vele :) Én imádom a grafikus dolgokat, de ha egyszer benn ez van , meg ezzel oktatnak akkor Én hiába tudom megoldani itthon ha benn meg nem müködik

(#492) PazsitZ


PazsitZ
addikt

Miért szükséges ehhez mindenképp bool típus :F ?
Jó, jó elvileg úgy szebb, de egy sima integer is megteszi...

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

char nr;
int x;

int main()
{
clrscr();
do{
do{
cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] \n";
cin >> nr;
}while( (0<nr) && (nr<3) );
x=0;
switch(nr)
{
case '1':
cout << "Te a jelek szerint FIU vagy! \n";
break;
case '2':
cout << "Te a jelek szerint LANY vagy! \n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est \n";
x=1;
break;
}
}while(x!=0);
system("PAUSE");
return 0;
}

Mondjuk még új változó sem szükséges jelen esetben szvsz:

#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

char nr;

int main()
{
clrscr();
do{
do{
cout<<"FIU(1) v LANY(2) vagy ? [ird be a szamod] \n";
cin >> nr;
}while( (0<nr) && (nr<3) );
switch(nr)
{
case '1':
cout << "Te a jelek szerint FIU vagy! \n";
break;
case '2':
cout << "Te a jelek szerint LANY vagy! \n";
break;
default:
cout << "Nem irtal be se 1-est, se 2-est \n";
break;
}
}while(nr!='1' && nr!='2');
system("PAUSE");
return 0;
}

[ Szerkesztve ]

- http://pazsitz.hu -

(#493) Psych0


Psych0
őstag

Sziasztok!

Hogy kéne visual c++ alatt fullscreenbe váltani?
Desktop resolution kell, tehát nincs changedisplaysettings.

gondoltam nyitok egy ablakot, aminek a style-ja WS_POPUP
DE, ha visszaváltok windowed módra(eddig is az volt csak desktop felbontású keretnélküli magasprioritású), akkor oda az aero. viszont ha nem 1680*1050-es ablakot csinálok, akkor nem bántja az aerot.

ha WS_POPUPWINDOW a style. akkor minden ok, csak van egy egy pixel széles fehér keretem, ami gáz. ha megpróbálom az adjustwindowrect-tel eltávolítani a keretet, akkor csak az alsó és a jobb tűnik el.

hogy lehetne ezt megoldani?
nem vagyok hivatásos programozó, ezért elnézést, ha hülyeség.

"As an online discussion grows longer, the probability of a comparison involving Nazis or Hitler approaches 1."

(#494) icespeak


icespeak
csendes tag

Hi mindenki. Szerintetek mi lehet az alábbi kóddal a probléma?

/*
10. A Föld felszínének egy vonala mentén egyenlő távolságonként megmértük a terep tengerszint
feletti magasságát, és a mért értékeket egy vektorban tároljuk. Hány darab hegycsúcs van a
mérési sorozatban?
*/

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

int Megszamol(const vector<int> t, int &c);
bool ReadFromFile(const string &fname, vector<int> &t);
void ReadFromKeyboard(vector<int> &t);
int Read12(const string &msg, const string &errormsg);

int main(int argc, char *argv[])
{
char ch;
do{
// Adatok beolvasása
vector<int> t;
bool file_ok = true;

// Adatbevitel módja
int v;
if(argc>1) v = 1;
else{
cout << "Az adatbeolvasás módja:"<< endl
<< " SZÖVEGES FÁJL(1)"<< endl
<< " BILLENTYŰZET (2)"<< endl;
v = Read12("Válasszon: ","Csak 1 vagy 2 közül választhat!");
}

// Beolvasás fájlból
string fname;
switch(v)
{
case 1 :
if(argc<=1){
cout << "Adja meg a szöveges fájl nevét: ";
cin >> fname;
}
else fname = argv[1];

file_ok = ReadFromFile(fname, t);
if(!file_ok && argc>1) {
char ch; cin >> ch;
exit(1);
}
break;
case 2 :
cout << "Adjon meg mérési értékeket! Kilépés: quit \n";
ReadFromKeyboard(t);
break;
}

// Kiíratás
if(file_ok)
{
if(Megszamol(c)) cout << "Hegycsúcsok száma:" << c << endl;
else cout << "Nincs hegycsúcs"<< endl;

cout << endl << "Futtassam újra? (I/N) "; cin >> ch;
}
}while(ch!='n' && ch!='N');

return 0;
}

//Feladat: 1-es vagy 2-es beolvasása
//Tevékenység: Billentyűzetről kizárólag két szám, az 1-es vagy a 2-es valamelyikét fogadja el
// más adatot nem
//Bemenő adat: string msg - a beolvasás előtt megjelenítendő üzenet
// string error - hibás adat beírásakor megjelenítendő üzenet
//Kimenő adat: int v - 1-es vagy 2-es szám (visszatérési értékként)
int Read12(const string &msg, const string &errormsg)
{
int n;
bool hiba = true;
do{
cout << msg;
string str;
cin >> str;
n = atoi(str.c_str());
hiba = (n==0 && str!="0") || n<1 || n>2;
if(hiba) cout << errormsg << endl;
}while(hiba);
return n;
}

//Feladat: Integereket tartalmazó tömb (vector) feltöltése billentyűzetről
//Tevékenység: Billentyűzetről olvas be egymás után integereket és helyezi el őket egy vektorban
// addig, amíg a "quit" szót nem írjuk.
//Bemenő adat: -
//Kimenő adat: vector<int> t
void ReadFromKeyboard(vector<int> &t)
{
int meres;
cin >> meres;
while(meres!="quit"){
t.push_back(meres);
cin >> meres;
if (meres < 0){
meres = 0;
}
}
}

//Feladat: Integereket tartalmazó vektor feltöltése szöveges állományból
//Tevékenység: Megnyitja a megadott szöveges állományt (sikertelen kísérlet esetén hibát jelez)
// majd a fájlból egymás után beolvassa az összes elválasztójelekkel határolt számot
// és elhelyezi azokat egy vektor-ban
//Bemenő adat: string fname - szöveges állomány neve
//Kimenő adat: vector <int> t
// bool ok - sikerült-e az állomány megnyitása (visszatérési értékként)
bool ReadFromFile(const string &fname, vector<int> &t)
{
ifstream x(fname.c_str());
if(x.fail()){
cout << "Hibás fájlnév!"<< endl;
return false;
}

int meres;
x >> meres;
while(!x.eof()){
t.push_back(meres);
x >> meres;
if (meres<0){
meres = 0;
}
}
return true;
}

int Megszamol(const vector<int> t, int &c){
int c=0;
for(int i=0; i<(int)t.size(); i++){
if(i<i+1 || i+1>i+2){
c=c+1;
}
}
return c;
}

[ Szerkesztve ]

(#495) Jester01 válasza icespeak (#494) üzenetére


Jester01
veterán

1. hiányzik az using namespace std; (fordítófüggő, de ez a helyes)
2. a Megszamol függvénynek felesleges a c paraméter, a t viszont lehet referencia, ha már úgyis const.
3. a Megszamol függvény hívásakor a t vektort viszont illene átadni
4. a Megszamol függvényben a vektor elemeit kellene hasonlítani. Gondolom a hegycsúcs akkor hegycsúcs ha magasabb a tőle jobbra és a tőle balra lévő értéknél is. Tehát feltehetőleg || helyett && feltétel kell, és a szélső elemek nem lehetnek csúcsok.
5. a ReadFromKeyboard függvényben int változóba olvasol be, azt nem lehet összehasonlítani a "quit" stringgel. Vagy olvass stringbe mint a Read12 függvényben, vagy használj más kilépési feltételt. Az én verziómban negatív szám beírásával lehet kilépni.

--- t.cpp.orig 2009-03-11 15:04:31.000000000 +0100
+++ t.cpp 2009-03-11 15:18:08.000000000 +0100
@@ -3,7 +3,9 @@
#include <sstream>
#include <vector>

-int Megszamol(const vector<int> t, int &c);
+using namespace std;
+
+int Megszamol(const vector<int> &t);
bool ReadFromFile(const string &fname, vector<int> &t);
void ReadFromKeyboard(vector<int> &t);
int Read12(const string &msg, const string &errormsg);
@@ -52,7 +54,8 @@
// Kiíratás
if(file_ok)
{
- if(Megszamol(c)) cout << "Hegycsúcsok száma:" << c << endl;
+ int c = Megszamol(t);
+ if(c > 0) cout << "Hegycsúcsok száma:" << c << endl;
else cout << "Nincs hegycsúcs"<< endl;

cout << endl << "Futtassam újra? (I/N) "; cin >> ch;
@@ -92,12 +95,9 @@
{
int meres;
cin >> meres;
- while(meres!="quit"){
+ while(meres > 0){
t.push_back(meres);
cin >> meres;
- if (meres < 0){
- meres = 0;
- }
}
}

@@ -128,10 +128,10 @@
return true;
}

-int Megszamol(const vector<int> t, int &c){
+int Megszamol(const vector<int> &t){
int c=0;
- for(int i=0; i<(int)t.size(); i++){
- if(i<i+1 || i+1>i+2){
+ for(int i=0; i<(int)t.size()-1; i++){
+ if(t[i]<t[i+1] && t[i+1]>t[i+2]){
c=c+1;
}
}

[ Szerkesztve ]

Jester

(#496) icespeak válasza Jester01 (#495) üzenetére


icespeak
csendes tag

Nagyon köszönöm, hogy kijavítottad, hálám a sírig...:R

(#497) Jester01 válasza icespeak (#496) üzenetére


Jester01
veterán

De még én is elrontottam :B , mert a megszámol függvényben 2-t kell levonni, nem 1-et, így:

for(int i=0; i<(int)t.size()-2; i++){

Jester

(#498) Capricornus


Capricornus
aktív tag

Sziasztok!

A probléma a következő: egy graf. felületű progit kell win xp alatt vezérelni automatikusan, ezt megoldottam virtuális billentyű lenyomásokkal (keybd_event), viszont ez csak akkor működik, ha aktív a kérdéses ablak.
Most próbálok a progiba beépíteni egy olyan megoldást, hogy PID alapján mindig előtérbe hozza és aktívvá tegye az ablakot, arra az esetre, ha valami miatt lekerülne róla a fókusz.
Egy ismerősöm küldött egy forrást amit próbálok beépíteni a progimba, de ez csak félig jó, mert előtérbe hozza az ablakot, de utána nem aktiválja:(
Ha valakinek van valami ötlete, vagy javaslta azt szivesen fogadom. a Forrás:

#include <windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int procId;

HWND windowHandle;

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
{
DWORD processId;
GetWindowThreadProcessId(hWnd,&processId);
int id = processId;
if(procId == id)
{
windowHandle = hWnd;
return FALSE;
}
return TRUE;
}

int main(int argc, char **argv) {
if (argc < 2) {
cout << "Használat: filenév processId" << endl;
} else {
procId = atoi(argv[1]);
EnumWindows(MyEnumProc,0);
if (windowHandle != NULL) {
SetForegroundWindow(windowHandle);
SetActiveWindow(windowHandle);
}
}
}

Per aspera ad astra!

(#499) martonx válasza Capricornus (#498) üzenetére


martonx
veterán

Szia!

Én a helyedben inkább hook-olnám a keyboardot, egy dll hívással. Már ha jól értettem a problémádat, és billentyűzettel vezéreled a felületet.

Én kérek elnézést!

(#500) Capricornus válasza martonx (#499) üzenetére


Capricornus
aktív tag

hmm, ezt ki tudnád fejteni kicsit bővebben?
a lényeg, hogy magára lenne hagyva a cucc és a progim a másik proginak küldené a billentyű lenyomásokat, a valóságban nem lenne a közelben élő ember

Per aspera ad astra!

Copyright © 2000-2024 PROHARDVER Informatikai Kft.