[C] Wydawanie reszty i wypisywanie wyniku

hana197
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 2 lis 2016, o 23:46
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 2 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: hana197 »

Witam! Jestem zupełną nowicjuszką, jeśli chodzi o programowanie (dopiero zaczynam) i - przynajmniej według mnie - zostałam rzucona na głęboką wodę Mam tutaj kilka zadań i nie do końca wiem, czy mój zamysł wobec ich rozwiązania jest dobry, niektóre elementy nie są do końca dla mnie jasne i nie wiem, jak się z nimi uporać. Będę wdzięczna za wszelkie wskazówki

Zadanie 1. dotyczy napisania programu, który wyświetli minimalną liczbę banknotów oraz monet, potrzebnych, aby wypłacić kwotę (typu float) podaną na klawiaturze:
Przykład:
702,74 = (3x 200 zł) + (1x 100 zł) + (1x 2 zł) + (1x 50gr) + (1x 20gr) + (2x 2gr)
Skorzystałam z funkcji if...else, jednak nie mam pomysłu, gdzie umieścić funkcję wyświetlania wyniku i jak ma wyglądać, żeby wynik wyświetlał się tak, jak w przykładzie, tj jako suma.

Zadanie 2. dotyczy napisania programu, który czyta z klawiatury liczbę i wyświetla jej wartość słownie, z poprawnością gramatyczną, tj 1 złoty, ale 20 złotych.
Myślę, że można użyć tu funkcji switch, jednak nie wiem, co napisać w case, żeby uzyskać wspomnianą poprawność gramatyczną (czyli dla 1 wstawiać słowo "złoty", dla liczby o cyfrze jednostek od 2 do 4 wstawiać "złote", a reszcie liczb "złotych"; konkretnie chodzi mi, jak to zapisać w kodzie).

Wolałabym nie używać tablic, o ile to możliwe.
Starałam się wytłumaczyć jak umiem, będę wdzięczna za odpowiedzi i pozdrawiam
Ostatnio zmieniony 3 lis 2016, o 10:51 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: kalwi »


Kod: Zaznacz cały

#include <stdio.h>
 
void funZL(float *, int);
void funGR(float *, int);
 
int main(void)
{
	float x;
	printf("Wprowadz liczbe: ");
	scanf("%f", &x);
	// tu nalezy sprawdzic, czy podana liczba jest prawidlowa
	printf("%.2fzl = ", x);
	funZL(&x, 200);
	funZL(&x, 100);
	funZL(&x, 50);
	funZL(&x, 20);
	funZL(&x, 10);
	funZL(&x, 5);
	funZL(&x, 2);
	funZL(&x, 1);
	x *= 100;
	funGR(&x, 50);
	funGR(&x, 20);
	funGR(&x, 10);
	funGR(&x, 5);
	funGR(&x, 2);
	funGR(&x, 1);
 
	return 0;
}
 
void funZL(float *x, int num)
{
	int mod;
	mod = (int)*x / num;
	if(mod)
		printf("%dx%dzl + ", mod, num);
	*x -= mod * num;
}
 
void funGR(float *x, int num)
{
	int mod;
	mod = (int)(*x) / num;
	if(mod)
		printf("%dx%dgr + ", mod, num);
	*x -= mod * num;
}
Wersja dużo brzydsza, ale i dużo prostsza

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
	float x;
	int mod;
	printf("Wprowadz liczbe: ");
	scanf("%f", &x);
	// tu nalezy sprawdzic, czy podana liczba jest prawidlowa
	printf("%.2fzl = ", x);

	mod = (int)x / 200;
	if(mod)
		printf("%dx%dzl + ", mod, 200);
	x -= mod * 200;

	mod = (int)x / 100;
	if(mod)
		printf("%dx%dzl + ", mod, 100);
	x -= mod * 100;	

	mod = (int)x / 50;
	if(mod)
		printf("%dx%dzl + ", mod, 50);
	x -= mod * 50;

	mod = (int)x / 20;
	if(mod)
		printf("%dx%dzl + ", mod, 20);
	x -= mod * 20;
	
	mod = (int)x / 10;
	if(mod)
		printf("%dx%dzl + ", mod, 10);
	x -= mod * 10;

	mod = (int)x / 5;
	if(mod)
		printf("%dx%dzl + ", mod, 5);
	x -= mod * 5;

	mod = (int)x / 2;
	if(mod)
		printf("%dx%dzl + ", mod, 2);
	x -= mod * 2;

	mod = (int)x / 1;
	if(mod)
		printf("%dx%dzl + ", mod, 1);
	x -= mod * 1;

	x *= 100;

	mod = (int)x / 50;
	if(mod)
		printf("%dx%dgr + ", mod, 50);
	x -= mod * 50;

	mod = (int)x / 20;
	if(mod)
		printf("%dx%dgr + ", mod, 20);
	x -= mod * 20;

	mod = (int)x / 10;
	if(mod)
		printf("%dx%dgr + ", mod, 10);
	x -= mod * 10;

	mod = (int)x / 5;
	if(mod)
		printf("%dx%dgr + ", mod, 5);
	x -= mod * 5;

	mod = (int)x / 2;
	if(mod)
		printf("%dx%dgr + ", mod, 2);
	x -= mod * 2;

	mod = (int)x / 1;
	if(mod)
		printf("%dx%dgr + ", mod, 1);
	x -= mod * 1;

	return 0;
}
Wersja trudniejsza, ale najlepsza

