- AMD Navi Radeon™ RX 9xxx sorozat
- HP notebook topic
- Bluetooth hangszórók
- Fejhallgató erősítő és DAC topik
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- CPU léghűtés kibeszélő
- Melyik tápegységet vegyem?
- OLED TV topic
- Teljesen az AI-ra fókuszál az új AMD Instinct sorozat
- Azonnali notebookos kérdések órája
Új hozzászólás Aktív témák
-
skylaner
senior tag
válasz
Geresics #3956 üzenetére
Nem a teljes kód, de a lényeg benne van.
#include <stdio.h>
void szoveg_tordelo(char* string, int char_num)
{
int i=1;
while (*string != '\0')
{
printf("%c",*string);
if (i%char_num == 0) printf("\n");
i++;
string++;
}
}
void main()
{
char* string="cseresznye";
szoveg_tordelo(string,3);
} -
Jester01
veterán
válasz
Geresics #3955 üzenetére
Ez nem jó, először szépen kiszámolod a távolságot de azután nem abból keresed a maximumot:
for (i=0; i<n; i++)
if ((pont[i].x)>max) {
max=pont[i].x;
mem=i;
} else if ((pont[i].y)>max) {
max=pont[i].y;
mem=i;
}Itt miért az x,y-al varázsolsz?
Helyesebben:for (i=0; i<n; i++)
if (tav[i]>max) {
max=tav[i];
mem=i;
}Egyébként ehhez el sem kellene tárolni a pontokat, a maximum távolságot a hozzá tartozó ponttal együtt a bekérő ciklusban is nyilvántarthatod.
Ja és kellene #include <math.h> az sqrt miatt.
-
Geresics
addikt
válasz
Geresics #3954 üzenetére
Megoldásom:
#include <stdio.h>
struct koord
{
float x;
float y;
};
void main()
{
struct koord pont[10];
float tav[10];
int n, i, mem;
float max=0;
/* beolvasas */
printf("\nHany koordinatat szeretne rogziteni?");
scanf("%d",&n);
for (i=0; i<n; i++)
{
printf("\nAdja meg az x%d koordinatat: ", i+1);
scanf("%f",&pont[i].x);
printf("\nAdja meg az y%d koordinatat: ", i+1);
scanf("%f",&pont[i].y);
tav[i]==(sqrt(pont[i].x*pont[i].x)+(pont[i].y*pont[i].y));
}
for (i=0; i<n; i++)
if ((pont[i].x)>max)
{
max=pont[i].x;
mem=i;
}
else if ((pont[i].y)>max)
{
max=pont[i].y;
mem=i;
}
/* kiíratás */
printf("\nA legtavolabbi koordinata az origotol: %f, %f", pont[mem].x, pont[mem].y);
} -
skylaner
senior tag
válasz
Geresics #3943 üzenetére
Scanf miatt.
A scanf("%d",&db) beolvassa a számot amit beírtál, de az input stream bufferen még ott marad az Enter( \n vagy \r\n) amit majd a gets() fog beolvasni. Úgyhogy a konyv.cim egy \n-t fog tartalmazni.scanf() után ki kell üríteni a buffert. Erre van több megoldás is:
- fflush(stdin); (ez nem mindig működik)
- amit én is használtam: while (c != '\n' && c != EOF) { c = getchar(); }
- lehet hogy ez is működne:
char dummy_string[10];
scanf("%d%s",&db,dummy_string)Valamit gets() használata nem javasolt, helyette fgets() használj. / fgets(string,100,stdin) /
-
buherton
őstag
válasz
Geresics #3935 üzenetére
Az ilyen vizsgáknak azaz átkuk, hogy csak kis esélye fogsz tudni átmenni úgy mint egyik volt szobatársamnak. Otthon megkapta a feladat megoldást, és megtanulta fejből. Azt nem tudta, hogy működik, de meg lett neki. Én ezt az utat nem javaslom.
Először keress egy C könyvet, és olvasd el kétszer legalább. Amint ez meg van gyere vissza ide.
-
skylaner
senior tag
válasz
Geresics #3935 üzenetére
Hát pedig a feladathoz nélkülözhetetlen.
Semmit nem csinál. Egyszerűen ezt a nevet adtam a saját változó típusomnak (typedef miatt)
Adhattam volna "papírsárkány" nevet is de annak nem lett volna sok értelme
(Egyébként a "_t" mint type, típus).Lehetne typedef nélkül is de akkor később többet kellene írni.
Pl.struct mydate
{
int year;
int month;
int day;
};
struct mydate published_date; -
skylaner
senior tag
válasz
Geresics #3932 üzenetére
Nem tudom, mennyire kell "hülye biztosra" írni a programot, de van benne 1-2 ellenőrzés.
Ha valami nem világos kérdezz nyugodtan.#include <stdio.h>
typedef struct mydate
{
int year;
int month;
int day;
} mydate_t;
typedef struct book
{
char title[30];
char writer[30];
mydate_t published_date;
} Book_t;
void print_book_info(Book_t book)
{
printf("Konyv cime: %s",book.title);
printf("Konyv szerzoje: %s",book.writer);
printf("Konyv kiadasi datuma: %d-%d-%d\n",book.published_date.year,book.published_date.month,book.published_date.day);
}
void input_stream_cleaner()
{
char c;
while (c != '\n' && c != EOF) { c = getchar(); }
}
int main(int argv,char* argc[])
{
Book_t books[10];
int i,books_count,min;
int min_years[10], min_months[10];
int min_years_count,min_months_count,min_day_idx;
printf("Mennyi konyvet akarsz tarolni:");
scanf("%d",&books_count);
input_stream_cleaner();
if ((books_count > 10) || (books_count < 1))
{
printf("Hiba! Minimum 1 es Maximum 10 kony adatait tudom tarolni!\n");
return 0;
}
for(i=0;i<books_count;i++)
{
printf("%d. konyv cime:",i+1);
fgets(books[i].title,30,stdin);
printf("%d. konyv szerzoje:",i+1);
fgets(books[i].writer,30,stdin);
printf("%d. konyv kiadasi datuma (YYYY-MM-DD):",i+1);
if (scanf("%d-%d-%d",&(books[i].published_date.year),&(books[i].published_date.month),&(books[i].published_date.day)) != 3)
{
printf("Hibas datum formatum!\n");
return 0;
}
input_stream_cleaner();
}
/*** Legkisebb ev keresese ***/
min = books[0].published_date.year;
for(i=1;i<books_count;i++)
{
if (books[i].published_date.year < min) min = books[i].published_date.year;
}
/*** Legkisebb evbol van-e tobb ***/
min_years_count=0;
for(i=0;i<books_count;i++)
{
if (books[i].published_date.year == min)
{
min_years[min_years_count]=i; //books tomb indexet taroljuk
min_years_count++;
}
}
if (min_years_count < 2) print_book_info(books[min_years[0]]);
else /*** Tobb konyv azonos evvel ***/
{
/*** Legkisebb honap keresese ***/
min = books[min_years[0]].published_date.month;
for(i=1;i<min_years_count;i++)
{
if (books[min_years[i]].published_date.month < min) min = books[min_years[i]].published_date.month;
}
/*** Legkisebb honapbol van-e tobb ***/
min_months_count=0;
for(i=0;i<min_years_count;i++)
{
if (books[min_years[i]].published_date.month == min)
{
min_months[min_months_count]=min_years[i];
min_months_count++;
}
}
if (min_months_count < 2) print_book_info(books[min_months[0]]);
else /*** Tobb konyv azonos evvel es honappal ***/
{
/*** Legkisebb nap keresese ****/
/*** Tobb azonos nap eseten a legeloszor beirt az eredmeny ***/
min = books[min_months[0]].published_date.day;
min_day_idx = 0;
for(i=1;i<min_months_count;i++)
{
if (books[min_months[i]].published_date.day < min)
{
min = books[min_months[i]].published_date.day;
min_day_idx = i;
}
}
print_book_info(books[min_months[min_day_idx]]);
}
}
return 0;
} -
buherton
őstag
válasz
Geresics #3920 üzenetére
1. feladatra egy megoldás:
#include <stdio.h>
#include <string.h>
int main(void)
{
int i;
char string[10];
printf("Adjon meg egy max 10 karakteres szoveget\n");
gets(string);
for(i = 0; i < 10; i++)
{
if(string[i] == '\0') { printf("\n"); return 0; }
if(string[i] > '0' && string[i] <= '9')
{
int rep;
for(rep = 0; rep < string[i] - '0'; rep++)
{
printf("%c", string[i+1]);
}
i++;
}
else
{
printf("%c", string[i]);
}
}
printf("\n");
return 0;
} -
dudika10
veterán
válasz
Geresics #3889 üzenetére
#include <stdio.h>
#include <string.h>
void beolvas(char * szoveg)
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
return;
}
int szamlalas(char *szoveg)
{
int db=0;
int i=0;
while (szoveg[i]!='\0' && szoveg[i]!='.')
{
if (szoveg[i]==' ')
db++;
i++;
}
return db;
}
int main()
{
char szoveg[71];
int db;
beolvas(szoveg);
db=szamlalas(szoveg);
printf("A szoveg: %s, szavak szama: %d\n", szoveg, db);
return 0;
}Így jó.
A while ciklusod végtelenciklusba kerülne, nem logikai vagy, hanem és kapcsolat kell. Ha bármelyik megtörténik egyből ki kell lépni.
Láthatod azt is, hogy sztringet hogy kell átadni a függvénynek, és azt is, hogy a vissszatérési értéket hogyan kell használni.
Felhívnám a figyelmed az int db=0; és int i=0; sorokra. A deklarált változók memóriaszemetet tartalmaznak mindaddig, amíg értéket nem adsz nekik. Lehet, hogy az i-ben például a 2341 volt tárolva pont, és akkor úgy kezded, hogy a 71 lefoglalt bájtodból a 2341-ediket akarod olvasni, ahol lehet, hogy éppen az operációsrendszer dolgozik. Ezt nem szabad, ezért a fordító figyelmeztet, hogy adj értéket használat előtt.Remélem senki nem fogja leharapni ezért a fejem, de a BME VIK villamosmérnök hallgatók első féléves tárgya a C, és ebben a félévben nagyszerű diasort állítottak össze az oktatók.
[link]
Van gyakorlati anyag, elméleti anyag, rengeteg példa. -
tototos
addikt
válasz
Geresics #3889 üzenetére
na figyi, a szamlalas függvényed honnan tudja a beolvasott szöveget? attól mert ugyanazt a nevet használnod még az nem lesz ugyanaz, plusz a változóknak illik kezdőértéket adni
void beolvas(char* szoveg)
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
}
int szamlalas(char *szoveg)
{
int db [B]= 0[/B];
int i [B]= 0[/B];
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ') db++; // ha nem használsz {} jeleket akkor érdemes egy sorba írni az if-fel
i++;
}
return db;
} -
dudika10
veterán
válasz
Geresics #3886 üzenetére
(#3885) tototos: a kettő közül az egyik kell csak, persze.
A szöveg pointerként adódik át, mivel tömb neve [] nélkül mindig pointer.(#3886) geresics:Ha mutatót akarsz átadni, akkor (int *db) igen.
Viszont ekor a main-ben &db-t kell átadni.
int db;
Ekkor a db egy változó, &db a címe.
int * db;
Ekkor *db a változó, db a memóriacím.Ha int *db; -t írsz, akkor amikor értéket akarsz adni, akkor *db= ; kell.
Ha csak db= ; -t írnál, akkor a mutatót írnád át, és elveszítenéd az értéket.Amíg csak egy értéket akarsz visszaadni a függvénnyel, addig használd a visszatérési értéket. Ezt például a rekurzióhoz muszáj tudni kezelni, a rekurzió pedig gyakran ügyes kis trükk tud lenni.
(#3887) tototos: Ezzel nem is foglalkoztam még, de teljesen igazad van, kell neki a szöveg.
Globális változókról nekünk azt tanították, hogy amíg lehet kerüljük.(#3889) geresics : az i-nek adni kell egy kezdőértéket. Ha for ciklust használsz, akkor az for (i=0; ... értékadás is egyben. De mivel while ciklust használsz, ezért nincs ilyen értékadás, és az i jelenleg memóriaszemét.
A deklaráció után írj egy =0-t.
int i=0; -
dudika10
veterán
válasz
Geresics #3883 üzenetére
Egy függvény nem dolgozik a változóidon.
Másolatokat készít róluk.
Így ha a darab változódba beírod az 5-öt, és átadod egy függvénynek, akkor a függvény csinál ezzel valamit, átírja 6-ra, majd visszatér.
De mivel a függvény csak egy másolaton dolgozik, ezért a változóddal nem történik semmi.Erre találták ki a pointereket és/vagy globális változókat. Előbbit ajánlanám.
Pointerek segítségével átadhatod a memóriacímet, és így a függvény oda fogja írni.
Amíg csak 1 darab értéket kell módosítani a függvénynek, addig használhatod a visszatérési értékét.
Ha nem void ... a függvény, hanem int ... akkor a return darab; azt fogja eredményezni, hogy a darab értékét a függvény visszaadja.Pl.: int szamlalas ()
...
return db;
}és meghívásnál pedig:
db=szamlalas(db);Remélem érthető nagyjából és nem írtam semmi hülyeséget.
-
Davs
tag
válasz
Geresics #3856 üzenetére
Hmm a beolvas fuggveny parameterevel nincs gond? Marmint az nem tetszik, hogy a parameter se nem globalis tomb, se nem pointer egy lokalis tombre. Tehat a beolvas fuggveny meghivasanal, letrejon egy [5][5]-os LOKALIS (funkcio szinten) tomb, ami azutan nem marad meg, miutan kilep a funkcio (Ugyebar a memoria maga nem torlodik, szoval ha a beolvas es a nyomtatas fuggvenyek activation record-ja (nemtudom mi a magyar forditasa) megegyezik, akkor elvileg mukodhet, de nemhiszem, hogy egy alapszintu hazinal ezt joszemmel neznek).
Egy szo mint szaz, en egy 2D tombre mutato pointert adnek meg a beolvas fuggveny parameterekent. VAGY valamit NAGYON felreneztem, azesetben pedig kernek valakit, hogy mielobb rakjon helyrekoszi
-
tototos
addikt
válasz
Geresics #3856 üzenetére
Attól hogy a függvény paraméterben is a-nak nevezed még nem fogsz arra hivatkozni. Amikor meghívod a beolvas(a) függvényt akkor fogja az array-t az a-ra állítani.
a csere meg kb így néz ki:
void csere(int a[5][5], int oszlop1, int oszlop2)
{
int i; //sorokat jelöli
int temp = 0;
for(i=0;i<5;i++)
{
temp = a[i][oszlop1 - 1];
a[i][oszlop1 - 1] = a[i][oszlop2 - 1];
a[i][oszlop2 - 1] = temp;
}
} -
tototos
addikt
válasz
Geresics #3854 üzenetére
akkor kell csinálnod egy beolvas függvényt
void beolvas(int array[5][5])
{
int i,j;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &array[i][j]);
}
}
}
ez pedig a main:
int main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2, mem;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
beolvas(a);
return 0;
}
Ú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!
- Bomba ár! Lenovo ThinkPad T470s - i5-6GEN I 8GB I 256GB SSD I 14" FHD I Cam I W10 I Garancia!
- Azonnali készpénzes Intel i3 i5 i7 i9 12/13/14 gen processzor felvásárlás személyesen / csomagküldés
- BESZÁMÍTÁS! MSI Crosshair 17 HX Gamer notebook - i7 14700HX 64GB RAM 1TB SSD RTX 4060 8GB WIN11
- Telefon felvásárlás!! Apple Watch SE/Apple Watch SE 2 (2022)
- BESZÁMÍTÁS! MSI Z370 i5 9500 16GB DDR4 512GB SSD RX6600 8GB Cooler Master MB510L Chieftec 500W
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest