User Tools

Site Tools


dydaktyka:cprog:2016:basic_stdio

This is an old revision of the document!


Interakcja z użytkownikiem

Cel laboratorium

  • Zapoznanie ze sposobem wypisywania danych na ekran.
  • Zapoznanie ze sposobem wczytywania danych z klawiatury.

Tytułem wstępu...

(dla dociekliwych)

We wszystkich systemach komputerowych do przechowywania informacji służą pliki (file). Pliki zawierają powiązane ze sobą wzajemnie informacje. Ponieważ w komputerach wszystkie pliki reprezentowane są jako ciągi bitów pogrupowanych w bajty, język C traktuje plik jako ciąg bajtów, czyli strumień (stream). Język C traktuje wszystkie strumienie danych (do/z pliku) i wszystkie pliki dokładnie tak samo. Dodatkowo w C są trzy strumienie plikowe (file stream), które są standardowo wstępnie otwierane dla nas:

  • stdin – standardowe wejście (standard input) – do odczytu; zazwyczaj powiązany z klawiaturą
  • stdout – standardowe wyjście (standard output) – do zapisu; zazwyczaj powiązany z monitorem terminala
  • stderr – standardowe wyjście dla komunikatów o błędach (standard error)

Nagłówki funkcji języka C służących do obsługi wejścia/wyjścia znajdują się w pliku nagłówkowym stdio.h.

Wypisywanie danych

Główną funkcja służąca do wypisywania danych na standardowe wyjście (zazw. oznaczające wyświetlanie danych na ekranie terminala) jest printf().

Prototyp funkcji: int printf ( const char * format, ... );

Przykład:

printf("Stan konta #%d wynosi %f zlotych.\n", 1, saldo);
  • "Stan konta wynosi %.2f zlotych.\n" – łańcuch sterujący
    (dla przypomnienia: znak \n oznacza przejście do nowej linii)
  • %d, %.2f – specyfkatory konwersji
  • 1, saldo – lista wyrażeń

:?: Tekst ograniczony cudzysłowami ("...") to łańcuch znaków. Na razie pozostanie on dla Ciebie czarną magią, zajmiemy się tym zagadnieniem za parę zajęć… Na chwilę obecną po prostu powiedz sobie Aha, stosując printf() muszę na początku wpisać tekst w cudzysłowach!

Podstawowe specyfikatory konwersji:

specyfikator typ wartości
%c char
%d int
%f float, double

Podstawowe opcje formatowania:

  • wyrównanie pola wyjściowego (np. %8d)
  • ilość miejsc po przecinku (np. %.3f)

W domu zapoznaj się dokładniej z dokumentacją funkcji printf(). Nie czytaj wszystkiego “od deski do deski”, tylko zobacz, jakie inne specyfikatory i opcje formatowania udostępnia ta funkcja – otrzymywanie czytelnych wyników działania programu to podstawa sukcesu :-)
Zobacz też, z jakich sekcji składa się dokumentacja takiej funkcji (np. oczekiwany format argumentów, zwracana wartość, przykłady użycia…)

Sprawdź, co zostanie wypisane w przypadku użycia nieodpowiednich specyfikatorów konwersji:

conversion_errors.c
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int num = 300;
    float nf = 3.0f;
 
    printf("%d %c\n", num, num);
    printf("%f %lf\n", num, num);
    printf("%f %d\n", nf, nf);
 
    return 0;
}
  • Jak sądzisz, dlaczego tak się dzieje?
  • Przejrzyj listę ostrzeżeń zgłoszonych przez kompilator – na ich podstawie możesz bez trudu odnaleźć źródło problemów.

:!: Upewnij się, że na końcu łańcucha sterującego znajduje się znak nowej linii \n (inaczej może się zdarzyć, że tekst do wyświetlenia utknie w buforze).

Odczyt danych

Główną funkcja służąca do pobierania danych ze standardowego wejścia (zazw. z klawiatury) jest scanf().

Funkcja ta zamienia wpisywany tekst na wartości odpowiednich typów zgodnie z zadanymi przez programistę specyfikatorami konwersji.

scanf() pobiera wskaźniki do zmiennych (na chwilę obecną nie musisz nic wiedzieć o wskaźnikach, po prostu dodaj symbol & przed nazwą zmiennej).

:!: Podstawowe specyfikatory konwersji są analogiczne do wykorzystywanych w funkcji printf(), z tym że scanf() dodatkowo posiada %lf do wczytywania wartości typu double.

Przykład:

scanf.c
#include <stdio.h>
 
int main()
{
  int a = 0
  int b = 0;
 
  printf("Podaj wspolrzedne punktu: ");
  scanf("%d %d", &a, &b);
 
  a = -a;
 
  printf("Po odbiciu symetrycznym wzgledem OX: %d %d\n", a, b);
 
  return 0;
}

Zadania podsumowujące

Zadania bazują na treści tego laboratorium oraz laboratorium Typy danych.

:!: W przypadku “dziwnego zachowania” programu podczas odczytu danych zaglądnij najpierw do FAQ.


Zadanie STATS

(poziom trudności: )

Wczytaj trzy liczby zmiennoprzecinkowe przy pomocy funkcji scanf(). Wypisz ich sumę oraz średnią. Dobierz odpowiednie specyfikatory konwersji pod kątem typów użytych zmiennych.

Zadanie CASH

(poziom trudności: )

Napisz program, który zamieni wczytaną wartość w dolarach na waluty:

  • euro (1 USD = 0,77 EUR)
  • złotówki (1 USD = 3,04 PLN)

Wczytana wartość jest typu całkowitego. Obliczone wartości nowych walut mają być tak sformatowane, aby liczba była wyświetlona z dwoma miejscami po przecinku, a cała liczba zajmowała 7 pól.

Zadanie CHAR

(poziom trudności: )

Napisz program, który wczyta znak z klawiatury, a następnie wyświetli jego wartość w kodzie ASCII.

dydaktyka/cprog/2016/basic_stdio.1476349394.txt.gz · Last modified: 2020/03/25 11:46 (external edit)