Kod: Zaznacz cały

#include <stdio.h>

void funZL(float *, int);
void funGR(float *, int);

int main(void)
{
	unsigned int tab_ZL[]={200,100,50,20,10,5,2,1};
	unsigned int tab_GR[]={50,20,10,5,2,1};
	float x;

	printf("Wprowadz liczbe: ");
	scanf("%f", &x);

	printf("%.2fzl = ", x);
	for(size_t i = 0; i < 8; ++i)
		funZL(&x, tab_ZL[i]);
	x *= 100;
	for(size_t i = 0; i < 6; ++i)
		funGR(&x, tab_GR[i]);

	return 0;
}

void funZL(float *x, int num)
{
	int mod;
	mod = (int)*x / num;
	if(mod)
		printf("%dx%dzl + ", mod, num);
	*x -= mod * num;
}

void funGR(float *x, int num)
{
	int mod;
	mod = (int)(*x) / num;
	if(mod)
		printf("%dx%dgr + ", mod, num);
	*x -= mod * num;
}
hana197 pisze: Skorzystałam z funkcji if...else
if...else to nie jest funkcja

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
	unsigned int liczba;
	unsigned int liczba_cyfr;
	printf("Podaj liczbe: ");
	scanf("%u", &liczba);
	switch(liczba)
	{
		case 1:
			printf("%d zloty", liczba);
			break;
		case 2:
			printf("%d zlote", liczba);
			break;
		case 3:
			printf("%d zlote", liczba);
			break;
		case 4:
			printf("%d zlote", liczba);
			break;
		default:
			printf("%d zlotych", liczba);
			break;
	}
	return 0;
}
hana197
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 2 lis 2016, o 23:46
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 2 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: hana197 »

Bardzo dziękuję za odpowiedź i poświęcony czas oraz przepraszam za błąd.

Jednakże trzy wersje programu z zadania pierwszego "gubią grosze", zapis
printf("%.2fzl = ", x);
nie podaje zaokrąglonej kwoty do dalszych obliczeń (np. przy kwocie 11,11 nie podaje ostatniego grosza).
Zastanawiam się, czy da się zaokrąglić liczbę bezpośrednio w programie lub za pomocą pliku nagłówkowego?

Natomiast w programie z zadania drugiego nie została użyta "liczba_cyfr", a sam program działa, jednak nie tak, jak powinien (np. przy 24 wypisze "24 zlotych", nie "złote")., więc nadal nie wiem, jak się za to zabrać...
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: kalwi »

hana197 pisze:Jednakże trzy wersje programu z zadania pierwszego "gubią grosze", zapis
printf("%.2fzl = ", x);
nie podaje zaokrąglonej kwoty do dalszych obliczeń
Ten zapis nic nie podaje, on ma za zadanie wyświetlić.
hana197 pisze:np. przy kwocie 11,11 nie podaje ostatniego grosza
Fakt, mój błąd. Przez te cholerne UB non stop takie kwiatki się pojawiają. Zresztą autor polecenia sam popełnił błąd, bo wszelkie obliczenia związane z finansami powinno się robić na typie stałoprzecinkowym, a nie zmiennoprzecinkowym.

Kod: Zaznacz cały

#include <stdio.h>

void funkcja(unsigned int *, int, char *);

