Читање и печатење на податоци

Повеќето програми кои ги разгледавме досега извршуваа наредби за комуникација со корисникот. Во ова предавање ќе покажеме како, со помош на стандардните потоци cin (за читање од тастатура) и cout (за печатење на екран), програмата може од корисникот да бара податоци, да чита податоци или да печати резултати. Овие потоци (cin и cout) се дефинирани во датотеката iostream.

Стандарден излез (cout)

C++ користи потоци (анг. stream) за читање (влез) и запишување (излез) на податоци од стандардни медиуми (датотеки, тастатура, екран, итн). Потоците овозможуваат вметнување/запишување (<<) или извлекување/читање (>>) на податоци.

Веќе разгледавме неколку програми кои го користат стандардниот cout поток и печатат податоци на екран. Да се обидеме сега, преку пример, да објасниме како се користи cout:

Програма 7.1

#include <iostream>
using namespace std;

int main()
{
      int x = 100;
      cout << "Otpecati neshto!" << endl;                     //Otpecati neshto!
      cout << x << endl;                                      //100
      cout << 500 << endl;                                    //500
      
      
      cout << "Edno," << "dve" << "," << "tri" << endl;       //Edno,dve,tri
      
      cout << "Moze i kombinacija " << "od tekst i promenlivi - " << x << endl;
      //Moze i kombinacija od tekst i promenlivi - 100
      
      cout << "Bez endl ";
      cout << "se se pecati";
      cout << " vo eden red!";
      cout << endl;
      //Bez endl se se pecati vo eden red!
          
      cout << "Ova e vekje nov red." << endl << "i nov!" << endl << "i nov!";
      //Ova e vekje nov red.
      //i nov!
      //i nov!
      
      cout << endl << endl << endl << "Kraj na programata!";
      return 0;
}

Прво нешто што треба да го забележите е вклучувањето на "<iostream>" и користењето на стандардниот (std) простор на имиња. Не ги заборавајте овие две линии.

Во C++, печатењето се врши преку вметнување (со помош на операторот <<) на податоци во cout потокот. Може да се вметнуваат променливи (со што се печати нивната вредност) или какви било други податоци (цели броеви, реални броеви, знаци, текст, итн.). Кога печатиме текст, потребно е истиот да го ставиме во наводници "tekst koj treba da se pechati".

Следно, забележете дека операторот за вметнување (<<) може да се искористи повеќе пати во една иста наредба. Можно е и да се комбинираат променливи, константи и други податоци во една иста наредба (линија 14).

Забележете ја и употребата на endl манипулаторот - тој вметнува знак за нова линија во потокот. Вметнувањето на константи (броеви, текст) и променливи во потокот, по правило, не предизвикуваат печатење на податоци во повеќе линии (без разлика колку cout наредби имаме). Програмерот мора експлицитно да внесе знак за нова линија доколку сака да печати податоци во повеќе линии.

Во некој од претходните пасуси наведовме дека е потребно секој текст кој сакаме да го отпечатиме да го ставиме во наводници: "tekst koj treba da se pechati". Но, што доколку сакаме во потокот да внесеме знак за наводници? Во таквите случаи, потребно е пред знакот за наводници (кој сакаме да го отпечатиме) да го ставиме знакот '\' (коса црта). Овој знак му кажува на компајлерот дека она што следува после него е специјален знак кој треба да се протолкува соодветно. \" ќе се протолкува од компајлерот како знак за наводници. Други изрази имаат друго значење: најпознат пример е изразот \n (коса црта, па n) – кој ќе се протолкува како знак за нова линија (слично како endl). Разгледајте ја следната програма (и нејзиниот излез):

Програма 7.2

#include <iostream>
using namespace std;

int main()
{
      cout << "prva linija\n";                             //prva linija
      cout << "vtora linija\ntreta linija";                //vtora linija
                                                           //treta linija
      
      cout << endl;
      
      cout << " \"Ova e vo navodnici\"" << endl;           //"Ova e vo navodnici"
      cout << "Ime: \"FINKI\", Skopje" << endl;            //Ime: "FINKI", Skopje
      
      return 0;
}

Во вашите програми може да користите и endl и \n за вметнување на знак за нова линија.

Стандарден влез (cin)

Читање на податоци од стандарден влез (тастатура) се прави со помош на операторот за извлекување (>>). Програмата ќе ги прочита податоците и ќе ги смести во променливата која сте ја навеле во наредбата за читање. Да разгледаме пример:

Програма 7.3

#include <iostream>
using namespace std;

int main()
{
      int a, b;
      
      cout << "Vnesi dva broja: ";
      cin >> a;
      cin >> b;
      
      cout << "a = " << a << endl;
      cout << "b = " << b << endl;
      
      int c, d;
      cout << "Vnesi ushte dva broja: ";
      cin >> c >> d;
      
      cout << "c = " << c << endl;
      cout << "d = " << d << endl;
      
      
      double real;
      
      cout << "Vnesi eden decimalen broj: ";
      cin >> real;
      
      cout << "real = " << real;
      
      return 0;
}

Забележете дека читањето се прави преку извлекување (>>) на податоци од cin потокот. За разлика од читањето, печатењето го правиме преку вметнување (<<) на податоци во cout потокот.

Со една иста наредба може да прочитаме вредности за повеќе променливи – слично како кај печатењето. Во примерот даден погоре, вредностите на променливите c и d се читаат со употреба на една наредба. Доколку ја извршите оваа програма дома, запаметете да притиснете ENTER (RETURN) по внесување на податоците - без тоа системот нема да знае кога сте завршиле со внесување на соодветниот ред од податоци. Податоците може да ги одделувате со празно место, со tab или со знак за нов ред. Податоците не мора да се внесат во еден ист ред, дури и кога користите една cin наредба за внесување на повеќе податоци.

Мора да се внимава на типот на податок кој и го предаваме на програмата: ако сме дефинирале (со cin наредба) дека корисникот, во тој дел од програмата, ќе внесе податок кој е цел број, тогаш тој мора да внесе податок кој е цел број - во спротивно, програмата нема да се изврши успешно. Ова нема да има никаков ефект на останатите ваши програми или оперативниот систем, па не плашете се - голем број од програмите кои што ќе ги типкате ќе завршуваат неуспешно.

Постои начин на кој може да се врши валидација (проверка) на она што го внесува корисникот - преку читање на текст и негова проверка. Доколку текстот не одговара на барањата, може да побараме од корисникот повторно да го внесе потребниот податок. За ова ќе зборуваме во некое друго предавање.

Прв поглед на текстуални низи

Текстуални низи се низи од знаци (некаде погрешно именувани како карактери). Тие овозможуваат чување на текстуални податоци (зборови, реченици, пасуси, ...). Нормално, и цифрите (0-9) се знаци, па можно е и нивно чување во текстуални низи.

Во C++, за да користиме податоци од типот string (текст) потребно е да ја вклучиме соодветната датотека во која се тие дефинирани ("#include <string>"). Врз променливи од типот string може да извршуваме слични операции како и врз променливи од основните типови:

Програма 7.4

#include <iostream>
#include <string>
using namespace std;

int main()
{
      //inicijalizacija - kako i site drugi podatocni tipovi
      string a = "moze da se inicijalizira vaka";
      string b("ili vaka");
      
      string c = "Zdravo, ";
      string d = "Bojan!";
      
      //pecatenje - kako i site drugi podatocni tipovi
      cout << c << d << endl;                      //Zdravo, Bojan!
      
      //dodeluvanje vrednost - kako i site drugi podatocni tipovi
      c = "Cao, ";
      cout << c << d << endl;                      //Cao, Bojan!
      
      cout << "Vnesi go tvoeto ime: " << endl;
      
      string e;
      cin >> e;                                    //moze da se chitaat podatoci
      
      cout << "Tvoeto ime e: " << e << endl;       //Tvoeto ime e: {vrednost na e}
      return 0;
}

Како што може да се забележи од примерот даден погоре, променливи од типот string се декларираат и иницијализираат слично како и сите останати променливи. Читањето и печатењето на нивните вредности, исто така, се прави слично како и кај другите типови на променливи.

Во претходниот дел - "стандарден влез (cin)" кажавме дека читањето на податоци се врши се додека не наидеме на знак за празно место, tab или знак за нов ред. Во примерот даден погоре, кога бараме од корисникот да го внесе неговото име (линии 21-24), се ќе се изврши коректно доколку корисникот внесе само еден збор (на пример, само неговото име). Но, што доколку сакаме, во една променлива, да го прочитаме и името и презимето на корисникот (одделени со знак за празно место)?

Решението на овој проблем е многу едноставно - ќе повикаме функција за читање на цела линија податоци. Името на оваа функција е getline(stream, string) и таа се повикува со два аргументи: потокот од кој сакаме да читаме – во нашиот случај cin, и променливата каде што сакаме да се сместат податоците.

Програма 7.5

#include <iostream>
#include <string>
using namespace std;

int main()
{
      string linija;
      
      cout << "Ime i prezime: ";
      getline(cin, linija);
      
      cout << "Tvoeto ime i prezime: " << linija << endl;
      
      string str_broj;
      
      cout << "Vnesi cel broj: ";
      getline(cin, str_broj);
      
      cout << str_broj << endl;
      return 0;
}

Забележете сега што се случува во последните неколку редови од програмата (редови 14 до 17). Програмата бара од корисникот да внесе цел број, а потоа користи getline за читање на текст. Она што сакаме да го покажеме со оваа програма е дека и цифрите може да се сметаат како знаци. Се она што може да се печати во конзола - може да се чита и запишува како текстуален податок. Што се однесува до програмата, таа е доволно паметна да го смести податокот во податочниот тип во кој ви е вам потребен: ако користите "cin >> a;" и a е променлива од тип int, податокот ќе биде сместен во променлива од тип int; доколку a е променлива од тип string, податокот ќе биде сместен во променлива од тип string.

Не се вознемирувајте доколку не разбирате како функционира оваа програма - факт е дека сеуште не сме стигнале до предавањето за функции, а програмата дадена погоре користеше повик до функцијата getline(stream, string). За оваа функција, и многу други, ќе зборуваме во некое од наредните предавања.

Дозвола за користење: CC BY-NC 2.5 ©