- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Milyen asztali médialejátszót?
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Milyen alaplapot vegyek?
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- 5.1, 7.1 és gamer fejhallgatók
- Bambu Lab 3D nyomtatók
- Milyen billentyűzetet vegyek?
- Hobby elektronika
Új hozzászólás Aktív témák
-
elistvan
őstag
válasz
kovisoft #5999 üzenetére
Szia!
Köszi. Pont azt szerettem volna elérni, hogy átláthatóbb legyen. Rosszul fejeztem ki magam.
A dupla kiírás eredeti célja az lett volna, hogy előbb simán kiírja a ciklus ahogy megtalálta a számot aztán emelkedő sorrendben. (Mint a tv-s sorsoláson.)
A konkrét programon egy ilyen tömbös rövidítést meg tudnál mutatni? Mert ezt a részt nem igazán értem.
-
kovisoft
őstag
válasz
elistvan #5998 üzenetére
Ebben a programban jelenleg elég sok hiba van. Hirtelen néhány: A tartalmazza() függvényben a tomb címét hasonlítod a szam-hoz, nem a tomb egy elemét, itt tomb[i] kellene. Végig a kódban keverednek az íves (függvényhívás) és a szögletes (tömb eleme) zárójelek, ez így le sem tud fordulni. Mint pl. itt:
tippeltszamok(i) = szam;
vagy itt:
if(tippeltszamok(i) == nyeroszamok[j]){
A nyeroszamok-at fölöslegesen rakod át az emelkedo-be, mert már helyben rendezted azokat (ezért kiírni is fölösleges mindkettőt).
Függvényekkel rövidíteni akkor tudod, ha több ismétlődő feladatot hajt végre a programod. Itt maximum a számok kiírása az ilyen, tehát sok rövidítésre nincs lehetőség, így gondolom inkább arról lenne szó, hogy függvényekkel struktúráld a programod (ettől nem rövidebb, hanem olvashatóbb lesz). Be kell azonosítanod az egyes blokkokat a programodban, amik egy önálló részfeladatot hajtanak végre, és ezeket ki tudod emelni egy-egy önálló függvénybe. Most kb. ezeket csinálja a programod:
- tippek bekérése
- tippek kiírása
- nyerőszámok húzása
- találatok megkeresése
- nyerőszámok rendezése
- nyerőszámok kiírása (elég 1x)
- találatok kiírásaEzekre írhatsz függvényeket, amik megkapják bemenő paraméterben tömbö(ke)t, amivel dolgozniuk kell, hasonlóan a tartalmazza() függvényedhez. De ezek a függvények nem adnak semmilyen értéket vissza, void lesz a visszatérési típusuk és nem lesz bennük return.
-
elistvan
őstag
Az alábbi programomat, hogyan tudnám lerövidíteni függvényekkel? Tudom a tartalmazza az, de hogyan tudom, a találatokat és tippeket fügvényekkel megoldani?
/*Kenorsolás program találatok számát irja ki, és a nyerőszámokat emelkedő sorrendben*/
#include <stdlib.h>
#include <time.h>
#include <stdio.h>int tartalmazza(int tomb[], int hossz, int szam){
for(int i=0;i<hossz;i++){
if(tomb == szam){
return 1;
}
}
return 0;
}int main(){
int tippeltszamok[10] = {0};for(int i=0;i<10;i++){
int talalat(i);
int szam;
printf("%d. szám: ", i+1);
scanf("%d",&szam);
if(szam >= 1 && szam <= 80 && !tartalmazza(tippeltszamok,10,szam)){
tippeltszamok(i) = szam;
}else{
printf("Már tippelt vagy nem 1-80 közötti szám\n");
i--;
}
}printf("A játékba küldött számok:\n");
for(int i=0;i<10;i++){
printf("%d ", tippeltszamok(i));
}int nyeroszamok[20] = {0};
for(int i=0;i<20;i++){
int num = (rand() % (80 - 1 + 1)) + 1;
if(num >= 1 && num <= 80 && !tartalmazza(nyeroszamok,20,num)){
nyeroszamok(i) = num;
}else{
i--;
}
}int talalat[10] = {0};
int tIndex = 0;
for(int i=0;i<10;i++){
for(int j=0;j<20;j++){
if(tippeltszamok(i) == nyeroszamok[j]){
talalat[tIndex++] = nyeroszamok[j];
}
}
}
int tmp;
int j =0;
int emelkedo[20] = {0};
for( int i=0; i<10; i++)
{
for( int j=0; j<20; j++)
{
if(nyeroszamok[j] > nyeroszamok(i)) /*Ha a nyerőszámok tömb 1 eleme nagyobb mint a második*/
{
tmp = nyeroszamok(i); /*Az első elemet kitesszük a tmp változóba*/
nyeroszamok(i) = nyeroszamok[j]; /*A második elem átkerül az első helyre a sorban*/
nyeroszamok[j] = tmp; /*a tmp-ben tárolt 2. elem, átkerül a második helyre.*/
}
}
}
printf("\nAz e heti nyerőszámok növekvő sorrendben:\n");
for(int i=0;i<20;i++)
{
emelkedo(i) = nyeroszamok(i);
printf("%d ", emelkedo(i));
}
printf("\n\n");
printf("\nA heti nyerőszámok pedig:\n");
{
for(int i=0;i<20;i++)
{
printf("%d ", nyeroszamok(i));
}printf("\n%d találat:\n", tIndex);
for(int i=0;i<tIndex;i++){
printf("%d ", talalat(i));
}
}
return 0;
} -
kovisoft
őstag
válasz
DEV_NULL #5996 üzenetére
Remek! Még annyit lehet egyszerűsíteni, hogy a beolvasásnál egy füst alatt el lehet intézni a rendezést is és az egyező számok kiszűrését is:
Beolvasod a következő számot, megkeresed az első olyan szám indexét a (rendezett) tömbödben, aminél nem nagyobb. Ha megegyezik vele, akkor eldobod, mert van már ilyen szám. Ha pedig kisebb nála, akkor ettől az indextől kezdve eggyel hátrébb pakolod a számokat a tömbben, és beszúrod ide a beolvasott számot.
És ne feledkezz meg az adatok ellenőrzéséről sem, pl. mi van, ha 50-nél nagyobb számot adnak meg méretnek? Ekkor ki fogsz címezni a tömbödből.
-
DEV_NULL
őstag
válasz
kovisoft #5995 üzenetére
Köszi a segítséget!
Mivel sehogy sem akart működni egy teljesen új, sokkal egyszerűbb megközelítésből oldottam meg végül:
#include <stdio.h>
typedef struct
{
unsigned int tomb[50];
unsigned int szam, db;
unsigned int meret, meret2;
} Nehez;
Nehez meret()
{
Nehez hazi;
hazi.meret2=0;
hazi.db=0;
scanf("%u", &hazi.meret);
return hazi;
}
Nehez beker()
{
Nehez hazi;
unsigned int h, a;
for(h=0; h<hazi.meret; h++)
{
scanf("%u", &hazi.szam);
a=0;
while(a<h && hazi.szam!=hazi.tomb[a])
{
a++;
}
if(a==h)
{
hazi.tomb[hazi.meret2]=hazi.szam;
hazi.meret2++;
}
}
return hazi;
}
Nehez rendez(Nehez hazi)
{
unsigned int h, a;
for(h=0; h<hazi.meret2; h++)
{
for(a=h+1; a<hazi.meret2; a++)
{
if(hazi.tomb[h]>hazi.tomb[a])
{
hazi.szam=hazi.tomb[a];
hazi.tomb[a]=hazi.tomb[h];
hazi.tomb[h]=hazi.szam;
}
}
}
return hazi;
}
Nehez szamol(Nehez hazi)
{
unsigned int h, a, z, i;
for(h=0; h<hazi.meret2; h++)
{
for(a=h+1; a<hazi.meret2; a++)
{
for(z=a+1; z<hazi.meret2; z++)
{
for(i=z+1; i<hazi.meret2; i++)
{
if(hazi.tomb[h]+hazi.tomb[i]==hazi.tomb[a]+hazi.tomb[z])
{
hazi.db++;
}
}
}
}
}
return hazi;
}
void kiir(Nehez hazi)
{
printf("%u", hazi.db);
}
int main()
{
Nehez hazi;
hazi=meret();
hazi=beker();
hazi=rendez(hazi);
hazi=szamol(hazi);
kiir(hazi);
return 0;
}
-
kovisoft
őstag
válasz
DEV_NULL #5994 üzenetére
Szerintem a gond még azzal a résszel van, ahol kiszűröd az azonos számokat és csak a különbözőket pakolod át a hazi.cim-ből a hazi.cim2-be (ahol az ominózus ++ is van). Nem elég átrakni a ++-t a végére, hanem kicsit át kell alakítani magát a ciklust is, hiszen így most a 0-dik cim2 elembe belerakod a 0-dik és az 1-ső cim elemet is (a legelső elvész). Mivel a hazi.csere=0 elemet már a ciklus előtt átraktad, ezért a ciklust hazi.csere=1 értékről kellene indítani.
Sokat segíthet, ha debug kiíratásokat helyezel el a kódban az egyes lépések után. Pl. kiírod a rendezett elemeket, az azonos elemek kiszűrése után maradtakat, ill. azokat a számnégyeseket, amikre egyeznek a megkívánt összegek. Ezekből látni fogod, hogy melyik lépésnél romlik el valami.
-
kovisoft
őstag
válasz
DEV_NULL #5992 üzenetére
Csak tipp, de szerintem a lenti sorban kicímzel a hazi.cim2 tömbből, ugyanis amikor hazi.csere=hazi.meret2-1, akkor a ++ miatt hazi.cim2[hazi.meret2] lesz felülírva, de az már az allokált tömb után van:
hazi.cim2[++hazi.csere]=hazi.cim[h];
Elképzelhető, hogy elég lenne a ++-t hátulra tenni (hazi.csere++), de mondom ezt úgy, hogy nem értelmeztem, mit csinál pontosan a programod.
-
DEV_NULL
őstag
Sziasztok!
A problémám amire tőletek várnék megoldást; a feladat egy C program ami először bekér egy számot, majd bekér ennyi de maximum 50 számot. Ezeket megszűri, hogy ne legyen benne ismétlődés, majd olyan ismétlődés nélküli számnégyeseket csinál belőlük ahol az első és utolsó szám összege megegyezik a második és harmadik szám összegével és a végén ezek darabszámát. Ezt egy robot ellenőrzi. Két gond van, az egyik, hogy malloc hibával elszáll, vagy ha program kimenete több ezer megfelelő számnégyes, akkor még néhány száz darab nullás számnégyest kipörget a végére... Én már kezdem feladni, bízom benne, tudtok segíteni. Remélem sikerül normálisan bemásolni a kódot, most írok ide először...
Hiba: prog: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped)
Köszi előre is!
#include <stdio.h>
#include <stdlib.h>
typedef struct dec10Hazi
{
unsigned int meret, meret2;
unsigned int csere, csere2;
unsigned int *cim, *cim2;
unsigned int tomb[4];
unsigned int db;
} Nehez;
int main()
{
Nehez hazi;
unsigned int h, a, z, i;
scanf("%u", &hazi.meret);
hazi.cim=malloc(sizeof(unsigned int)*hazi.meret);
for(h=0; h<hazi.meret; h++)
{
scanf("%u", &hazi.cim[h]);
}
hazi.csere2=1;
while(hazi.csere2)
{
for(h=0; h<hazi.meret-1; h++)
{
if(hazi.cim[h]>hazi.cim[h+1])
{
hazi.csere=hazi.cim[h];
hazi.cim[h]=hazi.cim[h+1];
hazi.cim[h+1]=hazi.csere;
}
}
hazi.csere2=0;
for(h=0; h<hazi.meret-1; h++)
{
if(hazi.cim[h]>hazi.cim[h+1])
{
hazi.csere2=1;
break;
}
}
}
hazi.meret2=0;
for(h=0; h<hazi.meret-1; h++)
{
if(hazi.cim[h]<hazi.cim[h+1])
{
hazi.meret2++;
}
}
hazi.meret2++;
hazi.cim2=malloc(sizeof(unsigned int)*hazi.meret2);
h=0;
hazi.csere=0;
hazi.cim2[hazi.csere]=hazi.cim[h];
h++;
while(hazi.csere<hazi.meret2)
{
if(hazi.cim[h]>hazi.cim2[hazi.csere])
{
hazi.cim2[++hazi.csere]=hazi.cim[h];
h++;
}
else
{
h++;
}
}
hazi.db=0;
for(h=0; h<hazi.meret-3; h++)
{
hazi.tomb[0]=hazi.cim2[h];
for(a=h+1; a<hazi.meret-2; a++)
{
hazi.tomb[1]=hazi.cim2[a];
for(z=a+1; z<hazi.meret-1; z++)
{
hazi.tomb[2]=hazi.cim2[z];
for(i=z+1; i<hazi.meret; i++)
{
hazi.tomb[3]=hazi.cim2[i];
if(hazi.tomb[0]+hazi.tomb[3]==hazi.tomb[1]+hazi.tomb[2])
{
hazi.db++;
}
}
}
}
}
printf("%u\n", hazi.db);
free(hazi.cim);
free(hazi.cim2);
return 0;
}
-
kovisoft
őstag
válasz
#PeTeY# #5989 üzenetére
Az i=0,1,...,n-1 sorozatot úgy fordítod meg, hogy i helyett n-i-1 -et használsz (i=0 --> n-i-1=n-1, i=n-1 --> n-i-1=0). És akkor mindenhol indulhat minden i-s és j-s ciklusod 0-ról egyesével felfelé, és a sorokat úgy fordítod meg, hogy i helyett n-i-1 -et használsz az indexben azokon a helyeken, ahol a kulcs-csal is indexelsz.
Persze nem muszáj így, csinálhatod azt is, hogy marad az i az indexben, de az i-s ciklusod n-1-ről indul lefelé 0-ig. A végeredmény ugyanaz lesz.
-
kovisoft
őstag
válasz
#PeTeY# #5987 üzenetére
Akkor gondolom sztornó, amit írtam, ha végülis maga a kódolás jó úgy, ahogy csináltad.
A kódolásnál eredeti sorrendben ([i][j]) töltöd fel a tomb tömböt és a kulcs szerint indexelve ([n-i-1][kulcs[j]-1]) olvasod ki.
Dekódolásnál fordítva kellene csinálni: a kulcs szerint indexelve ([n-i-1][kulcs[j]-1]) töltöd fel a tomb tömböt és eredeti sorrendben ([i][j]) olvasod ki.
-
#PeTeY#
aktív tag
válasz
kovisoft #5986 üzenetére
Nagyon köszönöm. Már munkahelyen vagyok, este megnézem.
Bár, most első ránézésre... Na, megpróbálom majd értelmezni. És tisztáznám, mit is akarok, mert valószínű nem voltam valami összeszedett már tegnap este. Mondjuk nem biztos, hogy most jobb lesz...
Szóval a feladat szerint a program egy fájlból kiolvas majd 3 dolgot. Egy egész számot, mint kód. Ennyi oszlopa lesz majd a mátrixnak, amibe be kell "tölteni" a harmadik paraméterben kapott szöveget, amit kódolni, vagy dekódolni kell. Illetve egy kulcsot azaz számsort, ami ebben a mátrixban mutatja az oszlopok sorrendjét. Kódolásnál be kell írni sorfolytonosan a mátrixba a szöveget: azaz a[0][0]-ba az első karakter, a[0][1]-be második, stb, és kiolvasásnál a kulcs által megadott sorrendben kell kiírni. Nálam a konkrét kódban, ugye a 3. oszlop utolsó sorában lévő karakter lesz az első, aztán ugyanezen oszlop utolsó előtti sorában lévő a második egészen az első sorig, majd jön a 4. oszlop utolsó sorában lévő, stb. Ezt a segítségetekkel sikerült is megcsinálni. Viszont a dekódolásnál ezt írja szó szerint a feladat: "A dekódoláshoz az adott sorrendben töltjük fel az oszlopokat, majd a szöveget sorfolytonosan olvassuk ki a táblázatból..." Azaz ha jól értem, fordítva kéne, mint a kódolásnál. Bocs a hosszú szövegért. -
kovisoft
őstag
válasz
#PeTeY# #5985 üzenetére
Ha jól értem, hogy mit szeretnél, akkor szerintem nem a második dupla ciklusban (amikor a ki2-be írsz) kellene alkalmazni a
kulcs[j]-1
-gyel való indexelést, hanem az első dupla ciklusban, amikor kitöltöd atomb
-öt (és persze ekkor oda kell figyelni arra is, hogy a ki file-ba továbbra is a jó karaktert írd ki):for (i=0; i<n; ++i) {
for (j=0; j<kod; ++j) {
tomb[i][kulcs[j]-1]=szoveg[count];
fprintf(ki, "%c ", szoveg[count]);
count=count+1;
}
fprintf(ki, "\n");
}
A ki2-be történő kiírásnál pedig már csak szimplán kiszedni a j-edik oszlopot. Mert így most pont a kulcs inverz permutációját hajtod végre.
-
#PeTeY#
aktív tag
válasz
kovisoft #5984 üzenetére
Valóban. Nagyon köszi... Logikus, hogy sorok esetében lentről felfelé kell haladni, ha azt akarom, hogy így legyen kiírva.
Pár év és belejövök.
Még egy kérdésem lenne, mert ehhez már nagyon fáradt vagyok: Hogyan oldom meg, ha azt szeretném, hogy a titkosítani kapott szöveget a kulcsnak megfelelően rendezze oszlopokba? Azaz itt az első négy karakter kerüljön a 3. oszlopba, úgy hogy az első karakter van a legalsó sorban... -
kovisoft
őstag
válasz
#PeTeY# #5983 üzenetére
Mit jelent, hogy "de nem alulról felfelé"? A sorokat fordított sorrendben kellene kiírni? Ebben az esetben haladj fordított sorrendben a legutolsó i-s ciklusoddal:
for(i=n-1; i>=0; i--) {
A másik lehetőség, hogy a tomb-ből olvasod ki tükrözve a sorokat:kodolt[l] = tomb[n-i-1][kulcs[j]-1];
-
#PeTeY#
aktív tag
válasz
kovisoft #5982 üzenetére
Rendben. Szóval, a lényeg, hogy kódolni kéne egy szöveget úgy, hogy egy megadott kulcs alapján olvasom ki oszloponként a szöveget alulról felfelé. Sikerül megcsinálni a kódolás részét, azaz megfelelő sorrendben adja vissza az oszlopokat, de nem alulról felfelé. És nem látom, miért. Bár biztos ez is tök egyszerű:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int kod = 7;
int kulcs[32] = {3,4,2,1,5,6,7};
char szoveg[256] = {"eztaszovegetkelltitkositanod"};
int n = 28 / kod;
char tomb[n][kod];
FILE* ki = fopen("ki.txt", "w");
if (ki == NULL) {
printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
exit(1);
}
int i, j, count = 0;
for (i=0; i<n; ++i) {
for (j=0; j<kod; ++j) {
tomb[i][j]=szoveg[count];
count=count+1;
fprintf(ki, "%c ", tomb[i][j]);
}
fprintf(ki, "\n");
}
fclose(ki);
FILE* ki2 = fopen("ki2.txt", "w");
if (ki2 == NULL) {
printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
exit(2);
}
char kodolt[256];
int l=0;
for(j=0; j<kod; j++) {
for(i=0; i<n; i++) {
kodolt[l] = tomb[i][kulcs[j]-1];
fprintf(ki2, "%c", kodolt[l]);
}
}
fclose(ki2);
return 0;
}
-
#PeTeY#
aktív tag
Haladok a beadandómmal szépen lassan, nagy nehezen kitaláltam, minek hogyan is kellene működnie és működik is, de megint sikerült elakadnom. Esetleg valaki rá tudna nézni privátban a kódomra, hogy mi vele a gond?
-
#PeTeY#
aktív tag
Sziasztok. Segítséget szeretnék kérni. Elkezdtem teljesen nulláról programozást tanulni, beiratkoztam egyetemre 38 éves fejjjel. Egyelőre nagyon tetszik, már csak azért is, mert teljesen sötét vagyok hozzá.
Szóval belefutottam egy feladatba (beadandó) és próbálom megoldani. A program egy fájlból kap mindenféle paramétert, ami alapján titkosít egy szöveget, amit kiír egy másik fájlba, de nem is ez a lényeg. Igyekszem lebontani kisebb részekre, de már az elején elakadtam. Azt szeretném megoldani, hogy egy szöveget mátrixos elrendezésben írjon ki, de nem sikerül. Egyszerűen csak kiírja egy sorba. Mit rontok el? Eddig jutottam:#include <stdio.h>
#include <stdlib.h>
int main()
{
char szoveg[256] = {"eztaszovegetkelltitkositanod"};
char tomb[4][7];
FILE* ki = fopen("ki.txt", "w");
if (ki == NULL) {
printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
exit(1);
}
int i, j, count = 0;
for (i=0; i<4; ++i) {
for (j=0; j<7; ++j) {
tomb[i][j]=szoveg[count];
count=count+1;
fprintf(ki, "%c ", tomb[i][j]);
}
}
return 0;
}
Előre is köszönök minden segítséget.
-
m3zcal
újonc
Sziasztok,
A soros port programozassal kapcsolatban kerdeznem:
Szerintetek hany eszkozt (pl DC rele) lehet vezerelni egy soros portrol (DB-9) ?
Az erdekelne, hogy a TX-en kivul esetleg a tobbi labat is lehet "folyamatos" jel kikuldesre birni?
(pl. DCD, DSR,..) -
kovisoft
őstag
C-ben nem tudsz így stringeket összehasonlítani, mert a kar != "end" a két stringre mutató pointert hasonlítja össze, nem pedig a stringek tartalmát. Használd az strcmp() függvényt stringek összehasonlítására (vagy strcmpi-t, ha nem számít a kis-nagybetű):
} while (strcmp(kar, "end") != 0);
-
Rula
tag
Sziasztok! Sikeresen a C++ topikba írtam ezt, ott pedig kiderült, hogy ez pedig sima C, szóval itt is feltenném a kérdésem.
Szeretnék egy olyan (hátul tesztelő) ciklust létrehozni, ami akkor lép ki, hogy ha az user beírja, hogy "end". Viszont nem igazán sikerül. Köszi előre is a segítséget!
Ahogy eddig próbáltam, siker nélkül:#include <iostream>
int main()
{
setlocale(LC_ALL, "");
char kar[80];
do {
printf("írjon be valamit:\n");
scanf("%s", kar);
} while (kar != "end");
}
-
kovisoft
őstag
válasz
elistvan #5963 üzenetére
A szazalek valtozot nem int-nek vetted fel, hanem float-nak. Egy osztás eredménye kerül bele, ezt hasonlítod utána egész számokkal. A konkrét esetben valóban csak egész szám kerülhet bele (mivel az osztást és a szorzást is int-eken végzed), de amúgy ha a képletben már eleve float-okkal dolgoznál, és mondjuk 47 pont lenne a maximum, amiből valaki 28-at ért el, akkor a szazalek értéke 59.57 lenne, ami se nem <=59, se nem >=60, hanem a kettő között van, de arra nincs feltételed. Ezért írtam, hogy jobb lenne csupa int-ekkel dolgozni. Vagy lehet float-okkal is, de akkor át kell írnod a feltételeket (és nem árt arra is gondolni, hogy bizonyos hányadosokat csak kerekítve lehet float-on ábrázolni).
-
-
kovisoft
őstag
válasz
kovisoft #5955 üzenetére
Közben még agyaltam egy általánosabb megoldáson is, ami egyesével olvassa ki a biteket. Triviálisan mindig az alsó bitet lehetne kiolvasni, kiírni, aztán jobbra shiftelni a biteket a számban amíg el nem fogynak a bitek. Viszont így fordított sorrendben írnánk ki a biteket. A lenti kód ehelyett mindig a felső bitet olvassa ki, majd balra shifteli a biteket, de legelőször berak jobbra egy plusz 1-es bitet, hogy tudja, mikor kell abbahagyni a ciklust:
dec=(dec<<1)|1;
while ((dec&255)>0)
{
printf("%d", (dec&256)>>8);
dec=dec<<1;
}
printf("\n");
Szerk: mi a hibaüzenet? -
elistvan
őstag
Kovisoft: Köszi, de valamiért nem fut le a C program hibát ír.
Sziasztok!
A következőp programkódom lenne. A feladat:
Készíts programot, ami egy dolgozat pontszámából kiszámítja a százalékos eredményt, majd kiírja a jegyet! Egy dolgozatra legfeljebb 20 pont adható, az eredmények: 60% - 2, 70% - 3, 80% - 4, 90% - 5
Nem akar az if-else rész működni, hogy továbblépjen a feltételeken. -
kovisoft
őstag
válasz
elistvan #5954 üzenetére
Ha csak egy változót lehet használni és az maga a változó, amibe beolvastad a decimális számot, akkor itt egy ocsmány és gagyi megoldás:
printf("%d%d%d%d%d\n", (dec&16)>>4, (dec&8)>>3, (dec&4)>>2, (dec&2)>>1, (dec&1));
Mivel tudjuk, hogy legfeljebb 31 lehet a dec (ezt illik ellenőrizni előtte), ezért szimplán sorban kiolvassuk dec alsó 5 bitjét.
-
elistvan
őstag
Sziasztok! Olyan kódot keresek C ben, ami egy printf-el átszámolja nekem a decimális számot, binárissá. De csak 18 és 31 között. Csak egy változót lehet használni. Másfélét találtam, de ilyet még nem.
Esetleg ezt a kódot, esetleg át lehet alakítani, hogy a megadott módon működjön?
Vagy leegyszerűsíteni?#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,r,dec,bin[20];
printf("Kerek egy egesz szamot: ");
scanf("%d", &dec);
int n=dec;
i=0;
while (dec>0)
{
r=dec%2;
bin[i]=r;
dec=dec/2;
i++;
}
printf("\n %d binaris alakja : ",n);
for (j=i-1;j>=0;j--)
{
printf("%d ",bin[j]);
}
getch();
return 0;
} -
elistvan
őstag
Kösz mindkettőtöknek!
-
elistvan
őstag
Sziasztok!
Codeblocks-os kérdés. Megírok egy forráskódot lefutattom, aztán kitörlöm, beírok a helyére egy másikat. Futtatom és mégis az előző fut le. Miért van ez, és hogy lehet megoldani, ha csinálok több feladatot az aktuálisan beírtat tudjam lefuttatni (hogy megkereshessem a hibát) és elmenthessem?
-
sztanozs
veterán
válasz
ub19student #5945 üzenetére
Vagy futtasd az exe-t parancssorból.
-
kovisoft
őstag
válasz
ub19student #5945 üzenetére
Tegyél be a programod végére egy billentyű nyomásra várakozást, hogy csak azután fejeződjön be a programod. Vagy pedig nyisd meg a command promptot és abból indítsd a programodat, ne pedig rákattintva.
-
ub19student
friss újonc
CommandPromt ablak eltűnik / C nyelv/ Windows
========================================
A CodeBlocks-ot használtam a Linuxon. Most megpróbáltam áttenni a programjaimat a Windows7-re, szintén a CodeBlocks-al.
- ha az exe programot futtatom a CodeBlocks-ból, a CommandPromt ablak kinyílik az eredménnyel és ott marad
- mikor direkt futtatom az exe filet, közvetlenül rákattintva a directory-ben, a CommandPromt ablak egy tizedmásodpercre felvillan az eredménnyel és eltűnik
= Kérem, aki tudja, árulja el, hogy marad ott az ablak ekkor is.
Kösz, előre is. -
mepet
addikt
válasz
elistvan #5943 üzenetére
Szerintem nézd meg a tantárgyleírásnál (vagy kérd el a tanártól) a kötelező és ajánlott jegyzetek listáját, hátha van köztük valami értelmes.
Én ebből a könyvből tanultam anno, nagyon részletes és jó könyv, de nem tudom mennyire jó totál kezdőknek: Kochan: Programfejlesztés C nyelven
-
elistvan
őstag
Sziasztok!
ANSI C programozást tanulni, hogyan érdemes / ajánlott hozzákezdeni? (mingw+codeblocksban dolgozunk.) A tanár először magyaráz 2 órát aztán szünet/ utána csak nyomja fel a táblára programkódot, meggondolni sincs időm melyik sor mit csinál. (és tőlünk kérdezgeti, hogy mi a következő sor. ) Nyíregyházán az Egyetemen ezt tanítják ebben a félévben (a következőben meg java-t). Nekem jó a kettes csak valami tuti tananyag/módszer kellene. Ráadásul mi tanárok a programtervező infósokkal vagyunk egy csoportban. Tehát közel sem azonos súlycsoport. Már az elején elment a kedvem az egésztől. Olyan anyag kellene (keresgéltem a neten jegyzeteket) ami rendesen magyaráz, hogy mi mit csinál(melyik sor) és miért. Nekem sajna élet halál kérdés, a kettes így levelezőn, szóval mindennemű segítséget szívesen veszek és köszönöm előre is.
-
axioma
veterán
Nincs jogom torolni, nem tudom miert gondolod. De a helyzeted reszletezese utan se ertek egyet. Ha indokolt, akkor halaszd a felevet. Ha csak ez az egy targy nem lesz meg mert amugy nem indokolt hogy ne lenne idod vinni a tanulast, akkor meg hagyd potvizsgara. Nem ertem miert a csalas a megoldas.
A tanar tuti ugy gondolta, hogy nem egyedul bujod az internetet hanem valaki iranyitja hogy mit nezz meg, vagy tovabbsegit egy tippel ha elakadsz. Ezt pedig itt, a forum kereteiben is megtesszuk - de ehhez te is bele kell tegyel annyi energiat, hogy elindulj.
A vizvezetek-szerelotol NEM segitseget, hanem megoldast kersz. Pontosan, te is megoldast kertel, es ez veri ki a biztositekot. -
csizs
aktív tag
válasz
Domonkos #5940 üzenetére
Maga a tanár javasolta, hogy kérjek segítséget. Engedve van. Innentől valóban nem tartom csalásnak a dolgot. Egyébiránt segítséget kértem. Nem programozónak készülök! Te is kérsz segítséget, ha elromlik a vízvezeték, vagy más. Te sem mindig tartod be a KRESZ-t. Amikor enni kell adnom egy gyereknek egy olyan vizsga, ami kevésbé lényeges, de az kell elnézést kérek, de emberség is van.
Ha nem segítséget adsz kérlek ne sértegess, ha pedig úgy érzed ide ez nem illik kérlek töröld!
-
csizs
aktív tag
Talán szomorú. (Nem biztos, hogy a képességeim értékeled ezzel)
Ma pl: édesapám harmadik szívinfarktusa volt hajnal 4 felé. Én pl: annyi feladatot adtak 1 hétre, hogy az már elkészíthetetlen mennyiségű, de az is igaz, hogy a fel nem készítés miatt is kétségkívül ehhez a módszerhez folyamodtam. Talán ha nem értesz egyet töröld, de ez nem biztos, hogy a legjobb megoldás. Ha egy gyerek nem eszik adsz neki enni, ha egy ember beteg segítesz. De ha egy családapa, aki dolgozik és nincs már ideje mindenre, esetleg egy ilyen családi tragédia is történik tudod megoldást keres.Ráadásul a nyelv Ansi C, ami mér elavult és két feladat megoldásért miért kellene megtanulnom egy egész nyelvet?
-
csizs
aktív tag
Keresek c programozásban jártas embert, aki két feladatot megoldana nekem. Juttatás ellenében is.
privátban jelentkezz.
-
buherton
őstag
válasz
f(x)=exp(x) #5935 üzenetére
Másold be ide.
-
f(x)=exp(x)
őstag
Sziasztok!
Van itt valaki, aki tudna nekem segíteni pár dologban? Konkrétan írtam egy egyszerűbb programot, és annak egyes részeit át kellene formázni úgy, hogy legyen benne pointer, struktúra. Nem kérem természetesen, hogy bárki megcsinálja helyettem, csak ötletet szeretnék, hogy hol célszerű ezt megtenni a programon belül.
Privát üzenetben átmásolom a konkrét programomat (egyszerű matematikai problémát megoldó programról van szó).
Előre is köszönök minden segítséget! -
kovisoft
őstag
válasz
don_peter #5933 üzenetére
Ja, az eredeti hozzászólásodból az jött le, hogy a "cikkszám;darabszám" össze van téve egyetlen stringbe. Mindegy, ezzel az adatstruktúrával ugyanúgy tud menni a dolog, csak meg kell írni az összehasonlító függvényt a qsort-hoz (de persze más módon is rendezheted a tömbödet).
-
kovisoft
őstag
válasz
don_peter #5931 üzenetére
Egy lehetséges megoldás:
Rendezed a string tömbödet (pl. qsort). Végigmész a rendezett tömb elemein, minden elemre a stringet kettéválasztod a pontosvessző mentén (pl. strchr-rel megkeresed a ';' karaktert, és lecseréled 0-ra). Az első rész lesz a cikkszám, ezt megjegyzed, a második részt atoi-val integerré alakítod, ez a darabszám. Ha a cikkszám ugyanaz, mint az előző, akkor csak szimplán hozzáadod a darabszámot az előzőek összegéhez. Ha új cikkszámhoz értél vagy vége a tömbnek, akkor az előző cikkszámot kiírod egy új tömbbe, mellé az összeadogatott darabszámot. -
don_peter
senior tag
Srácok szeretnék kérni egy kis segítséget.
Van egy string tömböm és a következő adatok vannak benne:
adat1 = cikkszám
adat2 = darabszámB301;1
F100;9
G120;20
P203;6
B301;1
F100;9
G120;20
A9G;12
P203;2
B301;8Rendezni kellene a tömböt, úgy hogy minden cikkszámból csak 1 szerepeljen benne, de a darabszámokat össze kell adni.
pl.:
B301;10
F100;18
G120;40
P203;8
A9G;12Tudnátok nekem segíteni? (elég fáradt vagyok már, hogy jól pörögjön az agyam)
Már kezdek befáradni, de addig nem fekszem le amíg ezzel ma nem végzek.
Előre is köszi. -
alapz@j
tag
válasz
Domonkos #5928 üzenetére
Emlékeim szerint a C szabványban nem szerepel, hogy a char előjeles vagy előjel nélküli lenne, ezt ráhagyja az implementációra. A fordítók pedig jellemzően az int és társai után a char-t is előjelesként kezelik alapértelmezetten, nem véletlenül vannak a -funsigned-char kapcsolók és társaik..
-
expfgv
újonc
válasz
s1999xx #5924 üzenetére
Köszi a reagálást, ha már itt válaszoltál, leírom ide a konkrét problémát (bocsi a szemetelést a többiektől!).
Amit írtál, be van kapcsolva nálam, projectet is létrehoztam természetesen!
A feladat:Feladat: Állapítsuk meg, hogy az egyes változó típusok mekkora méretűek bájtban. (bájt==Byte)
Ezt a sizeof(x) egy operandusú operátorral tehetjük meg, mely az argumentumában szereplő objektum, ebben az esetben a változó méretét adja vissza bájtban. Így könnyen ellenőrizhetjük, hogy egy adott típus hány bájtos, azaz hány bájtot foglal le a memóriában,
Például.:
char típus : 1 (bájt), előjeles EGÉSZ alapból; -128...127;
unsigned char: 1 (bájt), előjel nélküli EGÉSZ, char típusú
számábrázolás; 0...255 értékekkel;
int típus : 4 (bájt) !!a 32 bites környezetben!!,
előjeles EGÉSZ alapból. Az int típus méretét feltétlenül ellenőrizni kell, mert a mérete operációs rendszer függő!FONTOS: A BREAKPOINT-ot az 'int main()' sorba tegye, léptesse a programot soronként és az eredményeket a WATCHES ablakban figyelje, LOCAL VARIABLES alatt! Ez az ablak 'debug' esetén automatikusan megnyílik.
Maga a kód (megjegyzésekkel):
#include <stdio.h> // header file-ok
#include <stdlib.h>
// Deklarációs rész (később)
// int aglobalis, bglobalis; // Globális változók helye, minden
// függvényből láthatók, későbbiekben
// (lehetőleg) ne használjuk. (Ezen
// változók akkor globálisak, ha egy
// modulból áll a program.)
int main() // BREAKPOINT ITT !!!
{
char ch; // lokális változók deklarálása
// kezdeti értékadás nélkül!
int a, b, c, d, e, f, g;// lokális változók csak a függvényen
// belül láthatók, most main()-on belül.
// FIGYELEM; alapból a számábrázolás előjeles (+/-)
a = sizeof(ch); // 'ch' nevű, 'char' típusú (1 bájtos) változó
// 'ch' változó méretét átadja az ’a’
// változónak (így a értéke 1 lesz).
b = sizeof(char); // közvetlenül a típus nevét is bele írhatjuk
c = sizeof(unsigned char); // a sizeof() operátor argumentumába
d = sizeof(int); // előjeles EGÉSZ számábrázolás
e = sizeof(unsigned int); // előjel nélküli EGÉSZ számábrázolás
f = sizeof(float); // ez a kompatibilitás miatt van már
g = sizeof(double); // újabb fordítók ezt tekintik alaptípusnak
// a 'float' és a 'double' típusok, valós számtípusok, azaz
// előjeles egész vagy tizedes pontos tört értékek is lehetnek
return 0;
}Namost én ezt bemásolom, majd a jelölt helyre rakok egy breakpointot. Nyomok egy F8-at, majd nyomnám az F7-et, de semmi értelme. Egyrészt a Watches ablak teljesen üres, másrészt nem lép a sorok között.
kovisoft: bocsi, teljesen fogalmatlan vagyok ilyen téren, ma láttam életem első C kódját.
Leírtam ebben a hozzászólásban, hogy hogy csináltam.
-
expfgv
újonc
Sziasztok!
Most kezdtem a programozást, viszont egy nagyon alapnak tűnő dolognál elakadtam, amiről nem tudom, hogy program hiba, vagy én rontok el valamit. Code Blocksot használok, és ott kellene egy megadott programnál a Watches ablakban pár dolgot figyelni, viszont nekem nem jelenik meg ott semmi.
Privátban átmásolom a konkrét programot és amit kér a feladat, valamint amiket amiket én nyomkodok, és mégse jó.
Előre is köszönöm, ha valaki segít! -
Domonkos
addikt
válasz
buherton #5921 üzenetére
Itt az altalam javasolt megoldas:
#include <stdio.h>
int strcmp(char *s1, char *s2);
int
strcmp(char *s1, char *s2)
{
unsigned c1, c2;
for(;;) {
c1 = *s1++;
c2 = *s2++;
if(c1 != c2) {
if(c1 > c2)
return 1;
return -1;
}
if(c1 == 0)
return 0;
}
}
int
main(int argc, char *argv[]) {
if (argc != 3) {
fputs("argc\n", stderr);
return 1;
}
printf("%d\n", strcmp(argv[1], argv[2]));
return 0;
} -
Alcsi69
senior tag
Sziasztok!
Villamosmérnökire járok és van programozásunk, C-ben programozunk. (vagyis eddig órákon csak tábláról való másolás ment) Nem nagyon értek sokmindent, és igazából annyira nagyon nem is érdekel (ha annyira érdekelne mondjuk mérnökinfóra mentem volna), viszont van néhány féléves feladatunk, melyek közül 1-et kell megcsinálnunk és megmutatni a tanárnak.
Én azt a feladatot választottam, hogy meg kell írnom a saját strcmp függvényemet. Mind ezt úgy, hogy argv, argc--ból kell vennie a két string-et, nem használhatunk scanf-t.Valaki aki nagyon ért hozzá, tudna mutatni egy példát erre a dologra egy kis magyarázattal?
-
dobragab
addikt
válasz
Krisztiiii #5916 üzenetére
Ez nem valami BME GPK szerencsétlenség és C#? Mintha ott már találkoztam volna ezzel a stílussal...
-
buherton
őstag
válasz
Krisztiiii #5916 üzenetére
A C-nek nincs GUI-ja.
-
Krisztiiii
újonc
Sziasztok! Tudna valaki segiteni az 5-os, 6-os es 7-es feladatokkal? Nagyon nem tudom, hogy kezdjek hozza, sokat segitene hihetetlenul! Koszonom szepen
(L:/dl/upc/2018-11/23/755405_yma8gh180lcluzuw_inkedreceived_263517184513014_li.jpg)[kép](/L) -
bandi0000
nagyúr
válasz
Domonkos #5912 üzenetére
tök 8 nagy nehezen meg lett a hiba maga az algoritmus jól működik, csak akkor bugzódik be, hogyha kevesebb vagy több elemű tömb-öt kéne használnom mint amit lefoglaltamszóval jön is a kérdés, az a gond hogy paraméterben kell megadni, hogy mekkora lesz a mátrix, meg van adva, hogy mennyi lehet maximum, de ha annyit foglalok le, akkor is baja van neki, viszont az üzenethez structúrát kell létrehozni, amit előre kell deklarálni, szóval az lenne a jó ha úgy tudnám létrehozni, a sturktúrát, hogy már tudom a mátrix méretét, de ez lehetséges valahogy?na ezért jó kérdezni, mert közbe rá jöttem, mivel helyet is kellett foglalni az elküldendő üzenetnek, így ott kellett volna max méretre helyet foglalni, és akkor nincs hiba
-
bandi0000
nagyúr
sziasztok
Kérnék egy kis segítséget, ha ide tartozik
igaz linux alatt írjuk a kódot, de C-be
processzekkel foglalkozunk, és az lenne a feladat, hogy üzenetet küldjön egyik a másik processznak (msgsnd,msgrcv)
A feladat talán nem is lényeges, inkább az, hogy egy N*M-es mátrixot kell küldözgetni
létrehozok N+M mátrixot
első N mátrix az sorokkal
utána a többi az oszlopokkal dolgozikés össze vissza kapják, adják az üzeneteket
for-ba hoztam létre a processzeket, és a for-ban lévő id-vel hivatkozok az egyes processzekre
maga a gyerekek kódja így néz ki, mert gondolom itt a hiba, a szülő jól adja át elvileg az első gyereknek a mátrixot
-
alapz@j
tag
A Nuwen.net-es MinGW-ben például van pcre / regex.h, nem kell hozzá Cygwin. Ne terjesszünk már olyan butaságokat, hogy a "A C-t nem a windows-ra találták ki."!
-
kispx
addikt
A readme-ben le van írva, hogy mit kellene csinálni, viszont ahogy nézem ahhoz a msys is kell. Itt most nincs egyszerű út.
Egy próba elejéig megpróbálhatod, hogy a *.c és a *.h fájlokat hozzácsapod a projekthez. Viszont azt ki kell majd találni, hogy melyik előfordítói direktívákat kell definiálnod, hogy leforduljon ez a pár fájl.
-
kispx
addikt
Milyen fordítót használsz a code::blockhoz?
Alapértelmezetten MinGW van hozzácsomagolva, ehhez van pár csomag:
https://stackoverflow.com/questions/3781211/c-regex-library-with-mingw
https://sourceforge.net/p/mingw/regex/ci/master/tree/ -
buherton
őstag
De lehet, ha Cygwin-t raksz alá. Egyszer csináltam ilyet Eclipse-szel, de halál volt
.
A CodeBlocks egy IDE, amivel a kódot tudod szerkeszteni, fordítani, futtatni és debuggolni. Csak ugye mindez a windowson történik. A regex pedig POSIX.2 szabvány van definiálva. Ehhez Unix-szerű környezetnek kell, hogy fusson a gépeden.
A C-t nem a windows-ra találták ki.
Ú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!
- Formula-1
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Luck Dragon: Asszociációs játék. :)
- Kerékpárosok, bringások ide!
- sziku69: Fűzzük össze a szavakat :)
- Milyen asztali médialejátszót?
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Kazy Computers - Fehérvár - Megbízható?
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- További aktív témák...
- Több mint 70.000 eladott szoftverlicenc
- Országosan a legjobb BANKMENTES részletfizetési konstrukció! Lenovo ThinkPad L16 Gen 1 Prémium
- iKing.Hu - Apple iPhone 13 Pro Max - Graphite - Használt, újszerű
- Csere-Beszámítás! Olcsó Számítógép PC Játékra! R5 1500X / RX 570 8GB / 16GB DDR4 / 250SSD + 2TB HDD
- Realme C30 32GB, Kártyafüggetlen 1Év Garanciával
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest