proste pytanie z programowania w c

kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

proste pytanie z programowania w c

Post autor: kawafis44 »

mam pewne zadanie i nie wiem, jak zrobic, zeby potrafil ze standardowego wejscia pobrac cos takiego jak 120*2 i zinterpretował jako 240, a potem 240 zapisał do zmiennej.

to mój dotychczasowy kod:
#include
#include
#include

int main()
{
//wpisuje sie cene w groszach i potwierdza enterem
//jezeli sie cos kupuje w ilosci kilku to podaje sie gwiazdke
//konczy sie cena zero
//podaje sume w zlotych i groszach
int cena; //w groszach
int suma = 0;
while (cena!=0)
{
scanf("%d",&cena);
//printf("(%d)",cena);
suma=suma+cena;
}
printf("Suma ta wyniosla: %d",suma);

system("PAUSE");
return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

proste pytanie z programowania w c

Post autor: soku11 »

Proponuje takie cos:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
    int cena=1,ile=1,suma=0;
    
    while(cena)
    {
        cena=1;ile=1;
        printf("Cena (w gr): ");
        scanf("%d*%d",&cena,&ile);
        suma+=cena*ile;
    }
    
    printf("
Suma wynosi: %d gr",suma);
    getch();
    return 0;   
}

POZDRO
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

proste pytanie z programowania w c

Post autor: Undre »

jezeli w ogole chcesz interpretowac wieksze wyrazenia arytmetyczne, zastosuj ONP
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

proste pytanie z programowania w c

Post autor: kawafis44 »

dzięki wielkie, Soku, najprostsze rozwiązania są jak widać zawsze najlepsze . ktoś mi proponował użycie jakichś parserów matematycznych (?) do rozwiązania tego zadania.

mam jeszcze problem z zamianą groszy na złotówki:

#include
#include

int main()
{
int suma=0,kwota=1,sztuk;
while (kwota!=0)
{
sztuk=1;
scanf("%d*%d",&kwota,&sztuk);
suma=suma+(kwota*sztuk);
}
printf("Kwota %d zl",suma/100); //problemem jest slash 100 i typ zmiennej
system("PAUSE");
return 0;
}

pozdrawiam!

[ Dodano: 17 Listopada 2007, 13:05 ]
co to jest ONP?
wpadłem jeszcze na drugi pomysł rozwiazania tego problem - zinterpretować ciąg znaków, czyli np. dla 125*65 zrobić funkcję, która zamienia znaki cyfr na liczbę - w jaki sposób to zrobić?
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

proste pytanie z programowania w c

Post autor: Undre »

ONP - odwrotna notacja polska. Generalnie chodzi o analizowanie zapisu matematycznego od lewej i konsekwentne odkładanie symboli na stos, dzięki czemu łatwo jest całe wyrażenie ostatecznie policzyć. ONP świetnie załatwia problem kolejności wykonywania działań. Więcej info znajdziesz na google.

[ Dodano: 17 Listopada 2007, 13:15 ]
kawafis44 pisze:wpadłem jeszcze na drugi pomysł rozwiazania tego problem - zinterpretować ciąg znaków, czyli np. dla 125*65 zrobić funkcję, która zamienia znaki cyfr na liczbę - w jaki sposób to zrobić?
samą zamianę cyfr na liczbę łatwo zrobić wykorzystując isdigit ( ) - można by np korzystając z funkcji operujących na łańcuchach skleić ileś kolejnych char-ów w łańcuch następnie konwertowany na typ liczbowy, aczkolwiek podejrzewam, że takie kombinowanie i tak jest żmudniejsze od ONP, poza tym ciężej to imo zrobić w C niż w C++
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

proste pytanie z programowania w c

Post autor: kawafis44 »

wiem, ze jest to żmudne, ale przećwiczę sobie parę funkcji
1. wczytuję np. 20*2 jako string "20*2" - jak to wczytać, czy jako:
char str[15];
scanf("%s",str[]) ?
2. szukam, w którym polu jest gwiazdka
int nrpola;
nie wiem co dalej zrobić
3. zamieniam pierwszą część stringa na liczbę
int liczba1,liczba2;
// str[0...nrpola-1] - jak zaznaczyć "część" stringa, skoro to jest tablica?
liczba1 = atoi(str[0...nrpola-1]
4. tak samo z drugą liczbą
5. dalej jest już łatwo
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

proste pytanie z programowania w c

Post autor: Undre »

Opcji jest imo wiele, zależy na które konsekwencje której opcji chcesz przystać.
Możesz całe wejście dać od razu do tablicy, ale będziesz musiał babrać się potem na tej tablicy - sam już wyczuwasz problem wykrojenia podłańcucha reprezentującego liczbę z całości. Możesz równie dobrze lecieć znak po znaku, co z kolei oznacza babranie się ze zczytywaniem liczb - np pobieram znak, sprawdzam czy isdigit daje true, jeżeli tak, to mogę to np zczytywać do jakiejś tablicy aż do napotkania symbolu o isdigit=false. Może nawet do tablicy dwuwymiarowej, gdzie na każdą liczbę przypadać będzie wiersz. W sumie analogicznie można też analizować całość po zczytaniu jej do tablicy tak jak chcesz, chociaż nie wiem po co - jak już zczytasz co chcesz, ta tablica i tak ci po nic.
Znowuż pytanie, na które ciężko odpowiedzieć - ok, męczyłem się bóg wie ile czasu, wyciągnąłem podłańcuchy reprezentujące liczby z łańcucha głównego - jak teraz zorientować się co z czym wymnożyć ? Jeżeli program przyjmuje tylko i wyłącznie zapis typu a*b*c*...*z gdzie na każdą literę przypada dowolnej długości liczba, to wystarczy podłańcuchy wymnożyć - sytuacja bezproblemowa .... aczklowiek jeśli jednak można by też dodawać liczby, musiałbyś dodatkowo pilnować kolejności działań - cmentarz.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

proste pytanie z programowania w c

Post autor: soku11 »

Stworzylem przykladowy kod dla wczytania pojedynczego 'zakupu':

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#define n 50

int main()
{
    char ciag[n],kwota[n],sztuk[n];
    int stan=1,aktualny=0;
    int aktualny_s=0,aktualny_k=0;
    int l_kwota,l_sztuk;
    
    memset(ciag,0,n);
    memset(kwota,0,n);
    memset(sztuk,0,n);
    
    fgets(ciag,n,stdin);
    
    l_kwota=1;l_sztuk=1;
    while(stan!=0 && stan!=-1)
    {
        if( ciag[aktualny]>='0' && ciag[aktualny]<='9' )
        {
            if(stan==1)
            {
                kwota[aktualny_k]=ciag[aktualny];
                aktualny_k++;
            } else
            if(stan==2)
            {
                sztuk[aktualny_s]=ciag[aktualny];
                aktualny_s++;
            }
        } else
        if( ciag[aktualny]=='*')
         stan=2;
        else 
        if( ciag[aktualny]==10) 
         stan=0;
        else stan=-1;
        
        aktualny++;
    }
    
    if(stan==-1)
    {
        printf("zle dane!");
        getch();
        return 0;
    } else
    if(stan==0)
    {
        l_kwota=atoi(kwota);
        l_sztuk=atoi(sztuk);
        printf("\nCiag:%s\nKwota:%d,Sztuk:%d\nIloczyn:%d\n",ciag,l_kwota,l_sztuk,l_kwota*l_sztuk);
    }
    
    getch();
    return 0;
}
Jak widac troche roboty jest :/ Jednak warto zauwazyc, ze wprowadzenie liczby zmiennoprzecinkowej juz bardziej gmatwa sprawe. Aby ten kod i dzialal nalezy jeszcze wprowadzic petelke :) POZDRO
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

proste pytanie z programowania w c

Post autor: kawafis44 »

memset(ciag,0,n); line 12, message: implicit declaration of function 'int memset(...)'
getch(); line 47, message: implicit declaration of function 'int getch(...)'
co to są za funkcje memset i fgets?
reszte kodu przeanalizowalem i mysle, ze zrozumialem :), dzieki!

ps. jak zrobić tę zamianę groszy na złotówki w moim poprzednim kodzie?
pozdrawiam!
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

proste pytanie z programowania w c

Post autor: soku11 »

Rzeczywscie. Do memset potrzebny jest naglowek:

Kod: Zaznacz cały

#include <string.h>
A getch to zapewne

Kod: Zaznacz cały

#include <conio.h>
Ale zamiast niego mozesz uzyc

Kod: Zaznacz cały

system("pause");
jak dzialasz pod windowsem. POZDRO
kawafis44
Użytkownik
Użytkownik
Posty: 474
Rejestracja: 22 paź 2007, o 20:55
Płeć: Mężczyzna
Lokalizacja: Gliwice
Podziękował: 416 razy
Pomógł: 2 razy

proste pytanie z programowania w c

Post autor: kawafis44 »

teraz dzięki, działa .

jak zrobić tę zamianę groszy na złotówki w moim poprzednim kodzie?

pozdrawiam
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

proste pytanie z programowania w c

Post autor: soku11 »

Program do zamiany groszy na zlote:

Kod: Zaznacz cały

#include <stdio.h>



int main()
{
    int gr;
    
    printf("Podaj grosze: ");
    scanf("%d", &gr);
    
    printf("
%d groszy, to: %.2f zlotych.
",gr,(float)gr/100);
    
    getch();
    return 0;
}
POZDRO
ODPOWIEDZ