- Gurulunk, WAZE?!
- gban: Ingyen kellene, de tegnapra
- Rap, Hip-hop 90'
- Luck Dragon: MárkaLánc
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Luck Dragon: Asszociációs játék. :)
- vrob: Az IBM PC és a játékok a 80-as években
- hdanesz: Elektromos autózás - első élmények
- Parci: Milyen mosógépet vegyek?
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
Új hozzászólás Aktív témák
-
Ereshkigal
őstag
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
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Subaru topik
- India felől közelít egy 7550 mAh-s Redmi
- Samsung Galaxy S23 Ultra - non plus ultra
- Milyen házat vegyek?
- PlayStation 5
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- World of Tanks - MMO
- Vicces képek
- Sütés, főzés és konyhai praktikák
- Vivo X200 Pro - a kétszázát!
- További aktív témák...
- LG 39GS95UE - 39" Ívelt OLED / QHD 2K / 240Hz & 0.03ms / 1300 Nits / NVIDIA G-Sync / AMD FreeSync
- Lenovo Legion 5 Gaming. Az ár irányár, komoly érdeklődés esetén van lehetőség egyeztetésre
- ÚJ Apple Macbook Air 15,3 M4 10C CPU/10C GPU/16GB/256GB - Ezüst -(2025) - 3 év gari - MAGYAR
- ÁRGARANCIA!Épített KomPhone i5 10600KF 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! Logitech G923 kormány + Driving Force Shifter garanciával hibátlan működéssel
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest