Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Wczytywanie wartości wielu zmiennych - scanf();

deveaux 08 Gru 2010 22:17 4604 9
  • #1 08 Gru 2010 22:17
    deveaux
    Poziom 8  

    Mam problem z napisaniem kodu tak aby wczytywał dane np:

    a/b + c/d ------------ gdzie a,b,c,d są typu integer

    albo

    Imie: Roman; Nazwisko: Kowalski6; Data ur.: 1900-01-30 ------- gdzie Imie:, Nazwisko:, itd występują zawsze

    0 9
  • #2 08 Gru 2010 22:54
    sevare
    Poziom 13  

    Code:
    scanf("%d%c%d%c%d%c%d", a, znak1, b, znak2, c, znak3, d);


    Powinno zadzialac dla zdania tego formatu(dawno tego nie uzywalem). Jesli chodzi o dane osobowe to sprecyzuj pytanie, jak ma wczytywac - jako dokladnie taki ciag? Imie:...?

    0
  • #3 08 Gru 2010 23:30
    deveaux
    Poziom 8  

    Zestawy danych wyglądają zawsze w ten sposób:

    Imie: jakiesimie; Nazwisko: jakiesnazwisko; itd jakiesimie i jakiesnazwisko itd to zmienne, które muszę wczytać.

    Czyli muszę wczytać to co jest po spacji aż do średnika


    A jak wpisuję

    Code:

    while(scanf("%d%c%d %c %d%c%d",a,znak,b,operacja,c,znak1,d)==7)

    To po wpisaniu danych zaraz mi błąd wyskakuje ;/

    0
  • #4 09 Gru 2010 01:24
    sevare
    Poziom 13  

    Wybacz ale to bedzie wredne... Masz jakiekolwiek pojecie o programowaniu? Chcialbym uslyszec tak i maly dowod na to a jutro odpowiedz bardzo szybko przyjdzie nawet sama...

    funkcja scanf nie zwraca rzadnej wartosci wiec nie mozesz napisac petli w ktorej przyrownasz wartosc funkcji do stalej... ten ciag powinien zadzialac dla twojego rownania a/b+c/d wystarczy spojrzec na formatowanie. Proponuje zaczac od jakiegos kursu C w internecie albo ksiazki ANSII C bo gotowca ode mnie nie dostaniesz

    0
  • Pomocny post
    #5 09 Gru 2010 07:15
    Terminator
    Poziom 23  

    sevare to chyba Ty nie umiesz programować !
    Po pierwsze scanf zwraca wartość

    Cytat:
    Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.

    Po drugie
    Code:
    scanf("%d%c%d%c%d%c%d", a, znak1, b, znak2, c, znak3, d);
    to może podaj deklaracje zmiennych po powinny w tym przypadku wskaźnikami.
    Code:
    int a,b,c,d;
    
    char znak1,znak2,znak3;
    scanf("%d%c%d%c%d%c%d", &a, &znak1, &b, &znak2, &c, &znak3, &d);

    Do scanf podajemy w takim przypadku adresy zmiennych !
    Dlatego wpisanie bez & powoduje właśnie błąd po wykonaniu
    Code:
    scanf("%d%c%d%c%d%c%d", a, znak1, b, znak2, c, znak3, d);


    deveaux teraz sprawdzasz warunkami czy znak1...znak3 są takie jakie potrzebujesz : " / * - + " i wykonujesz jakie chcesz działania matematyczne

    0
  • #6 09 Gru 2010 10:31
    sevare
    Poziom 13  

    I znowu sie zaczyna... Oczywista rzecza jest ze zadeklarowac zmienne trzeba, ze ampersanty musza byc... Podalem koncepcje na rozwiazanie problemu a nie pelny algorytm... specjalnie nazwalem zmienne tak by dawaly do zrozumienia do ktorego problemu sie odwoluje...

    Code:
    while(scanf("%d%c%d %c %d%c%d",a,znak,b,operacja,c,znak1,d)==7) 

    Tu problemem nie tylko problemem jest brak ampersantow ale bledy wszystkiego... Ok scanf zwraca wartosc tylko w 1 przypadku i zawsze te sama ktora tutaj nie ma wiekszego sensu jej zastosowanie. Nie jestem zwolennikiem pisania gotowcow, a tymbardziej dajac komus wszystko wylozone na talerzu niczego go to nie nauczy... To jest programowanie poczatkujacych a zadania tej pani sa na poziomie 1. roku akademickiego, wiec jako takie chociaz najmniejsze podstawy programowania powinna juz miec

    0
  • #7 09 Gru 2010 10:40
    several
    Poziom 15  

    sevare napisał:
    Podalem koncepcje na rozwiazanie problemu a nie pelny algorytm

    Och jaka ulga, bo już zdawało mi się że napisałeś:

    sevare napisał:

    Powinno zadzialac dla zdania tego formatu

    0
  • #8 09 Gru 2010 12:08
    sevare
    Poziom 13  

    Zle dobralem slowa wybaczcie za niedokladnie sformulowana tresc postu.

    Owszem kod podany przez Terminatora bedzie dzialal dla przykladu z rownaniem, dla drugiego juz nie, ale zaleznie od tresci zadania wystarczy zastosowac wczytywanie w petli po ilosci zmiennych do odczytu lub poprostu zadeklarowac wejscie na sztywno

    0
  • #9 09 Gru 2010 12:16
    deveaux
    Poziom 8  

    Teraz gdzieś mam błąd tylko nie wiem gdzie, bo niezależnie od tego czy wpiszę '+' czy '-' za każdym razem wykonuje dodawanie (case '+'). Jeśli ktoś go widzi proszę o podpowiedź.

    Code:

    #include <stdio.h>
    #include <string.h>

    int main()
    {
        int a,b,c,d,i,tmp,mian;
        char znak,znak1;
        char operacja[3];
        while(scanf("%d%c%d %s %d%c%d",&a,&znak,&b,operacja,&c,&znak1,&d)==7)
        {
            switch(operacja[0])
            {
                case '+': if (b==d)
                          {
                              tmp=a+c;
                              printf("%d/%d\n",tmp,b);
                          }
                          else if (b!=d)
                          {
                              mian=b*d;
                              a=a*d;
                              c=c*b;
                              tmp=a+c;
                             
                              for(i=mian;i>1;i--)
                              {
                                  if ((mian%i==0) && (tmp%i==0))
                                  {
                                  mian /= i;
                                  tmp /= i;
                                  break;
                                  }
                              }




                              printf("%d/%d\n",tmp,mian);
                          }
                break;

                case '-': if (b==d)
                          {
                              tmp=a+c;
                              printf("%d/%d\n",tmp,b);
                          }
                          else if (b!=d)
                          {
                              mian=b*d;
                              a=a*d;
                              c=c*b;
                              tmp=a+c;
                             
                              for(i=mian;i>1;i--)
                              {
                                  if ((mian%i==0) && (tmp%i==0))
                                  {
                                  mian /= i;
                                  tmp /= i;
                                  break;
                                  }
                              }
                              printf("%d/%d\n",tmp,mian);
                          }
                break;
            }
        }
        return 0;
    }

    0
  • Pomocny post
    #10 09 Gru 2010 12:37
    sevare
    Poziom 13  

    Zawsze pod wartosc tmp zapisujesz sume a+c, w wypadku odejmowania powinna byc roznica... 2 rownania w "case -" do zmiany i koniec

    0