Diskuze: Jednorozměrné pole -zdroják
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 25 zpráv z 25.
//= 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.
(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);
}
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.
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?
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.
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
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ší
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ší.
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);
}
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.
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í.
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ý..
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..
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..
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áš.
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.
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á)
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.
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);
}
Sice jo, mně připadá ok, ale upozorňuji Tě že počítáš jednu délku navíc (mimo rozsah).
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?
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
Zobrazeno 25 zpráv z 25.