PDA

Pogledaj cijelu verziju : pomoc c



Gu$ht3r
05-04-2011, 17:54
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 == &#39;+&#39;){
C[k]=A[k]+B[k];
}
else if(op == &#39;/&#39;){
C[k]=A[k]/B[k];
}
else if(op == &#39;*&#39;){
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 &#39;+&#39;, &#39;-&#39;, &#39;*&#39; i &#39;/&#39; 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.

Gu$ht3r
05-04-2011, 18:45
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?

Gu$ht3r
05-04-2011, 20:08
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.

Gu$ht3r
05-04-2011, 20:17
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.

Gu$ht3r
06-04-2011, 18:56
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

Gu$ht3r
09-04-2011, 16:05
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.

Teon
09-04-2011, 18:15
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

Gu$ht3r
09-04-2011, 18:21
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?

Teon
09-04-2011, 18:24
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);

Gu$ht3r
09-04-2011, 18:34
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

Teon
09-04-2011, 18:55
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?

Gu$ht3r
09-04-2011, 19:05
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.

Teon
09-04-2011, 19:08
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.

Gu$ht3r
09-04-2011, 19:12
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.

Gu$ht3r
09-04-2011, 19:20
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:

Teon
09-04-2011, 19:23
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>