Diskuze: Jednorozměrné pole -zdroják

C++ C a C++ Jednorozměrné pole -zdroják

Avatar
Honza
Neregistrovaný
Avatar
Honza:

Ahoj lidi,

jsem strojař, tedy programátorský analfabet, ale musíme mít jeden semestr programování v C... ach ta byrokracie. Dávám sem tedy zdroják který jsem vytvořil, bohužel mi to nefunguje tak jak má. Našel by se někdo kdo by tam dokázal něco přehodit/prohodit?

Je to program, který čte ze vstupu reálná čísla (budou kladná a bude jich maximálně 100). Vstup je ukončen nulou. Program vypíše počet prvků větších nebo rovných polovině maxima zadaných hodnot. Př.:

Vstup: 1.0 2.5 4.0 1.0 0
Výstup: 2

Vstup: 0.3 1.0 1.2 8.0 6.2 2.1 4.0 0
Výstup: 3

zde můj zdroják (je to možná prasácky, nemám návyk):

#include <stdio.h>

int main()

{
float pole[100];
int i=0;
float x;
int n=0;
float max=0;
printf("Zadavej kladna cisla, zadavani ukoncis nulou\n");
while(x!=0) {
pole[i]=x;
scanf("%f",&x);
/*sem ok vypíná nula*/

int pocetprvku=i;

if (x>0){
max=pole[0];
for(i=0; i<pocetprvku;i++){
if(pole[i]>=max) {max=pole[i];} else{ max=pole[0];} //když je prvek pole - i vetsi nez maximum, tak se z toho prvku stane maximum

if(pole[i]>=(max/­2)){n=n+1;} else{ n=n+0;} //melo by to byt v cyklu for aby to bralo vsechna cisla vetsi nez pulka z maxima
}

}

}
printf("Maximum je:%f\n",max);

printf("Pocet cisel vetsich nez polovina z maximum je:%d\n",n);
return (0);
}

Ještě dodám že maximum by mělo byt zjišťováno přes >,<,=, ne přes nějakou funkci. Možná že mi tam chybí nějaký ukazatel opravdu nevím..

Predem dekuji za reakce.

 
Odpovědět 20.10.2013 9:22
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Honza
Honza:

(pro přehlednost)

#include <stdio.h>

int main()

{
float pole[100];
   int i=0;
   float x;
   int n=0;
   float max=0;
    printf("Zadavej kladna cisla, zadavani ukoncis nulou\n");
   while(x!=0)  {
        pole[i]=x;
                scanf("%f",&x);
                                                        /*sem ok vypíná nula*/

        int pocetprvku=i;

         if (x>0){
         max=pole[0];
                for(i=0; i<pocetprvku;i++){
                        if(pole[i]>=max) {max=pole[i];} else{ max=pole[0];}                     //když je prvek pole - i vetsi nez maximum, tak se z toho prvku stane maximum

                                if(pole[i]>=(max/2)){n=n+1;} else{ n=n+0;}                         //melo by to byt v cyklu for aby to bralo vsechna cisla vetsi nez pulka z maxima
                }

        }

}
                        printf("Maximum je:%f\n",max);

                                printf("Pocet cisel vetsich nez polovina z maximum je:%d\n",n);
    return (0);
}
 
Nahoru Odpovědět 20.10.2013 9:32
Avatar
Odpovídá na Honza
Lukáš Hruda (Luckin):

Proměnnou x přiřazuješ do pole dřív než jí načítáš, tudíš první hodnota v poli je v podstatě náhodná a každá další hodnota je hodnota kterou jsi zadal v ředchozím průchodu cyklem, poslední zadaná hodnota není přiřazená nikam.

 
Nahoru Odpovědět 20.10.2013 10:39
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Honza:

Chápu to tedy dobře že stačí prohodit tyto dva řádky

pole[i]=x;
                scanf("%f",&x);

a potom? nemohl by jsi prosím tu část kódu napsat jako pro blbce? já v tom ty následující souvislosti nějak nevidím..
zkoušel jsem to jakože

if(pole[i+1]>max) {max=pole[i+1];}      else{ max=pole[i];}

ale to nic nedělá, jak jsi to myslel že poslední zadaná hodnota není přiřazená nikam? jak to ošetřím?

 
Nahoru Odpovědět 20.10.2013 11:12
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Honza
Honza Bittner:

Nikde nemáš jakou hodnotu má proměnná x

Nahoru Odpovědět 20.10.2013 11:27
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza
Lukáš Hruda (Luckin):

Děláš to dost zvláštně. Proč zjišťuješ maximum po zadání každého prvku? Nejdřív si načti do pole z klávesnice všechny hodnoty a ulož si jejich počet, pak zjisti maximum celého pole a pak ho jenom proiteruj a zjisti které prvky jsou větší nebo rovny polovině toho zjištěného maxima.

 
Nahoru Odpovědět 20.10.2013 11:34
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
TomBen:

Ta zvláštnost bude asi tím, že to má pokopírované z různých kousků,
aniž by došlo k pochopení činnosti. :-)

