WYJŚCIE W C++
Strumień c o u t – strumień wyjściowy, który C++ przypisuje do standardowego urządzenia wyjściowego systemu operacyjnego. Domyślnie System operacyjny przypisuje standardowe urządzenie WY do ekranu.
<< - OPERATOR KIERUNKOWY WSTAWIANIA
operator wstawia znaki do strumienia WY, z którego będą one wyświetlane.
Jeśli program ma wyświetlić komunikat o błędzie, to należy użyć strumienia wyjściowego
c e r r.
C++ przypisuje go do standardowego urządzenia informacji o błędach systemu operacyjnego.
Sterowanie szerokością WY:
Modyfikator setw() (set width = ustaw szerokość)
plik nagłówkowy: iomanip.h np.
cout << „Liczba tysiąc:” << setw(3) << 1000 << endl;
cout << „Liczba tysiąc:” << setw(5) << 1000 << endl;
setw(5) - minimalna liczba pozycji, jakie zajmie dana wartość
Liczba tysiąc:100
Liczba tysiąc: 1000
Plik nagłówkowy iostream.h zawiera definicje klas oraz metod (funkcji):
cout.width() steruje odstępami na WY
cout.fill() zastęuje znaki na WY podanym symbolem
cout.setprecision() określa liczbę cyfr dziesiętnych
cout.put() wyświetla po jednym znaku
cout.flush() opróżnia bufor
for (int i=3; i<7; i++)
{ cout << "Liczba tysiac:" ;
cout.width(i);
cout << 1000 << endl;
}
Liczba tysiąc:1000 Tak jak dla manipulatora setw()
Liczba tysiąc:1000 szerokość ustalona przy użyciu funkcji
Liczba tysiąc: 1000 cout.width()
Liczba tysiąc: 1000 jest stosowana tylko do następnej
Liczba tysiąc: 1000 wypisywanej na WY wartości.
Funkcja cout.fill()
Aby uzyskać następujący wydruk:
Spis treści
Rozdział 1....................5
Spis literatury.............900
cout << "Spis tresci"<< endl;
cout.fill('.');
cout << "Rozdział 1" << setw(20) << 5 << endl;
cout << "Spis literatury" << setw(15) << 900 << endl;
setprecision(n) domyślnie n=6
float liczba=1.23456;
for (i=1; i<6; i++) cout << setprecision(i) << liczba << endl;
1.2 Po ustaleniu precyzji przez manipulator
1.23 setprecision()
1.235 obowiązuje ona do chwili, gdy ponownie
1.2346 wywołamy funkcję setprecision()
1.23456
cout.put() wyświetla po jednym znaku
char tekst[]="Po jednym znaku.";
for (i=0; tekst[i]; i++)
cout.put(toupper(tekst[i]));
Funkcja toupper() zwraca dużą literę odpowiadającą danej małej literze.
plik nagłówkowy: ctype.h
WEJŚCIE w C++
Strumień wejściowy c i n daje programowi możliwość wczytania WE z klawiatury.
cin >> zmienna;
>> OPERATOR POBIERANIA.
Operator pobiera dane ze strumienia WE i przypisujeje podanej zmiennej.
zmienna ZMIENNA, pod którą strumień ma umieścić daną
Wczytywanie WE po jednym znaku
Strumień c i n ma funkcję cin.get(), która pozwala wczytywać jeden znak danych.
char litera;
cout << "\nCzy liczyc dalej?[T/N]:" << endl;
do {
litera=cin.get();
litera=toupper(litera);
} while ((litera !='T') && (litera!='N'));
Wczytywanie WE z klawiatury po jednej linii
Spacja, tabulator, powrót karetki kończą dane. Aby wczytywać całe linie tekstu, można zastosować funkcję:
cin.getline(tekst, sizeof(tekst);
char dane[64];
cout <<"\nWprowadz nazwisko i imie i nacisnij ENTER" << endl;
cin.getline(dane, sizeof(dane));
cout << "Wpisales:" << dane << "\n\n\n";
Wywołanie funkcji cin.getline (tekst, 64, ‘X’) sprawia, że wczytywana będzie linia tekstu aż do wprowadzenia 64 znaków, powrotu karetki lub litery X
===================================================================
Przykłady na wprowadzanie znaków
Przykład:1
#include
#define MAX 80
void main ()
{
char ch, bufor [MAX+1];
int x=0;
while ( (ch=getchar () ) != ‘\n‘ && x < MAX)bufor[x++]=ch;
bufor[x]=’\0’;
printf (”%s” , bufor );
}
W przykładzie pokazano wykorzystanie funkcji getchar() do pobierania wierszy tekstu.
q buforowania ani nie wyświetlając echa. Jej nagłówek w conio.h ma postać:
int getch (void);
Ponieważ getch() nie przeprowadza buforowania, każdy znak jest dostępny natychmiast po naciśnięciu odpowiedniego klawisza, bez oczekiwania na naciśnięcie klawisza ENTER.
#include
#include
void main ()
{
int ch;
while ( (ch=getch() ) != ‘\r‘ )
putchar(ch);
kod ‘\r‘ odpowiada znakowi powrotu karetki (CR), który jest wysyłany przez program obsługujący klawiaturę do stdin po każdym naciśnięciu ENTER
FUNKCJE BUFORUJĄCE WE automatycznie tłumaczą ten znak na znak nowego wiersza, dlatego przy korzystaniu z nich wciśnięciu ENTER odpowiada znak ‘\n‘. NIEBUFOROWANE FUNKCJE wejściowe nie wykonują żadnych przekształceń znaków, tak więc program musi oczekiwać na znak ‘\r‘.
}
Funkcja getch() nie jest standardową funkcją ANSI (Borland, Zortech).
#include
#include
#define MAX 80
void main ()
{ char ch, bufor[MAX+1];
int x=0;
while ( (ch=getch() ) != ’\r’ && x < MAX )bufor [x++] = ch;
bufor [x] = ‘\0‘;
printf ( ”%s”, bufor );
}
Przykład wykorzystania funkcji getch( )do pobierania wierszy tekstu.
q Funkcja getche () jak funkcja getch() ale wypisuje pobrany znak do stdout.
POBIERANIE WIERSZY
void main ()
{ int wiek;
char imie[20];
puts (”Podaj swój wiek: ”);
scanf (”%d”, &wiek);
/* usuń z stdin nadmiarowe znaki */
czysc_kb();
puts (”Podaj swoje imię: ”);
scanf (”%s”, imie);
printf (”Masz %d lat. \n”, wiek);
printf(”Nazywasz się %s.\n”, imie);
}
puts(”Wpisz liczbę pięciocyfrową (np. 54321).”);
scanf (”%2d%3d”, &i1,&i2);
/* Wykorzystanie szerokości pola do podziału wejścia: i1=54 a i2= 321 Określenie szerokości pola w formacie spowodowało podział liczby na dwie wartości */
puts (”Podaj swoje imię i nazwisko oddzielone spacją:”);
scanf (“%[^ ]%s, buf1, buf2);
printf (“Masz na imię %s\n”, buf1);
printf (“a na nazwisko %s. \n”, buf2);
/* Wyłączenie spacji przez [^ ] w formacie scanf() spowodowało podział wejścia. */
TABLICE I ŁAŃCUCHY
Tablica jest strukturą danych, złożoną z określonej liczby elementów tego samego typu. Tablica jednowymiarowa jest to tablica, która ma pojedynczy INDEKS. Indeks jest to liczba w nawiasach kwadratowych następująca po nazwie tablicy.
DEKLARACJA TABLICY składa się ze specyfikatora typu, nazwy i wymiaru.
Wymiar określa liczbę elementów zawartych w tablicy. Pierwszy element tablicy ma wartość zero.
Np. zapis double dane[4];
deklaruje tablicę 4 elementów typu double:
dane[0], dane[1], dane[2], dane[3]
zmienne indeksowane
Dostęp do poszczególnych elementów tablicy uzyskuje się przez użycie nazwy tablicy i indeksu w nawiasach kwadratowych.
Np. instrukcja dane [1] = 56.35;
przypisuje wartość 56.35 drugiemu elementowi tablicy dane.
Elementy tablicy przechowywane są w kolejnych komórkach pamięci.
dane [0] 56.35 Dane [2] dane [3]
Przy odwoływaniu się do elementu tablicy, indeks tablicy może być stałą oraz może być wyrażeniem.
float wyniki[100]; //deklaracja tablicy 100 liczb rzeczywistych
int a[10], i; // deklaracja tablicy 10 liczb całkowitych
.............
a[2]=4; //przypisanie zmiennej a[2] wartości 4
i=3;
wyniki[i] = 50; //przypisanie zmiennej wyniki[3] wartości 50
wyniki[i-1] = 56.35;
wyniki [a[2]] = 100; // a jest tablicą liczb całkowitych: a[2]=4,
Tablica a:
4
a[0] a[1] a[9]
Tablica wyniki:
56.35] 50 100
wyniki[0] wyniki[1] wyniki[2] wyniki[3] wyniki[4] wyniki[99]
Deklarację tablicy można powiązać z nadaniem wartości początkowych (inicjalnych) jej elementom. Wartości inicjalne, oddzielone przecinkami, umieszcza się w nawiasach klamrowych po operatorze przypisania.
Np. tablicę dane można zainicjować instrukcją deklaracji:
double dane[4] = { 1.5, 6.2, 2.8, 3.7 };
W deklaracji inicjującej można pominąć wymiar tablicy:
double dane[] = { 1.5, 6.2, 2.8, 3.7 };
W tym przypadku kompilator obliczy wymiar tablicy na podstawie liczby elementów inicjalnych.
Ponieważ elementy tablic mogą być dowolnego typu, zatem mogą być również tablicami. Możliwe więc jest deklarowanie TABLIC WIELOWYMIAROWYCH jako tablic, których elementami są tablice.
PRZYKŁADY UŻYCIA TABLIC W PROGRAMACH
/* Schemat Hornera obliczania wartości wielomianu stopnia n:
a[0] x^n +a[1] x^(n-1)+ …+ a[n] w punkcie z:
b[0]=a[0], b[i]=a[i]+b[i-1]z dla i=1, 2, …, n.
Wartością wielomianu w punkcie z jest b[n]*/
#include
#include
void main ()
{
float a[25], b[25], z;
int n,i;
clrscr();
printf("\nPodaj stopień wielomianu: ");
scanf("%d" ,&n);
printf( "\nPodawaj kolejno współczynniki wielomianu. \n");
for (i=0; i <=n; i++)
{ printf( "a[%d]=", i);
scanf("%f", &a[i]); }
printf( "\nPodaj teraz wartość argumentu: ");
scanf("%f", &z);
b[0] = a[0];
for (i=1; i<=n; i++) b[i] = b[i-1]*z + a[i];
printf( "\nWartość wielomianu = %f \n" , b[n]);
getch();
}
/*Program porządkuje wyrazy tablicy jednowymiarowej tak, aby były one w tej tablicy uporządkowane rosnąco. Program pomija liczby ujemne, kończy wczytywanie po podaniu zera, lub po osiągnięciu WYM (ustalonej w deklaracji ilości liczb. Wypisuje te liczby na ekranie. Zastosowano wejście i wyjście C++ za pomocą strumieni
cin i cout – dyrektywa #include
#include
#include
#include
void main ()
{
const WYM=100;
float x[WYM], liczba;
int i=1,j,k,sort;
clrscr();
cout << "\nPodaj pierwszą liczbę: \n"; cin >> x[0];
cout << "Podawaj kolejne liczby." << endl;;
while (i
if (liczba <0 ) continue;
if (liczba ==0) break;
sort =0; //zmienna pomocnicza, która informuje,
//czy trzeba przesuwać elementy tablicy
for (k=0; k { if (x[k] > liczba )
{ sort =1; //przesuwaj elementy tablicy
for (j=i; j>k; j--) x[j]=x[j-1];
x[k] = liczba;
break; }
}
if (sort == 0) x[i] = liczba;
i++;
}
i--;
cout << "\nWynik:" << endl;
for (j=0; j<=i; j++) cout << setw(5)<
}
ŁAŃCUCHY
DEFINIOWANIE ŁAŃCUCHA
Łańcuchy to tablice składające się ze znaków. Koniec łańcucha sygnalizuje pierwszy napotkany znak ‘\0’ (NULL).
char tab[6]={‘w’,’i’,’t’,’a’,’j’,’\0’};
Zapamiętanie znaku końca tekstu ‘\0’ wymaga dodatkowego elementu tablicy.
Definicja równoważna:
char tab[6]=”witaj”;
Stałe znakowe, reprezentowane przez jeden znak, umieszcza się w apostrofach. Stałą tekstową (łańcuch znaków) umieszcza się miedzy znakami cudzysłowu (znak ‘\0’ umieszczany jest automatycznie).
Przykład programu, w którym łańcuch traktowany jest jako tablica znaków.
Program sprawdza występowanie znaku w napisie, w razie zgodności następuje wymiana na znak podany.
#include
#include
void main()
{
char napis[80];
char staryZnak, nowyZnak;
int i;
clrscr ();
printf (“Wpisz napis\n”);
gets (napis);
printf(”\n\n”);
printf (”Podaj znak, który ma być zmieniony: ”);
staryZnak = getche();
printf(”\n\n”);
printf (”Podaj nowy znak : ”);
nowyZnak = getche();
printf(”\n\n”);
/* indeks łańcucha rozpoczyna się od 0 */
for ( i=0; napis[i]; i++)
if (napis[i] == staryZnak) napis[i] = nowyZnak;
printf (”\nNowy napis: \n”);
puts (napis);
printf(”\n\n”);
getch();
}