User Tools

Site Tools


dydaktyka:cprog:2015:basic_stdio-solutions

This is an old revision of the document!


Interakcja z użytkownikiem - rozwiązania i odpowiedzi

Treść laboratorium

Dlaczego wyświetlają się "śmieci"?

(Treść pytania)

Użyto niewłaściwych specyfikatorów konwersji. Specyfikatory konwersji nie weryfikują zgodności typów danych, a jedynie interpretują przekazane dane (a więc zawartość pamięci w danym miejscu) w zadany sposób.

Czyli:

  • Pierwszy printf() oczekuje liczby całkowitej i znaku, a dostaje dwie liczby całkowite. Za drugim razem interpretuje liczbę dziesiętną jako znak z (rozszerzonego) kodu ASCII. Ok, ale ten zestaw znaków ma kody od 0 do 256! Zgadza się, dlatego “liczenie” zaczyna się od nowa, czyli $300 - 256 = 44$ (',').
  • Za drugim razem przekazujemy liczbę całkowitą, którą następnie printf() interpretuje jako liczbę zmiennoprzecinkową. Otrzymujemy “śmieci”, gdyż komputer zupełnie inaczej reprezentuje w pamięci te dwa typy liczb.
  • Za trzecim razem mamy sytuację podobną, co przy drugim wywołaniu funkcji printf().

Zadania podsumowujące

Zadanie 1

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    double a, b, c;
    double suma, srednia;
 
    printf("Podaj 3 liczby rzeczywiste (oddzielone spacja): \n");
    scanf("%lf %lf %lf", &a, &b, &c);
 
    suma = a + b + c;
    srednia = suma / 3;
 
    printf("Suma to: %.2f\n", suma);
    printf("Srednia to: %.2f\n", srednia);
 
    return 0;
}

Zadanie 2

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int usds;
 
    printf("Podaj kwote w dolarach: ");
    scanf("%d", &usds);
 
    printf("$%d = %7.2f EUR\n", usds, usds * 0.77);
    printf("$%d = %7.2f PLN\n", usds, usds * 3.04);
 
    return 0;
}

Zadanie 3

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char c;
 
    printf("Podaj znak: ");
    scanf("%c",&c);
    printf("Kod ASCII znaku '%c' to %d\n", c, c);
 
    return 0;
}
dydaktyka/cprog/2015/basic_stdio-solutions.1445496717.txt.gz · Last modified: 2020/03/25 11:46 (external edit)