[ Aleksandar Gajic @ 08.04.2008. 15:13 ] @
Dobio sam u skoli neki malo "komplikovaniji" zadatak, odnosno veoma je jednostavan, samo sto ima 15-ak kombinacija, a njegova svrha je da izracuna impedansu otpornika, kalema i kondenzatora u bilo kakvoj vezi, u zavisnosti od toga sta korisnik odabere. Ima dosta "if"ova, a nisam koristio swich-case zasto sto to jos uvek nismo radili zvanicno u skoli.
Evo u cemu je problem:
Program startuje normalno, i sve tece normalno do prvog if-a. Kada skeniram da li se koristi otpornik kalem i kondenzator i odgovorim na postavljena pitanja sa "DA" ili "NE", umesto da u skladu sa odgovorima program nastavi da vrsi predvidjene operacije, on odlazi na kraj i ispisuje da je impedansa 0.00000 i zatvara se.
Mozete li mi skrenuti paznju gde je greska i kako da je ispravim?

Mala napomena: Program nije potpuno zavrsen, ali problem ne bi trebalo da se javlja. Napisane su formule samo za par slucajeva, ali problem nastaje jos ranije, tako da ga nisam zavrsavao...

Kompajler je Turbo C


A evo i programa:
Code:

#include <stdio.h>
#include <math.h>
main()
{
    /*Deklaracija*/
    float r,l,c,z;
    char ur[5], ul[5], uc[5], rp;
    int test;
    /*Unosenje otpornosti, induktivnosti i kapacitivnosti*/
    printf ("\nUnesite otpornost otpornika. Ukoliko otpornik nije potreban unesite samo nulu:");
        scanf ("%f", &r);
    printf ("Unesite induktivnost kalema Ukoliko kalem nije potreban unesite samo nulu:");
        scanf ("%f", &l);
    printf ("Unesite kapacitivnost kondenzatora Ukoliko kondenzator nije potreban unesite samo nulu:");
        scanf ("%f", &c);
    
    /*Upitnik za izbor elemenata*/
    /*Otpornik*/
    printf ("Da li ce u zadatku biti koriscen otpornik? \n (Odgovorite sa DA ili NE, velikim slovima!)");
        scanf ("%s", &ur);
    /*Kalem*/
    printf ("Da li ce u zadatku biti koriscen kalem? \n (Odgovorite sa DA ili NE, velikim slovima!");
        scanf ("%s", &ul);
    /*Kondenzator*/
    printf ("Da li ce u zadatku biti koriscen kondenzator? \n (Odgovorite sa DA ili NE, velikim slovima!");
        scanf ("%s", &uc);

    /*Testiranje unetih odgovora iz upitnika*/
        /*Ako su za zadatak potrebni i otpornik i kalem i kondenzator, ispitujemo sve moguce kombinacije veza za sva 3 elementa*/
        if (ul=="DA" && ur=="DA" && uc=="DA")
        {
            printf ("Ako su otpornik, kalem i kondenzator redno vezani unesite '1'.");
            printf ("Ako su otpornik, kalem i kondenzator paralelno vezani unesite '2'.");
            printf ("Ako su paralelno vezani otpornik i kalem, povezani redno sa kondenzatorom unesite '3'.");
            printf ("Ako su redno vezani otpornik i kalem, povezani paralelno sa kondenzatorom unesite '4'.");
            printf ("Ako su paralelno vezani otpornik i kondenzator, povezani redno sa kalemom unesite '5'.");
            printf ("Ako su redno vezani otpornik i kondenzator, povezani paralelno sa kalemom unesite '6'.");
            printf ("Ako su paralelno vezani kalem i kondenzator, povezani redno sa otpornikom unesite '7'.");
            printf ("Ako su redno vezani kalem i kondenzator, povezani paralelno sa otpornikom unesite '8'.");
                scanf ("%i",&test);
                 if (test==1)
                     z=sqrt(pow(r,2)+pow((2*M_PI*100*l),2)+pow((1/(2*M_PI*100*c)),2));
                 if (test==2)
                     z=2;
                 if (test==3)
                     z=3;
                 if (test==4)
                     z=4;
                 if (test==5)
                     z=5;
                 if (test==6)
                     z=6;
                 if (test==7)
                     z=7;
                 if (test==8)
                     z=8;
        }
        /*Ako su nam za zadatak potrebni samo otpornik i kalem, ispitujemo da li je u pitanju redna ili paralelna veza*/
        if (ur=="DA" && ul=="DA" && uc=="NE")
        {
            printf ("Da li su otpornik i kalem vezani redno ili paralelno? \n (Unesite 'R' za rednu ili 'P' za paralelnu vezu, obavezno velikim slovima!)");
            scanf ("%c", &rp);
            if (rp=='R')
                /*Redna veza otpornika i kalema*/
                z=sqrt(r*r+(100*M_PI*l)*(100*M_PI*l));
            if (rp=='P')
                /*Paralelna veza otpornika i kalema*/
                z=r*100*M_PI*l/(r+100*M_PI*l);
        }
        if (ur=="DA" && ul=="NE" && uc=="DA")
        {
            printf ("Da li su otpornik i kondenzator vezani redno ili paralelno? \n (Unesite 'R' za rednu ili 'P' za paralelnu vezu, obavezno velikim slovima!)");
            scanf ("%c", &rp);
            if (rp=='R')
                /*Redna veza otpornika i kondenzatora*/
                z=sqrt(r*r+(1/pow((100*M_PI*c),2)));
            if (rp=='P')
                /*Paralelna veza otpornika i kondenzatora*/
                z=r*1/(100*M_PI*c)/(r+(1/(100*M_PI*c)));
        }
        if (ur=="NE" && ul=="DA" && uc=="DA")
        {
            printf ("Da li su kalem i kondenzator vezani redno ili paralelno? \n (Unesite 'R' za rednu ili 'P' za paralelnu vezu, obavezno velikim slovima!)");
            scanf ("%c", &rp);
            if (rp=='R')
                /*Redna veza kalema i kondenzatora*/
                z=1;
            if (rp=='P')
                /*Paralelna veza kalema i kondenzatora*/
                z=1;
        }
    printf ("Impedansa za unete podatke je: %f", z);
return 0;
}
[ X Files @ 08.04.2008. 15:24 ] @
Citat:

if (ul=="DA" && ur=="DA" && uc=="DA")

Ovo (na više mesta u tvom kodu) neće da radi ono što si očekivao.

Poređenje možeš da radiš recimo funkcijama strcmp(), strncmp(), strcmpi() ili strncmpi(). Pogledaj u Helpu tačan opis i sintaksu. Uglavnom, ova zadnja je case insensitive.

Dakle, treba otrpilike ovako:

#include <string.h>
// ...
if ( strncmpi( ul, "da", 2) && strncmpi( ur, "da", 2) && strncmpi( uc, "da", 2) )

[ Aleksandar Gajic @ 08.04.2008. 20:41 ] @
Steta sto nisam nasao sintaksu na srpskom, jer me je mrzelo da citam ona opsirna objasnjenja na engleskom, a nemam neku knjigu u kojoj bih mogao da pogledam to...
[ arandjel88 @ 10.05.2008. 18:14 ] @
pokusaj sa funkcijom int izbor(int) pa navedi sve slucajeve po brojevima i onda u zavisnosti od return iz izbora biraj odgovarajucu funkciju