Hirdetés
- Xiaomi 14T Pro - teljes a család?
- iPhone topik
- „Új mérce az Android világában” – Kezünkben a Vivo X300 és X300 Pro
- Milyen okostelefont vegyek?
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Fotók, videók mobillal
- Vivo X200 Pro - a kétszázát!
- Kezünkben a OnePlus 15 és az Oppo Find X9-ek
Új hozzászólás Aktív témák
-
válasz
cellpeti
#4511
üzenetére
Megelőztek.

While ciklus: karaktereket olvas be, amíg nem ütsz entert úgy, hogy szerepel a @ karakter a begépelt szövegben. Közben a gyak-ban eltárolja, hogy az adott (ASCII kódú) karakterből mennyi darab volt.
For ciklus: végigfut az előzőleg feltöltött gyak-on. Ha az adott elem nem nulla (tehát volt olyan karakter beolvasáskor), akkor kiírja azt, illetve annak darabszámát. -
Karma
félisten
válasz
cellpeti
#4511
üzenetére
Nem jól érted, a beolvasott karaktereket (nagyon helyesen!) nem tárolja a program, csak a darabszámot gyűjti.
Nézd meg a ++gyak[ c ] sort jobban! Vedd figyelembe, hogy a [] operátor erősebb, mint a ++, illetve a tényt, hogy a gyak tömb 256 elemű. No meg nem árt az az ismeret hozzá, hogy a char típus nyolc bites, úgyhogy egy beolvasott karakter 256 különböző értéket vehet fel.
-
peeeeeti
csendes tag
válasz
cellpeti
#654
üzenetére
#include <iostream>
#include <stdio.h>
#include <sstream>
#include <string>
using namespace std;
bool szamjegyeke(string);
string spacevalfeltolt(string);
int osszeg(int*, int);
int main()
{
string szam;
int tomb[6], i = 0;
do
{
if(i) cout << "A meadott szamsor nem megefelelo!";
system("pause");
system("cls");
cout << "Add meg a 6 szamjegyet: ";
getline(cin, szam);
if(szam.empty()) break;
szam = spacevalfeltolt(szam);
istringstream is(szam);
is >> tomb[0] >> tomb[1] >> tomb[2] >> tomb[3] >> tomb[4] >> tomb[5];
i++;
}while(szam.size() < 6 || szamjegyeke(szam) || osszeg(tomb, 5) / 6 == tomb[5]);
system("pause");
}
bool szamjegyeke(string s1)
{
for(int i = 0; i < s1.size(); i++)
if(!isdigit(s1[i]))
return false;
return true;
}
string spacevalfeltolt(string s1)
{
string s2;
for(int i = 0; i < s1.size(); i++)
{
s2 += s1[i];
s2 += ' ';
}
return s2;
}
int osszeg(int *a, int hossz)
{
int eredmeny;
for(int i = 0; i < hossz; i++)
eredmeny += a[i];
return eredmeny;
}Ez valami beadandó?
-
shev7
veterán
válasz
cellpeti
#2034
üzenetére
szerintem ez egy novekvobe rendezo algoritmus.
Mukodese egyszeru: ahogy a kulso for ciklus vegighalad az elemeken az aktualisan vizsgalt elem elott a tomb mar rendezett.
A belso ciklus a kulso ciklus aktualis elemetol kezdve egy minimum keresest hajt vegre. Ha talal egy elemet ami kisebb mint az i. elem akkor megcsereli oket ( a g valtozot ne keverd ide, az csak egy segedvaltozo a cserehez) es innentol kezdve ahhoz fog hasonlitani. Tehat miutan a belso for ciklus lefutott az i. elem mindig a tomb hatralevo reszenek legkisebb eleme lesz.
Ez megmagyarazza azt is, hogy miert csak az utolso elotti elemig (n-2 ig) megy a kulso forciklus. Amikor i = n-2 akkor a tomb 0 - (n-3) - ig novekvobe rendezett. A belso ciklus lefutasa utan (n-2) - be bekerul a ket utolso elem kozul a kisebb, tehat az egesz tomb rendezett. (Mas szoval: egy elemet nincs ertelme rendezeni, egy elem mindig rendezett)
-
Karma
félisten
válasz
cellpeti
#2017
üzenetére
De otthon olvasgathatod azért, és nem hiszem, hogy nagy költség lenne.
A maximumkeresés lényege, hogy:
1) Kinevezed a tömb első elemét maximumnak.
2) Egy ciklusban bejárod a tömböt, ha a maximumnál nagyobb számot találsz, az lesz az új maximum.
3) A végén visszaadod vagy a maximumot, vagy az indexét, attól függően mi kell.Pl. egészekre, feltételezve, hogy a tömb legalább egy elemű, és a legnagyobb elem indexét kell visszaadni (mint pl. a feladatodban is kell majd):
int max(int count, int* array)
{
int maxIndex = 0;
int i;
for (i = 1; i < count; i++)
{
if (array[i] > array[maxIndex])
{
maxIndex = i;
}
}
return maxIndex;
}Jester01: Kösz, behaluztam valamiért, hogy ennek van értelme.
Javítottam a hagyományos megoldásra. -
Sk8erPeter
nagyúr
válasz
cellpeti
#2013
üzenetére
"ez a szar" egy eléggé alaptantárgy az informatikus képzésben...
A Karma által írt votes tömbben tárolod, hogy épp melyik szavazatból mennyi érkezett, azt növelgeted, amikor érkezik egy szavazat. Arra mondjuk figyelni kell, hogy érvénytelen szavazatnál ne indexeld túl a votes tömböt, előtte megfelelő ellenőrzéssel.
-
Gyuri16
senior tag
-
Sk8erPeter
nagyúr
válasz
cellpeti
#1967
üzenetére
Ha nincs eltárolva a karaktersorozat, akkor hogy akarod később átalakítani?