int main(void)
{
    unsigned int tab_ZL[]={200,100,50,20,10,5,2,1};
    unsigned int tab_GR[]={50,20,10,5,2,1};
    unsigned int zlote, grosze;
    
    printf("Podaj kwote: ");
    scanf("%d.%d", &zlote, &grosze);
    printf("%d.%dzl = ", zlote, grosze);
    for(size_t i = 0; i < 8; ++i)
        funkcja(&zlote, tab_ZL[i], "zl");
    for(size_t i = 0; i < 6; ++i)
        funkcja(&grosze, tab_GR[i], "gr");
    printf("
");
    
    return 0;
}

void funkcja(unsigned int *x, int num, char *jednostka)
{
    int mod = (int)(*x) / num;
    if(mod)
        printf("%dx%d%s + ", mod, num, jednostka);
    *x -= mod * num;
}


Zastanawiam się, czy da się zaokrąglić liczbę bezpośrednio w programie
Co masz na myśli?
lub za pomocą pliku nagłówkowego?
Obawiam się, że musisz doczytać, co to jest plik nagłówkowy. A jeśli chodzi o funkcję zapewnianą przez standard języka C do wykonywania obliczeń na float-cie i int-cie naraz, to takowej nie ma.
Natomiast w programie z zadania drugiego nie została użyta "liczba_cyfr", a sam program działa, jednak nie tak, jak powinien (np. przy 24 wypisze "24 zlotych", nie "złote")., więc nadal nie wiem, jak się za to zabrać...
a, sorry, przekleiłem zły kod. A jak się trzeba zabrać? Trzeba pomyśleć, poczytać, poszukać w googlu. Na tym mniej więcej polega całe programowanie.

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
    unsigned int liczba;
    printf("Podaj liczbe: ");
    scanf("%u", &liczba);

    switch(liczba % 10)
    {
        case 1:
            printf("%d zloty", liczba);
            break;
        case 2:
            printf("%d zlote", liczba);
            break;
        case 3:
            printf("%d zlote", liczba);
            break;
        case 4:
            printf("%d zlote", liczba);
            break;
        default:
            printf("%d zlotych", liczba);
            break;
    }
    return 0;
}
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10226
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: Dasio11 »

To też niedobrze. Logika powinna być taka:

Kod: Zaznacz cały

1. jeśli n == 1, to poprawna jest forma: złoty
2. jeśli cyfrą dziesiątek n jest 1, to poprawna jest forma: złotych
3. jeśli cyfrą jedności n jest 2, 3 lub 4, to poprawna jest forma: złote
4. poprawna jest forma: złotych
Warunki oczywiście sprawdzamy po kolei i wybieramy pierwszy, który jest spełniony.

Czyli program może wyglądać tak:

Kod: Zaznacz cały

#include <stdio.h>


int main()
{
    unsigned int liczba;
    printf( "Podaj liczbe: " );
    scanf( "%u", &liczba );

    if( liczba == 1 ) printf( "%d zloty", liczba );
    else if( ( liczba / 10 ) % 10 == 1 ) printf( "%d zlotych", liczba );
    else if( 2 <= liczba%10 && liczba%10 <= 4 ) printf( "%d zlote", liczba );
    else printf( "%d zlotych", liczba );

    return 0;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: kalwi »

O kurczę, zawsze myślałem, że poprawna forma to jedenaście złoty. Całe życie w błędzie :/
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10226
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: Dasio11 »

I dwanaście złote? :D
hana197
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 2 lis 2016, o 23:46
Płeć: Kobieta
Lokalizacja: Wrocław
Podziękował: 2 razy

[C] Wydawanie reszty i wypisywanie wyniku

Post autor: hana197 »

Dziękuję za odpowiedzi i pomoc
Dokończyłam program nieco szybciej i wygląda tak:

Kod: Zaznacz cały

#include <stdio.h>
int main(void)
{
    int kwota;
    printf("Podaj kwote: ");
    scanf("%d", &kwota);
    if (kwota == 12 || kwota == 13 || kwota == 14) {
	printf("%d zlotych
", kwota);
    } else {
	switch (kwota % 10) {
	case 1:
	    printf("%d zloty
", kwota);
	    break;
	case 2:
	    printf("%d zlote
", kwota);
	    break;
	case 3:
	    printf("%d zlote
", kwota);
	    break;
	case 4:
	    printf("%d zlote
", kwota);
	    break;
	default:
	    printf("%d zlotych
", kwota);
	    break;
	}
    }
    return 0;
}
Jest bardziej nakombinowany, ale działa Jeszcze raz dziękuję.
ODPOWIEDZ