Diskuze: Procházení polí a srovnávání
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zadání je zcela jasné. Máš porovnat hodnoty ve dvou polích a uložit výsledky do třetího, tak by nebylo od věci vytvořit ta pole tři. Jedno budeš číst zleva, druhé zprava, porovnáš hodnoty na daných indexech a uložíš do třetího pole, které nakonec vypíšeš.
Pro inspiraci:
#include <stdio.h>
#define POCET 10
void comp_and_print(int* p1, int* p2, int* p3, int size);
int main(void) {
int pole1[POCET] = { 2, 5, 9, 8, 1, 3, 4, 7, 6, 0 };
int pole2[POCET] = { 5, 9, 8, 1, 3, 4, 7, 6, 0, 2 };
int pole3[POCET];
comp_and_print(pole1, pole2, pole3, POCET);
return 0;
}
void comp_and_print(int* p1, int* p2, int* p3, int size) {
for (int i = 0; i < size; i++) {
(*(p1 + i) > *(p2 + size - 1 - i)) ? (*(p3 + i) = *(p1 + i)) : (*(p3 + i) = *(p2 + size - 1 - i));
printf("%d ", *(p3 + i));
}
}
Když jsem to zkoušel pustit, píše mi to
4202832 0 8 1 0 2036576 0 37 8 4202832
Pak děláš něco špatně. Výstup programu je:
2 5 9 8 4 3 4 8 9 5
A když bych to chtěl ten tvůj kod upravit, abych zadával libovolná čísla, tak by se to udělalo jak?
To jak načítat hodnoty z klávesnice do pole máš už ve svém kódu. Inicializaci polí pozměníš na samotné definice a jelikož provádíš úkon více než jednou pouze s drobnými odlišnosti, sestavíš si na to funkci.
Celý kód pak vypadá následovně:
#include <stdio.h>
#define POCET 10
void read_array(int* p, int size, int index);
void comp_and_print(int* p1, int* p2, int* p3, int size);
int main(void) {
int pole1[POCET], pole2[POCET], pole3[POCET];
read_array(pole1, POCET, 1);
read_array(pole2, POCET, 2);
comp_and_print(pole1, pole2, pole3, POCET);
return 0;
}
void read_array(int* p, int size, int index) {
for (int i = 0; i < size; i++) {
printf("Zadej %d.prvek %d.pole: ", i + 1, index);
scanf("%d", p + i);
}
}
void comp_and_print(int* p1, int* p2, int* p3, int size) {
for (int i = 0; i < size; i++) {
(*(p1 + i) > * (p2 + size - 1 - i)) ? (*(p3 + i) = *(p1 + i)) : (*(p3 + i) = *(p2 + size - 1 - i));
printf("%d ", *(p3 + i));
}
}
Pokud v kódu nechceš pracovat s ukazateli a ukazatelovou aritmetikou, pak můžeš použít indexovou alternativu:
p[i] // alternativa za *(p + i)
&p[i] // alternativa p + i
Pozn:
Výše uvedený kód neopisuj, ber ho pouze jako inspiraci.
Ještě jedna věc týkající se k tvému úryvku kódu:
Tvar funkce main() schopné přebírat argumenty zadanými na příkazovém řádku má tvar:
int main(int argc, char *argv[])
// nikoli
int main(int argc, char **argv[])
Druhý parametr je pole znakových ukazatelů, nikoli pole ukazatelů na znakový ukazatel.
Už jsem to zvládl ale vždy po spuštění a zadání mně to ukazuje toto
1
0
4203865
0
0
0
44
0
0
0
Už nevím, co s tím
#include <stdio.h>
#include <stdlib.h>
#define POCET 10
int main(int argc, char *argv[]) {
int pole1[POCET];
int pole2[POCET];
int pole3[POCET];
int i, j = POCET-1;
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 1.pole: ",i+1);
scanf("%d", &pole1[i]);
}
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 2.pole: ",i+1);
scanf("%d", &pole2[j]);
}
for(i = 0;i < POCET;i++);{
if(pole1[i]>pole2[j]){
pole3[i] = pole1[i];
}
else{
pole3[i] = pole2[j];
}
j--;
}
for(i = 0;i < POCET;i++){
printf("%d\n", pole3[i]);
}
return 0;
}
Díky za odpověď
Mnohem lepší. Zkontroluj si druhý for cyklus, který není zcela v pořádku. Je pak druhý čítač nutný když používáš jeden čítač a zároveň znáš počet prvků pole?
mohl bys mi to ukázat, já na tu chybu nemohu přijít
Traversuješ pole2 pomocí indexu i, ale načítáš hodnoty na konstantní index j (POCET - 1).
Asi mi to už nemyslí, mohl by si to vypsat nebo napsat správně??
díky
&pole2[i]
Když si provedeš kontrolní výpis ihned po načtení, bude se Ti programovat lépe.
i když jsem to změnil tak stále. Pokud jsem to udělal dobře. Mohl by si to opravit přímo? díky
#include <stdio.h>
#include <stdlib.h>
#define POCET 10
int main(int argc, char *argv[]) {
int pole1[POCET];
int pole2[POCET];
int pole3[POCET];
int i, j = POCET-1;
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 1.pole: ",i+1);
scanf("%d", &pole1[i]);
}
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 2.pole: ",i+1);
scanf("%d",&pole2[i]);
}
for(i = 0;i < POCET;i++);{
if(pole1[i]>pole2[j]){
pole3[i] = pole1[i];
}
else{
pole3[i] = pole2[j];
}
j--;
}
for(i = 0;i < POCET;i++){
printf("%d\n", pole3[i]);
}
return 0;
}
nic
Mohl by si to opravit přímo? díky
Nemohl. Tím, že bych to udělal za tebe, ztratila by domácí úloha svůj
smysl.
Je třeba se nevzdávat hned po prvním neúspěchu, takto bys toho moc
neudělal.
Vynaložené úsilí, které do toho vložíš, se Ti v budoucnu bohatě
vrátí.
Ale navedu Tě správným směrem a něčeho Tě přiučím.
Když Ti program nefunguje, je třeba najít chybu.
Zpočátku není na škodu si provádět kontrolní výpisy, jak už jsem v
předchozím příspěvku psal.
Tím si zkontroluješ, zda operace, kterou jsi provedl proběhla správně.
Dvě operace, které si prováděl, měly způsobovat naplnění polí pole1
a pole2 celými čísly z klávesnice.
Správně si použil for cyklus, stanovil rozsah, použil symbolickou konstantu
POCET.
Funkce scanf() a print() jsou funkcemi ze standardní knihovny jazyka C,
vyžadují vložení hlavičkového
souboru stdio.h. Pomocí direktivy preprocesoru #include si tento hlavičkový
soubor vložil.
Nyní je třeba zjistit, zda se čísla zadaná z klávesnice načetla do
pole správně.
Budeš testovat pouze tyto dvě operace, ostatní si můžeš zakomentovat.
Tím že si obsah polí budeš postupně vypisovat, ač to v ostré verzi
programu být nemá, zjistíš,
zda vše proběhlo v pořádku. Můžeš si tam výpis pole dočasně vložit,
vše ověřit a smazat. Nebo
můžeš použít podmíněný překlad. Jehož část pak můžeš jednoduše
pro překladač odstranit tím,
že zrušíš definici makra (např. dáš do komentáře nebo vymažeš).
Může to vypadat např. následovně:
#include <stdio.h>
#define DEBUG // ladeni programu
#define POCET 10
int main(int argc, char* argv[]) {
int pole1[POCET];
int pole2[POCET];
// int pole3[POCET];
int i;
for (i = 0; i < POCET; i++) {
printf("Zadej %d.prvek 1.pole: ", i + 1);
scanf("%d", &pole1[i]);
}
#ifdef DEBUG
for (i = 0; i < POCET; i++) printf("%d ", pole1[i]);
putchar('\n');
#endif
for (i = 0; i < POCET; i++) {
printf("Zadej %d.prvek 2.pole: ", i + 1);
scanf("%d", &pole2[i]);
}
#ifdef DEBUG
for (i = 0; i < POCET; i++) printf("%d ", pole2[i]);
putchar('\n');
#endif
/*
for (i = 0; i < POCET; i++); {
if (pole1[i] > pole2[j]) {
pole3[i] = pole1[i];
}
else {
pole3[i] = pole2[j];
}
j--;
}
*/
/*
for (i = 0; i < POCET; i++) {
printf("%d \n", pole3[i]);
}
*/
return 0;
}
Všimni si, jaké úpravy jsem v programu provedl.
Když si tento program spustíš, zjistíš, že to co si zadal z
klávesnice, je obsahem polí pole1 a pole2.
A to je to co chceš. Můžeš zakomentovat řádek s #define DEBUG a
pokračovat dále v tvorbě programu.
Tento cyklus opakovat, dokud program nebude fungovat tak jak má.
Pokud by si toto prováděl, zjistil bys včera, že pole2 se Ti nenačetlo správně a nehledal bys složitě chybu v celém programu.
Jak se budou tvé znalosti zlepšovat, budeš už vědět na co si dávat pozor a čas strávený laděním se Ti zkrátí.
Zobrazeno 15 zpráv z 15.