Mindegy, milyen adatfolyamból olvasol (pl. fájlból, standard inputról), a későbbi átalakításhoz, kiíratáshoz mindenképp el kell tárolnod... Miért, eddig hogy képzelted, egyből kiíratod, vagy mi? Akkor a feladatokat nem fogod tudni megcsinálni... -
Sk8erPeter
nagyúr
válasz
cellpeti
#1965
üzenetére
Miért akarod kicserélgetni a whitespace-eket? Akkor eleve félreértetted a feladatot, az a feladat, hogy az alsóvonásokat cseréld szóközökre, és amentén válaszd el a neveket, sőt, eleve a bevitt karaktersorozat nem tartalmazhat whitespace-t, csupán "aláhúzásjelet", ha mégis tartalmaz, akkor hibaüzenetet kell dobni!
Simán megcsinálhatod azt is, hogy karakterenként ellenőrzöd, tárolgatod, és ha valahol hibát találsz, akkor befejezed, hibaüzenetet dobsz, egyébként meg átalakítgatsz. -
Jester01
veterán
válasz
cellpeti
#1952
üzenetére
Talán mert van vele némi probléma

Pl. az első ciklusod <=3 feltéle már a kötőjelet is nézi, tehát amiatt kapásból hibás lesz minden jó rendszám is. Ugyanezen feltétel esetleg túl is címez a stringen, ha az nincs is 4 karakter. A kötőjel ellenőrzésnél i-re hivatkozni nem túl jó ötlet, ha egyszer azt akarod ellenőrizni, hogy a 4. karakter kötőjel-e, akkor azt írd oda (most ugye a hibás ciklusfeltétel miatt az i itt 4 lesz, tehát az ötödik karaktert nézed). A "-" az string konstans nem pedig karakter, és a feltételben kicsit sok a felkiáltójel.A legrosszabb pedig az, hogy a végén fixen "return 1" van, akármi is az ok változó értéke.
Lehetséges javítás:
int rendszam(const char* s)
{
if (!s || strlen(s) != 7 || s[3] != '-') return 0;
for(i=0;i<3;i++)
{
if(!isupper(s[i]) || !isdigit(s[i+4])) return 0;
}
return 1;
}MOD: jó hát én voltam a leglassabb