PS: maximum bych hledal už v zadávacím cyklu

Nahoru Odpovědět 20.10.2013 11:56
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Lubos857
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Lubos857:

Není potřeba vůbec znovu procházet pole a hledat maximum. Před začátkem cyklu bych si deklaroval proměnnou "max" a vždy bych se podíval, jestli je zadaná hodnota větší.

Také bych místo cyklu "while" použil "do while"

EDIT: TomBen byl rychlejší :-)

Editováno 20.10.2013 11:58
Nahoru Odpovědět 20.10.2013 11:57
Protože bagr nežere cukr.
Avatar
Odpovídá na Lubos857
Lukáš Hruda (Luckin):

Ano, takto by to bylo ještě lepší :)

EDIT: Ovšem pokud by to dělal postupně, mohl by to snáze rozdělit do funkcí a bylo by to přehlednější.

Editováno 20.10.2013 12:23
 
Nahoru Odpovědět 20.10.2013 12:21
Avatar

Neregistrovaný
Avatar
Odpovídá na Lukáš Hruda (Luckin)
:

Díky, já myslel že to pole si pamatuje číslo posledního í-tého prvku.. nicméně když si uložím počet zadaných prvků tak:

#include <stdio.h>

int main()

{
    float pole[100];
   int i=0;
   int pocet=0;
   float x;
   int n=0;
   float max;
    printf("Zadavej kladna cisla, zadavani ukoncis nulou\n");
   while(x!=0)  {
                scanf("%f",&x);
           pole[i]=x;
   if (x>0)     {pocet=pocet+1;}

 }
                printf("Pocet zadanych prvku je:%i\n",pocet);

         max=pole[i];
                for(i=0; i<pocet;i++){                                     /*TADY ZKRÁTKA NEVÍM JAK MÁM NAPSAT ABY POROVNAL PRVEK i s prvkem i+1*/
                                                                                                                                        /*Zkoušel jsem na začátku deklarovat max=0 a pak v cyklu for porovnat každé x, ale házelo to maximum=0*/
                        if(pole[i+1]>max) {max=pole[i+1];}      else{ max=pole[i];}

                                if(pole[i]>=(max/2)){n=n+1;}  else{ n=n+0;}
                }

                        printf("Maximum je:%f\n",max);
                                printf("Pocet cisel vetsich nez polovina z maximum je:%d\n",n);
    return (0);
}
 
Nahoru Odpovědět 20.10.2013 13:06
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Honza
TomBen:

Proč tam máš ty else?
Když je prvek pole menší než maximum, stává se novým maximem.
Když ne, tak přece nic neděláš a platí původní maximum.
Stejně tak, když se zvyšuje počitadlo vyšších prvků.
Když použiješ cyklus for, zadej hodnoty rovnou tak,
abys nemusel dávat plus ke každému prvku.
Rovnej závorky tak, aby bylo hned zjevné,
kde končí blok kódu.

Editováno 20.10.2013 13:47
Nahoru Odpovědět 20.10.2013 13:46
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na
Jan Vargovský:

Máš maximum. To by měl být prvek, který by sis měl nastavit jako první index z pole. A pak jen iteruješ to pole prvek po prvku a porovnáváš aktuální prvek s tím maximem, žádné i+1 tam není.

 
Nahoru Odpovědět  +1 20.10.2013 13:55
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Jan Vargovský
Honza:

No tak si přiřadím že

max=pole[0];

tedy maximum je první prvek který sem zadal do pole. A pak mi to projíždí a porovnává s každým dalším prvkem:

for(i=0; i<pocet;i++){
if(pole[i]>max) {max=pole[i];}
                     }

Nemůžete mi ten kousíček kódu někdo napsat, místo toho aby jste psali jak to mám napsat?? Byl bych vděčný..

 
Nahoru Odpovědět 20.10.2013 14:16
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Honza
TomBen:

Každý ti může napsat ten kód klidně celý,
ale myslím, že jsi tak blízko porozumění,
že je škoda, abys to vzdal.

Zkus si třeba nechat vypsat prvky pole..

Nahoru Odpovědět  +2 20.10.2013 14:23
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na TomBen
Honza:

V tom je zakopaný pes, jak jsem již uvedl, studuji strojírenství, tedy mojí hlavní prioritou není programování jako takové, a bohužel jsem s tímto zabil už velmi mnoho času (opravdu jsem sem nezačal psát po hodině strávené nad touto zajisté banalitou..) Třemi slovy, nevidím to tam. Nechci napsat celý kód, chci napsat jen to porovnání, když mi to někdo napíše, projdu si to a zjistím proč je to takhle a proč to není tak jak jsem to dělal já.

vypsat prvky pole

printf("Prvky pole:%f\n",pole[i]);

