Pogledaj cijelu verziju : pomoc c
pozdrav, moze li mi itko pomoci pa reci gdje je greska u ovom kodu:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int MAX=100,vel,i,j,k;
float A[MAX], B[MAX], C[MAX];
char op;
ponovno:
printf("Unesite velicinu polja:");
scanf("%d", &vel);
if(vel>0 && vel<=100){
for(i=1; i<=vel; i++){
printf("Unesi A[%d]:", i);
scanf("%f", &A[i]);
}
for(j=1; j<=vel; j++){
printf("Unesi B[%d]:", j);
scanf("%f", &B[j]);
}
printf("Unesite operaciju:"); //ovdje nastaje greska
scanf("%c", &op);
}
else{
goto ponovno;
}
for(k=1; k<=vel; k++){
if(op == '+'){
C[k]=A[k]+B[k];
}
else if(op == '/'){
C[k]=A[k]/B[k];
}
else if(op == '*'){
C[k]=A[k]*B[k];
}
else{
C[k]=A[k]-B[k];
}
printf("%.2f\n", C[k]);
}
return 0;
}
problem je sto mi ne dozvoljava da unesem operaciju koju zelim izvrsiti, nego odma pređe na daljnje izvrsavanje programa.
Hvala.
tekst zadatka:
Napisati program koji će izvršiti elementarnu operaciju nad dva polja decimalnih brojeva. Na početku
programa korisnik unosi veličinu polja (max 100) te elemente oba polja. Nakon unosa zahtijeva se
unos operacije koja može biti '+', '-', '*' i '/' te se izvrši ta operacija između svaka dva
odgovarajuća elementa. Rezultat se zapisuje u treće polje, koje se na kraju programa ispisuje.
Primjer interakcije:
Unesi broj elemenata: 3
Unesi A1: 2.1
Unesi A2: 0
Unesi A3: 7
Unesi B1: 1.5
Unesi B2: 2.2
Unesi B3: 3
Odaberi operaciju (+,-,*,/): +
3.6
2.2
cham3leon
05-04-2011, 18:23
To je poznati problem koji se dešava kod unosa charactera. Već sam i ja zaboravio što se točno dogodi, možda očita zadnje slovo iz printane rečenice ili nešto tako. Uglavnom, mislim da se ne bi smjelo dešavati ako ga očitaš sa getchar-om, ali najjednostavnije rješenje je da prvo tražiš operaciju pa onda brojeve. Ako baš mora ići tako ko u zadatku da se poslije brojeva unosi operacija, probaj sa getchar naredbom.
probao sam postavit i da mi operaciju ocita na pocetku, odma nakon unosa velicine polja, ali ista stvar samo preskoci na sljedeci korak programa, negdje sam izgleda sjebo ali ne vidim gdje XD
cham3leon
05-04-2011, 19:23
Ne, mislio sam da baš taj unos operacije bude prvi input koji se traži od usera.
I jel radiš u windows ili linux OS-u?
radim u windowsu u Code::Blocksu, ok pokusat cu
EDIT: evo radi sada kad sam stavio da bude prvi input, valjda je bila caka da pokupi neki char po putu =) hvala ti mnogo :) :thumbs2:
cham3leon
05-04-2011, 20:12
Znam da kad sam radio u windowsu da mi je trebala komanda system("pause") da bi program pričekao input. Možeš to probat ako ti ni ovo ne bude radilo.
ma kenja nesto ovaj Code::Blocks svako malo, skino sam sada Ubuntu image
Burek_fr0m_SPACE
06-04-2011, 04:00
Dio teksta (http://www.sendspace.com/file/jh27uy)Skoji sam pisao za svoje studente objašnjava tu pojavu i rješenje, možda će ti biti od pomoći.
Dio teksta (http://www.sendspace.com/file/jh27uy)Skoji sam pisao za svoje studente objašnjava tu pojavu i rješenje, možda će ti biti od pomoći.
svakako ce pomoci, hvala
ok imam novi problem s jednim zadatkom, pa ako netko ima vremena neka baci oko :
kod:#include <stdio.h>
#include <stdlib.h>
void unos(int *red, int *stupac, float *polje)
{
int x,y;
float matrica[*red][*stupac];
for(x=0; x<*red; x++){
for(y=0; y<*stupac; y++){
printf("Unesite element matrice [%d]:[%d]=\n", x,y);
scanf("%f", &matrica[x][y]);
}
}
for(x=0; x<*red; x++){
for(y=0; y<*stupac; y++){
polje[x]+=matrica[x][y];
}
}
}
void prosjek(float *polje,float *ar, int *stupac, int *red)
{
int x;
for(x=0; x<*red; x++){
ar[x]= polje[x]S/ *stupac;
}
for(x=0; x<*red; x++){
printf("%f", ar[x]);
}
}
void main(){
int red;
int stupac;
float polje[100];
float ar;
ponovno:
printf("Unesite broj redaka:");
scanf("%d", &red);
printf("Unesite broj stupaca:");
scanf("%d", &stupac);
if((red&&stupac)>0 && (red&&stupac)<100){
unos(&red, &stupac, &polje[100]);
}
else {
printf("Pogrešan unos, pokušajte ponovno!\n");
goto ponovno;
}
prosjek(&polje[100], &ar, &stupac, &red);
}
tekst zadatka:Napisati funkciju unos koja će popuniti zadanu realnu matricu.
Napisati funkciju sredina koja vraća aritmetičku sredinu zadanog 1D polja realnih brojeva.
Napisati program u kojemu korisnik unosi željenu veličinu matrice (napraviti provjeru ispravnosti
unesenih brojeva). Zatim se korištenjem funkcije unos upisuju svi elementi u matricu. Korištenjem
funkcije sredina se na koncu ispišu aritmetičke sredine svakog od redaka unesene matrice.
Problem nastaje kada se treba izvrsiti funkcija sredina.
Hvala.
void main(){
int red;
int stupac;
float polje[100];
float ar;
ponovno:
printf("Unesite broj redaka:");
scanf("%d", &red);
printf("Unesite broj stupaca:");
scanf("%d", &stupac);
if((red&&stupac)>0 && (red&&stupac)<100){
unos(&red, &stupac, &polje[100]);
}
else {
printf("Pogrešan unos, pokušajte ponovno!\n");
goto ponovno;
}
/************************/
prosjek(&polje[100], &ar, &stupac, &red);
/************************/
}
Prenosis u funkciju adresu iza zadnjeg elementa polja.
trebalo bi radit sa:
prosjek(polje, &ar, &stupac, &red);
ako te buni zasto ne pise & ispred polja moze se i klasicno
prosjek(&polje[0], &ar, &stupac, &red);
Moja preporuka je takodjer izbjegavaj goto jer cini kod jako necitkim, i malo smanji sa prijenosima pointera u funkcije (npr, nemoras slat adrese retka i stupca jer ih funkcija ionako ne mjenja)
Nadam se da sam bio od pomoci
Prenosis u funkciju adresu iza zadnjeg elementa polja.
trebalo bi radit sa:
prosjek(polje, &ar, &stupac, &red);
ako te buni zasto ne pise & ispred polja moze se i klasicno
prosjek(&polje[0], &ar, &stupac, &red);
Moja preporuka je takodjer izbjegavaj goto jer cini kod jako necitkim, i malo smanji sa prijenosima pointera u funkcije (npr, nemoras slat adrese retka i stupca jer ih funkcija ionako ne mjenja)
Nadam se da sam bio od pomoci
hvala ti, sada barem izbacuje neku vrijednost, ali ona nije tocna :P. Goto koristim jer mi je u takvim slucajevima jednostavniji nego petlja.
Ovo s prijenosima pointera te nisam razumio, jer se zeljeni broj redaka i stupaca unosi u funkciji main, a potreban mi je i u funkciji unos i prosjek, tako da ne razumijem kako smanjiti to?
Umjesto npr funkcije
void unos(int *red, int *stupac, float *polje)
Slozis funkciju:
void unos(int red, int stupac, float *polje)
Unutar funkcije nemoras pisati zvjezdice uz ime varijable, a kad joj predajes argumente (pozivas funkciju)
pises umjesto
unos(&red, &stupac, &polje[100]);
I sad skuzio i tu je greska,
unos(red, stupac, polje);
Edit: Eh, treba malo vise prostudirat kod, jos jedna greska: aritmeticku sredinu spremas kao polje no na pocetku maina ar nije deklariran kao polje nego samo
float ar
Stavis da je: float ar[neki_broj]
te onda u pozivu prenosis:
prosjek(polje, ar, &stupac, &red);
aha sad sam skontao, znaci samo promjenjive varijable pisem s *, thx. Kod jos uvijek ne radi, pokusat cu ga sada sredit.
Hvala ti za pomoc
Ok, sad sam provjerio kod sebe.
Imas gresku prilikom unosa (u funkciji unos).
for(x=0; x<*red; x++)
{
for(y=0; y<*stupac; y++)
{
polje[x]+=matrica[x][y];
}
}
u polje prenosis polje + matricu.
U mainu kada deklariras varijablu
float polje[100]Su njoj se nalaze neke vrijednosti koje su zatecene prilikom alociranja potrebne memorije za polje
trebao bi polje inicijalizirati na nulu
float polje[100]S= {0};
to ce stavit sve clanove polja na nulu pa ce ono gore zbrajanje u funkciji unos funkcionirati.
Sad sve daje tocno rjesenje, no potkrala ti se jedna cesta pogreska:
if uvjet ti ne radi.
Probaj unijeti red 100.
pise:
if ( (red&&stupac)>0 && (red&&stupac)<100 )
Naime u c-u ti je sve osim nule "true". Za primjer 100 bi se if izvrsio ovako
if ( ( 100 && stupac) > 0 && ( 100 && stupac) < 100 )
100 && stupac daju 1 ukoliko stupac nije 0, 1 je vece od nule i 1 je manje od 100 pa ce if proc iako si "tehnicki limitirao da redak mora biti manji od 100.
Probaj sa:
if ( red*stupac > 0 && red*stupac < 100 );
Moras uzet u obzir da je matrica dvodimenzionalna. Matrica sa retcima 100 i stupcima 100 je ekvivalnetna jednodim. polju od 100*100 = 10,000 elemenata sto prekoracuje tvoj limit.
BTW Ovo radis samouko ili u skoli ucite ovo gradivo?
ma ucimo to na faksu, ali sam tolko zaostao a sada moram sve nadoknadjivat :p jebiga, a previse informacija u kratkom vremenu nije dobro :), sad sam zapeo na tim funkcijama, moram jos nizove,dinamicku alokaciju memorije, i rad s datotekama =) happy times.
Ajme :D
Koj je to fax?
Se mislis inace bavit programiranjem ili to samo da kolegij izduras?
Ono, pitam da znam s kolko informacija da te zatrpavam.
cham3leon
09-04-2011, 19:11
Inače, * se koristi kod pointera (pokazivača), dakle ako varijabla sadrži adresu druge varijable, pa da očita vrijednost sa adrese sadržane u prvoj varijabli.
ma samo za prolaz kolegija, elektrotehnika je u pitanju. Dosta mi programiranja nakon ova 2 mjeseca za narednih par godina :P
cham3leon
09-04-2011, 19:14
Tehnički fax u Rijeci? Znam da tu elektrotehničari imaju programiranje u 3. bloku. Ako ti treba neke kompliciranije stvari, nastavit ću sa tutorialom koji je negdje u Programiranju i izradi igara.
da, s tutorialom svakako nastavi za buduce generacije ''programera'', ali ja imam jos par dana da pokusam pohvatat nesto informacija pa da uspijem rijesit dva zad na kolokviju, te se izborit za popravni kolokvij iz prvog dijela gradiva koje sam sada dosta dobro savladao :P
blokovi :-x , tko ih izmisli :rotfl: :pray:
Pointere najlakse skuzis tak da slozis dve funkcije, jedna koja ima pointer kao argument a druga koja nema pa ispises rezultat nakon svake
Nesto tipa:
void prva( int x)
{
x += 2;
printf("\n%d ", x);
}
void druga( int *x)
{
*x += 2;
printf("\n%d ", *x);
}
int main()
{
int x = 4;
printf("%d", x);
prva(x);
printf("%d", x);
druga(&x);
printf("%d", x);
return 0;
}
Ako te jos kaj muci, samo pitaj.
Burek_fr0m_SPACE
10-04-2011, 12:11
Pointere najlakse skuzis tak da slozis dve funkcije
<preserans> Ili još bolje - kada skužiš zašto je u C-u a[b]Sisto što i b[a]S:D </preserans>
vBulletin v4.2.5, Copyright ©2000-2024, Jelsoft Enterprises Ltd.