-
Lortech
addikt
válasz
cellpeti
#1952
üzenetére
Mert hibás.
ok változó nem kell, ok = 0-nál return 0, felesleges továbbmenni, ha már ott látod, hogy hibás.
nincs is benne csak return 1, szóval sohasem tér vissza 0-val.
1. for ciklus
0,1,2,3 -as string indexekre fut le, az if-re 4-es indexszel kerül a vezérlés, tehát jó rendszámnál is azt fogja jelezni, hogy a megfelelő karakter nem jó, mert nem "-". if-nél feleslegesen növeled i-t is.#1955: de a legalaposabb is.
Azért bámulatos, hogy tizenx sorban hány baklövést lehet elkövetni c-ben. -
-
cucka
addikt
válasz
cellpeti
#1532
üzenetére
Ez nem szapulás. Senki nem született úgy, hogy tudott programozni, meg lehet ezt tanulni meg hasonlók. Viszont ha kezdő szintű kérdéseket teszel fel a php topikban és nem tudsz egyedül kitalálni egy decimális->római szám konvertáló algoritmust, akkor talán még nincs itt az ideje annak, hogy pénzért bármilyen programozói munkát vállalj.
-
bpx
őstag
válasz
cellpeti
#1529
üzenetére
előbb leírták a tömbös megoldás elvét
na most ha csak a kiírás a feladat, akkor még strcopy-zni sem kell, rögtön a vizsgálat idejében ki lehet írni az adott részletet a képernyőretömbbel ez így nézne ki:
int x, szam;
...
// szam-ot bekered
...
x = szam % 1000;
printf("%s", ezresek[x]);
szam -= x*1000;
x = szam % 100;
printf("%s", szazasok[x]);
szam -= x*100;
...látszik rajta, hogy még ciklusba is szervezhető, elég egyszer leírni
tömb nélkül viszont ahelyett, hogy azt mondanád hogy ezresek[x], kell egy switch x értéke szerint 10 ággal...
szerk: most látom hülyeséget írtam, mert a % az maradék, hirtelen a maradék nélküli osztásra gondoltam...
mind1, az adott helyiértéken álló számot kell megállapítani az a lényeg -
Gyuri16
senior tag
válasz
cellpeti
#1524
üzenetére
itt egy magyar flash amivel lehet jatszani:
[link]valahogy igy programoznam:
arab -> romai
max 3xxx-ig csinalom (mert tovabb nem tudom hogy a romaiak hogyan szamoltak).csinalsz 4 tombot (egyeseknek, tizeseknek, szazasoknak es ezreseknek), kb igy:
egyesek: I,II, ...,IX
tizesek X,XX,XXX,XL,L,LX,LXX,LXXX,XC
szazasok C,CC,CCC,CD,D,DC,DCC,DCCC,CM
ezresek M,MM,MMM
szoval mesz a szamjegyeken sorban, mondjuk a legkissebtol a legnagyobbig.
megnezed hogy az egyeseken mennyi van (ez ugye szam % 10), a tizesek tombbol azon az indexen levo stringet megjegyzed (beleteszed az eredmenybe)
aztan tizesek: a tizesek tombben a megfelelo indexen levo stringet hozzamasolod ahhoz amit elobb megjegyeztel
etc..
igy a vegere kijon az egesz romai szamodna kozben nezem hogy vannak roviditett verziok is, pl 1998 lehet MCMXCVIII, vagy MIIM, de akar IIMM, ezekkel nem foglalkozom
-
bpx
őstag
-
Gyuri16
senior tag
válasz
cellpeti
#1523
üzenetére
jo, ez mas dolog, attol fugg a tanar mennyire veszi komolyan az ilyen formalis dolgokat. nekunk is volt projektunk, ahol azt mondta, hogy levon pontokat, ha nem a standard szerint indentalunk. c-ben ha minden igaz a prototipusokat kulon fajlban szokas definialni *.h, es ezeket includolni a fajl elejen. ha pedig ugyanabban a fajlban akarod, akkor lehet hogy igy egyeseknek jobban tetszik, nem tudom (c-ben eleg kezdo vagyok, de szabadidomben probalok rajta valtoztatni
)
ami meglep, hogy egy egyetemen megcsinaljak veled, hogy nem hasznalhatsz olyat amit te onszorgalombol megtanultal. nalunk senkit nem erdekel, hogy a feladatot ugy oldod e meg ahogy az tanitva volt, vagy mashogy (termeszetesen csak ha jol csinalod
) -
Gyuri16
senior tag
válasz
cellpeti
#1521
üzenetére
legyszives aruld el milyen iskola ez, ha nem akarod kiirni privatban is lehet (nyugodt lehetsz nem fogom senkinek tovabbadni, csak erdekel. egyetemista vagyok, es nalunk inkabb orulnek ha tobbet tudsz mint ami az anyag, nem hogy tiltanak)
hogy legyen valami on is: arab-romai konvertacion kicsit gondolkozz magad, neha jobb rajonni hoszabb ido alatt egyedul.. legalabb kezdd el az alapokat, ird le papirra, hogy hogyan csinalod te manualisan, es probalj szamitogepkent gondolkozni, tehat mik azok a lepesek amik egymast kovetik, es milyen feltetelek mellett
-
-
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.
-
cellpeti
nagyúr
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);
} -
Karma
félisten
válasz
cellpeti
#1341
üzenetére
Az a szitu, hogy a getline, mint olyan, egy nem szabványos függvény. Míg Windowson a környezetedben nem volt benne (mert minek?), az Ubuntuban lévő glib-ben benne van, és ez összeütközik a forráskódodban lévővel. Ezt nem tudod megkerülni, csak ha más nevet adsz neki