nevypisuje.. :(

 
Nahoru Odpovědět 20.10.2013 14:42
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Honza
TomBen:

Taky nejsem čistokrevný ajťák, ale to že vás učí alespoň základy programování má svůj smysl.

Psal jsem ti to proto, že nezvyšuješ i v cyklu while.
Proto v poli nemáš ty prvky, které si myslíš, že pak porovnáváš.

Nahoru Odpovědět 20.10.2013 14:51
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Non-IT by měli učit vyšší jazyky, například Python nebo Matlab, které si s úlohami pro strojírenství poradí mnohem lépe než C nebo C++. Je velká škoda, že vyučující takto plýtvají časem. I Fortran by byl pro vás mnohem užitečnější než C.

Nahoru Odpovědět  +1 20.10.2013 14:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na TomBen
Honza:

O tom nepochybuji, ale mnohem radši bych měl programování kdybych to dělal dobrovolně a nebralo mi to tolik potřebný čas na jiné ryze strojařské předměty :))

Nojo, já to měl v cyklu while, ale "Luckin" psal, že mi to pak zjišťuje maximum po zadání každého prvku a ne po všech, jestli máš teda namysli posunutí složené závorky které uzavírá while.. (koukni se na můj první zdroják kde jsem uzavíral while..)

Jsou to výmluvy já vím. Mockrát děkuji a přeji pěkný zbytek dne :)

(už to běží ja má)

 
Nahoru Odpovědět 20.10.2013 15:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Pokud chceš mít své zdrojáky hezčí a přehlednější, vyzkoušej program indent. Zalomí a odsadí zdroják v C/C++ podle zvyklostí a dá se velmi dobře přizpůsobit. Může ti to pomoct najít chybu.

Nahoru Odpovědět 20.10.2013 15:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza
Neregistrovaný
Avatar
Honza:

Ahoj, to jsem zase já, potřeboval bych prosím poradit s tímto příkladem, pokud se někdo uvolí s čase :)

Otázka z ní jestli je možné při takto definovaných 3 samostatných polích, řešit daný vzorec. Zkrátka jestli mám šanci při takovéto definici, mu ve vzorci ukázat na libovolný bod aby počítal se všemi.

/*Napiště funkci, která spočítá délku lomenné čáry ve 3D. Počet bodů a body zadávejte z klávesnice*/
/*vzorec je d=sqrt(  (xB-xA)^2+(yB-yA)^2+(zA-zB)^2 )

pro 4 body ve 3D
x y z
0 0 0
1 0 0
1 1 0
1 1 1
=> d=3
*/
#include <stdio.h>
#include <math.h>


int main(){
        /* souradnice bodu */
        float X[1000];          //souradnice X
        float Y[1000];          //souradnice Y
        float Z[1000];          //souradnice Z

        int n; /* pocet bodu*/
        int i,j,k;
        float delka;

        printf("Pocet bodu v prostoru:\n");
        scanf("%d",&n);

        for (i=1;i<=n;i++){

                /* cteni souradnic */

                printf("Zadejte souradnice bodu postupne za sebou:\n");
                        scanf("%f",&X[i]);
                        scanf("%f",&Y[i]);
                        scanf("%f",&Z[i]);
        }

        printf("Bod 2:\n%f\n%f\n%f\n",X[2],Y[2],Z[2]);   //vypsání pouze pro kotrolu zda-li program správně zapisuje


        delka =0;
        for (i=0;i<n;i++){
             delka=delka+ sqrt( pow(X[i+2]-X[i+1],2) + pow(Y[i+2]-Y[i+1],2) + pow(Z[i+1]-Z[i+2],2) );
                                         }
                printf("vzdalenost je %f\n", delka);
        return(0);
}
 
Nahoru Odpovědět 8.11.2013 9:35
Avatar
Panda38
Redaktor
Avatar
Odpovídá na Honza
Panda38:

Sice jo, mně připadá ok, ale upozorňuji Tě že počítáš jednu délku navíc (mimo rozsah).

 
Nahoru Odpovědět  +1 8.11.2013 10:54
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Panda38
Honza:

Však zápis

i=0;i<n;i++

je ekvivalentní zápisu

i=1;i<=n;i++

, v tom si myslím chyba není. Chyba bude v tom vzorci, já si myslím že mu špatně ukazuje na který prvek z toho pole má sáhnout a udělat s ním to co potřebuji, nevíš jak na to? Nebo ten se ti zdá být v pořádku?

 
Nahoru Odpovědět 8.11.2013 13:26
Avatar
Kit
Redaktor
Avatar
Odpovídá na Honza
Kit:

Není ekvivalentní.

Nahoru Odpovědět 8.11.2013 13:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Kit
Honza:

Jasný už to tam vidím, už to jde, díky chlapi:)

 
Nahoru Odpovědět 8.11.2013 14:21
Avatar
nemehlo
Člen
Avatar
nemehlo:

Ahoj. Mám stejný problém jako kolega s příkladem uplně nahoře. Rozdíl je hlavně ten že kolega alespoň trochu tuší, já vůbec. Sedím nad tím už asi 5 hodin a nedostal jsem se k žádnému výsledku, dokonce ani upravováním podle této diskuze. Kdyby byl někdo tak moc hodný a konečný správný zdroják by sem napsal, byla by to moje záchrana. Předem děkuji za jakoukoliv ochotu

 
Nahoru Odpovědět 18.10.2014 2:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.