Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Honza
Neregistrovaný
Avatar
Honza:20.10.2013 9:22

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:20.10.2013 9:32

(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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na
Lukáš Hruda:20.10.2013 10:39

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
Honza:20.10.2013 11:12

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
Tvůrce
Avatar
Odpovídá na
Honza Bittner:20.10.2013 11:27

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

Nahoru Odpovědět
20.10.2013 11:27
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na
Lukáš Hruda:20.10.2013 11:34

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
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
TomBen:20.10.2013 11:56

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
Odpovídá na Lukáš Hruda
Neaktivní uživatel:20.10.2013 11:57

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
Neaktivní uživatelský účet
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Lukáš Hruda:20.10.2013 12:21

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
:20.10.2013 13:06

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
Tvůrce
Avatar
Odpovídá na
TomBen:20.10.2013 13:46

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ý
Tvůrce
Avatar
Odpovídá na
Jan Vargovský:20.10.2013 13:55

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
20.10.2013 13:55
Avatar
Honza
Neregistrovaný
Avatar
Odpovídá na Jan Vargovský
Honza:20.10.2013 14:16

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
Tvůrce
Avatar
Odpovídá na
TomBen:20.10.2013 14:23

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
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:20.10.2013 14:42

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
Tvůrce
Avatar
Odpovídá na
TomBen:20.10.2013 14:51

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
Tvůrce
Avatar
Odpovídá na
Kit:20.10.2013 14:59

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
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:20.10.2013 15:30

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
Tvůrce
Avatar
Odpovídá na
Kit:20.10.2013 15:39

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:8.11.2013 9:35

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
Tvůrce
Avatar
Odpovídá na
Panda38:8.11.2013 10:54

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

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

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
Tvůrce
Avatar
Odpovídá na
Kit:8.11.2013 13:30

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:8.11.2013 14:21

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:18.10.2014 2:26

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.