Nincs ebben semmi varázslat, csak hackelő tanárok. Ja és tanulj meg angolul. Komolyan.
-
Karma
félisten
válasz
cellpeti
#1330
üzenetére
Mondjuk csinálhatod úgy, ha már do-while-t akarsz használni, hogy az ok változódat használod fel. A többi részhez nem nyúlok:
do
{
int ok = 0;
printf("Kérem az előnevezettek számát: \n");
if(!getline(elonev,25))
{
printf("Üres sort adtal meg!\n");
}
else
{
ok = 1;
}
while (!ok);Magyarán addig teszi fel a kérdést, amíg nem kap egy nem-üres sort. Nem ártana azért 1-be állítás előtt ellenőrizni, hogy számot kapott-e (fontosabb mint az üres sor, nomeg összefügg
).UI: Mit akarnak ezek tömbbe?!
Nincs ebben semmilyen tömbben tárolható adat 
-
Gyuri16
senior tag
válasz
cellpeti
#1230
üzenetére
kerdest nem latok, de azert leirom: ugy jo ahogy mondod. egyik modszer, hogy nezed a szamerteket (tudod hogy az ascii tablaban a betuk egymas utan vannak, igy aztan eleg kivonnod a kisbetuk kodjabol valamennyit, es megkapod a nagybetut)
az egyszerubb megoldas a toupper, isupper fv, peldaprogram: [link] -
-
-
-
-
skylaner
senior tag
válasz
cellpeti
#1145
üzenetére
Én így csináltam, de szerintem egyáltalán nem bonyolult.
int main(){
char a[255], b[255];
int i=0,space=0,j=0,hossz;
printf("Bemenet:");
gets(a);
hossz=strlen(a);
for(i=0;i<hossz;i++) {
if(a[i]==' ') space++;
if(a[i]!=' '){
b[j]=a[i];
space=0;
j++;
}
if(space==1){
b[j]=a[i];
j++;
}
}
b[j]='\0';
printf("Kimenet:%s\n",b);
getch();
return 0;
}Aztán biztos van egyszerűbb megoldás is,de elsőre ez jutott eszembe.(Mondjuk Perl-be egy sor lenne az egész
) -
skylaner
senior tag
-
cousin333
addikt
-
PazsitZ
addikt
-
SLD
tag
válasz
cellpeti
#1118
üzenetére
Ez nem gond, a \ jellel aktiválod, az őt követő karakter "különleges értelmezését", ami legtöbbször egy formázó karakter. Szóval az első \-el aktiváltad ezt, így a második \ megjelent (itt saját maga esetén persze nem aktiválod vele, hanem tulajdonképpen deaktiválod, de ez már csak részletkérdés), ha ebből Neked két darabot kell kiíratnod, akkor \\\\ -t (4x) kell írnod.
Szerk: No persze, ha a putchar, csak egy char-t tud kezelni akkor az lehet gond lesz, mert két \ már két karakter, várunk egy C -s kollegát

A kódhoz, C++-os lévén, inkább nem szólok hozzá, de ha már kiírt egy \-t akkor nagy baj nem lehet.
-
-
SLD
tag
válasz
cellpeti
#1095
üzenetére
Ha tudsz németül itt találhatsz néhány alap dolgot: C von A bis Z Openbook
Amúgy miért adnak olyat, amit még nem tanultál?
És ha tömbök nagyon nem mennek, akkor össze lehet hozni, for és if ciklusokkal egészen szépen. -
-
válasz
cellpeti
#817
üzenetére
Hali!
Semmi komolyra ne gondolj, "bármely" ciklus utasítást használhatod, mondjuk nagy variáció nincs, mert van a FOR, a WHILE, meg a DO-WHILE. A bármely szót azért tettem idézőjelbe, mert míg a FOR és WHILE előtesztelős ciklus utasítások(azaz a ciklusfeltétel kiértékelése a ciklusmag futattása elött történik), addig a DO-WHILE utótesztelős(ebben az esetben a ciklusmagban lévő programkód egyszer mindenképp lefut, és csak azután kerül kiértékelésre a ciklusfeltétel) ezért ezt körültekintően kell alkalmazni.
A hisztogramokat meg nagy általánosságban úgy lehetne meghatározni, hogy különbözö adatok, folyamatok, információk stb vizuális megjelenítése...
Egy oszlop diagram is hisztogram. De egy program működéséről is lehet hisztogramot készíteni, csak ott úgy nevezik hogy folyamatábra...
És persze számtalan különféle hisztogram létezik, amit felsorolni sem lehet, de Te is nap mint nap találkozol rengeteggel....Fire.
-
válasz
cellpeti
#814
üzenetére
Hali!
A második feladattal kezdeném
kell egy ciklus, ami a string hossza-1-ig fut(ha használhattók string-kezelő függvényeket), ha nem akkor meg a stringet lezáró 0(nulla)-ig
a string[0]-tól megnézed a karaktereket string[strnighossz-1]-ig
ha a string[n] NEM \t, \b karakter akkor simán kiiratod
ha IGEN akkor nem iratod ki, hanem helyette a dupla backslash-t =>printf("\\\\")
C-ben a backslash karaktert "duplázni" kell kiiratáskor(többekközt), erre azért van szükség mert a backslash vezeti be a vezérlőkaraktereket is \t,\n,\b stbAz első példa
kell egy ciklus, ami a string hossza-1-ig fut(ha használhattók string-kezelő függvényeket), ha nem akkor meg a stringet lezáró 0(nulla)-ig
kell egy "szőközjelző" integer pl _IS_SPACE, ezt a progi elején nullázd
a string[0]-tól megnézed a karaktereket string[strnighossz-1]-ig
ha a string[n] NEM SZÓKÖZ KARAKTER, akkor kiiratod és az _IS_SPACE-t ALACSONYRA(0) állítod
ha a string[n] SZÓKÖZ KARAKTER, akkor megvizsgálod, hogy az _IS_SPACE alacsony(0) vagy magas(1)
ha az _IS_SPACE ALACSONY(előtte nem szóköz volt) akkor kiirod a szóközt, és MAGASRA(1) állitod az _IS_SPACE-t
ha _IS_SPACE MAGAS(elötte szóköz volt) akkor nem iratsz ki semmitLeírva bonyolultabb mint a kész progi...

Fire.
-
Jester01
veterán
válasz
cellpeti
#811
üzenetére
Egyes számú okos tanács: próbáld ki
Kettes számú okos tanács: mindig használj kapcsos zárójelet ciklusokban és feltételekben
Hármas számú okos tanács: a main úgy illik, hogy int-et adjon visszaHa a kapcsos zárójeleket betesszük úgy, ahogy a fordító értelmezi a te kódod, akkor ez lesz:
while (( c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c=='\t') {
++tab;
}
}
++ujsor;
++space;Látható, hogy az utolsó két sor nem hogy az if-ben, de még a while-ban sincs benne. Tehát azok mindig 1-et fognak kapni. A tab változó pedig önmagában számolja mind a 3 típust, vagyis azok összege lesz benne. A 3 karaktert külön-külön feltétellel (vagy switch szerkezettel ha már azt ismered) kell ellenőrizni, és persze mindet a cikluson belül.
-
cellpeti
nagyúr
válasz
cellpeti
#810
üzenetére
Sziasztok!
Az előző feladatot sikerült megcsinálnom Fire segítségével.
Itt lenne egy másik feladat:
Írjunk progit,amely megszámolja a bemenetre adott szövegben lévő szóközöket,tabulátorokat és új sor karaktereket.
Amit megírtam,de nem is bizti,hogy jó,meg lehet valaki tud valami okos tanácsot adni,hogy lehetne kicsit tömörebben. A forráskódot belinkelem,ha lehet ne szapuljatok,mert kezdő vagyok.
#include<stdio.h>
void main(void)
{
int c,tab,ujsor,space;
tab = 0;
ujsor =
space = 0;
while (( c = getchar()) != EOF)
if (c == ' ' || c == '\n' || c=='\t')
++tab;
++ujsor;
++space;
printf("%d\n",space);
printf("%d\n",ujsor);
printf("%d\n",tab);
} -
amargo
addikt
válasz
cellpeti
#788
üzenetére
Nyers erő.
Azaz, ész nélkül mindent vizsgálunk. Miközben, ha megnézed a linket, rengeteg olyan algoritmus van, ami a szöveget elemezve elég jó szabályokat állít fel.
Tehát vegyük S[1..n] szöveget és M[1..m] mintát.
Akkor a művelet igények, így alakulnak,
BF n*m.
KMP n legjobb és legrosszabb esetben is a szótár felállítása m. Én az érthetősége miatt jobban szeretem ezt, mint a RK-t, igaz az hatékonyabb, mert a mintát nem kell végigolvasnunk.
QS n/m +1RK (Ami még említve lett) n
Viszont itt, ha sok a hamis talált, akkor a BF műveletigényével azonost kapunk. -
válasz
cellpeti
#778
üzenetére
Hali!
Ezt az eljárást gyakran használják fórumokon, ahol ha oda nem illő szavakat helyettesítik.
Itt a példa, hogy mit is kellene megvalósítani RothKrisz-nek." aa aaa bb cc aa, aa-gg aaaa cccc aa, aa, baa."
ebben cserélje le az "aa" szavakat "*"-ra, erdményül ezt kell kapni
" * aaa bb cc *, * aaaa cccc *, *, baa."Fire.
-
válasz
cellpeti
#765
üzenetére
Hali!
Köszönöm a hozzászólást!
Itt a kód, ami (miután tisztáztuk, hogy mit is kell írni) 10 perc alatt készült...#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAXBINARIES 16
#define MAXBITS 16
#define NUMBERINDEX 0
#define BITCOUNTINDEX 1
char BinaryDigits[MAXBITS+1];
int BinariesCount=0;
unsigned int Numbers[MAXBITS][2];
unsigned int btou(int bitnumber, char s[]) {
int i;
unsigned int number=0;
for (i=bitnumber-1;i>=0;i--) {
if (BinaryDigits[i]) number+=pow(2,bitnumber-i-1);
}
return number;
}
int bin(int bitnumber, char s[]) {
int i;
for (i=0;i<bitnumber;i++) {
if (BinaryDigits[i]!=0 && BinaryDigits[i]!=1) {
printf("Nem binaris szam, probalja ujra...\n");
return 0;
}
}
Numbers[BinariesCount][BITCOUNTINDEX]=bitnumber;
Numbers[BinariesCount++][NUMBERINDEX]=btou(bitnumber,BinaryDigits);
return 1;
}
void InputBinaries() {
int i,j,ch;
printf("Kerem a szamokat binaris formaban (max. 16 darab, max. 16 bites szamot)\n\n");
for (i=0;i<MAXBINARIES;i++) {
do {
printf("%02d. szam: ",i+1);
j=0;
do {
ch = getchar();
BinaryDigits[j++] = ch-'0';
}
while( ch!='\n' && ch!=EOF && j <= MAXBITS);
fflush(stdin);
if (j==1) return;
}
while (!(bin(j-1,BinaryDigits)));
}
return;
}
void bintoscreen(int binariesndx) {
int i;
unsigned int a;
a=Numbers[binariesndx][NUMBERINDEX];
i=MAXBITS-Numbers[binariesndx][BITCOUNTINDEX];
for (;i>0;i--) printf("0");
for (i=Numbers[binariesndx][BITCOUNTINDEX]-1;i>=0;i--) {
printf((a & (unsigned int)pow(2,i)) ? "1":"0");
}
}
void bintoscreenXOR(int binariesndx) {
int i,j,highbitcount;
unsigned int a,b,c;
highbitcount=0;
a=Numbers[binariesndx][NUMBERINDEX];
b=Numbers[binariesndx+1][NUMBERINDEX];
c=a^b;
if (Numbers[binariesndx][BITCOUNTINDEX]>Numbers[binariesndx+1][BITCOUNTINDEX])
i=MAXBITS-Numbers[binariesndx][BITCOUNTINDEX];
else i=MAXBITS-Numbers[binariesndx+1][BITCOUNTINDEX];
j=i;
for (;i>0;i--) printf("0");
for (i=MAXBITS-j-1;i>=0;i--) {
if (c & (unsigned int)pow(2,i)) {
printf("1");
highbitcount++;
}
else printf("0");
}
printf("\t%9u\t",a^b);
printf((highbitcount % 2) ? "Paratlan" : "Paros");
}
int main() {
int i;
printf("Peldaprogram by Fire/SOUL/CD [Code::Blocks 8.02]\n\n");
InputBinaries();
if (BinariesCount) {
printf("\nSorszam\tBinaris\t\t\tDecimalis\n\n");
for (i=0;i<BinariesCount;i++) {
printf("%02u.\t",i+1);
bintoscreen(i);
printf("\t%9u\n",Numbers[i][NUMBERINDEX]);
}
if (BinariesCount>1) {
printf("\nSorszam\tBinaris\t\t\tDecimalis\tMagas bitek\n\n");
for (i=0;i<BinariesCount-1;i++) {
printf("%02u.\t",i+1);
bintoscreen(i);
printf("\t%9u\n",Numbers[i][NUMBERINDEX]);
printf("%02u.\t",i+2);
bintoscreen(i+1);
printf("\t%9u\n",Numbers[i+1][NUMBERINDEX]);
printf("XOR\t");
bintoscreenXOR(i);
printf("\n\n");
}
}
}
else printf("\nNem adott meg egyetlen binaris szamot sem...\n\n");
printf("\nA kilepeshez usson le egy billentyut...");
getch();
return 0;
}Fire.
UI: szerintem is többet ér megírni egy progit, mintha nem válaszolna rá esetleg senki
-
-
válasz
cellpeti
#741
üzenetére
Hali!
Az a void nem akkora gond! Na közben megírtam az egészet, bár nem hinném, hogy 100%-ban "Bauer Peti bá' kompatibilis".
Csak nincs lelkierőm nekiállni felkommentezni, mert ha alapos akarok lenni, akkor az legalább egy óra....Amúgy meg nem a "bin függvényben" van a gond, hanem az a gáz, hogy oda el sem jut, azaz nem hívódik meg...

Fire.
-
válasz
cellpeti
#739
üzenetére
Hali!
Nos én a bináris számok beviteléhez szólnék hozzá. (CodeBlocks-ot használok)
3 figyelmeztetés jelenik meg a fordítás alatt(célszerű ezeket is javítani)1. warning: unused variable `rosszszam'
deklaráltad a rosszszam változót de nem használod, töröld ki2. warning: implicit declaration of function `pow'
anélkül használod a pow függvényt, hogy a header file include-olva lenne
írd be, hogy #include <math.h>3. warning: return type of 'main' is not `int'
a void main(void) helyett int main() ill. a program végére egy return 0A programról(bár lehet, hogy ugyebár azóta továbbfejlesztetted
)Hibás az adatbevitel azon része, ami a bináris jegyeket ellenőrzi, mert simán elfogadja ezt:
0a vagy 1a vagy 010101a0101
Ez javításra szorul.Bár tudom, hogy a feladat szerint "pontosan 16 darab" számot kellene bekérni, de engem roppant módon irritál. Gyakorlásként majd ha minden működik így, utána írd át úgy, hogy max 16 darab számot lehessen bevinni, de ha üressort talál, akkor csak annyi számmal dolgozik amennyit addig bevittem.

Fire.
-
-
cellpeti
nagyúr
válasz
cellpeti
#733
üzenetére
Na szinte mindent megoldottam,csak azt nem,hogy csak 0 és 1-t kér be,mert még be tudja kérni a többi számot is.
Azt hogy tudnám kiküszöbölni? Még azt,hogy hogyan tudom lecsökkentni a bináris számok számát,hogy pl csak 4 karaktert lehessen bevinni?(pl.: 0101,1111,0000,0011,0111,0001)
-
-
Ú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!
- Quake Champions
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- Azonnali alaplapos kérdések órája
- Ne várj sokat a vásárlással: drágulás a láthatáron
- Mibe tegyem a megtakarításaimat?
- Elon Musk billiomos lesz, ha kitör a gépek forradalma
- Milyen TV-t vegyek?
- Milyen videókártyát?
- WoW avagy World of Warcraft -=MMORPG=-
- Notebook / laptop alkatrészek cseréje (processzor, RAM, HDD)
- További aktív témák...
- Z790 Strix-A, 14700K, 2x16GB 7200 mhz, Tuf 4080, Corsair H1000i
- -ÚJ,2 ÉV GAR- GAMER PC: RYZEN 7 5700/5800X +RX 6600/6700XT +16-64GB DDR4! SZÁMLA! 70 féle ház!
- Üzletből, garanciával, DeLL Inspiron 16 5630 -i5-1340P-16 szál/16RAM/512SSD/16,1"FULLHD IPS
- -ÚJ,2 ÉV GAR- GAMER PC: i5-14400F (10mag/16szál) +RX 6600/6700XT +16-64GB DDR4! SZÁMLA! 70 féle ház!
- Thrustmaster T-GT II bázis - Thrustmaster Sparco P310 - Thrustmaster T3PM pedál - Playseat Evolution
- AKCIÓ! HP Victus Gaming 16-S0017NH 16 notebook - R5 7640HS 32GB DDR5 1TB SSD RTX 4050 6GB WIN1
- Tablet felvásárlás! Samsung Galaxy Tab S10+, Samsung Galaxy Tab S10 Ultra, Samsung Galaxy Tab S10 FE
- Intel Core i5 4440 4mag 4szál processzor garanciával hibátlan működéssel
- Bomba Ár! Lenovo ThinkPad E14 G2 AMD - Ryzen 5 I 8GB I 256SSD I 14" FHD I HDMI I W11 I Gari
- BESZÁMÍTÁS! Intel Core i7 6700K 4mag 8szál processzor garanciával hibátlan működéssel
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
![;]](http://cdn.rios.hu/dl/s/v1.gif)

Nem sikerült a prog1 végül? Milyen szak lett a választott?



Azért bámulatos, hogy tizenx sorban hány baklövést lehet elkövetni c-ben.
Én legalább megpróbálok segíteni is, nem csak követelni a segítséget, ahogy te csinálod.


Nincs ebben semmilyen tömbben tárolható adat







