1 Inmatning och utskrift Inmatning från tangentbord och utskrift till skärm sker i C++ med hjälp av strömmar. Vi har tidigare sett exempel på utskrift. Vi kommer i det här avsnittet även ta upp inmatning från tangentbordet så att vi kan skapa program som kommunicerar med en användare istället för att använda värden inskrivna i programkoden. 1.1 Utskrift till skärm För att skriva data till skärmen ( konsolen) används variabeln cout tillsammans med strömoperatorn <<. Denna binära operator fungerar på samma sätt som andra binära operatorer dvs. den tar två operander och ger ett resultat. Variabeln cout är deklarerad i filen iostream med datatypen ostream (output stream, utström). Operationen << ser generellt ut som ( ostream ) << ( annan datatyp ) : ostream Vi har tidigare sett bland annat int a; a = 6; cout<< a har värdet "<< a << endl; double x; x = 3.202; cout<< x har värdet << x << endl; Om vi betraktar rad 3 cout<< a har värdet "<< a << endl; ser vi att utströmsoperatorn finns på tre ställen, satsen är alltså sammansatt av tre enkla uttryck. Den operation som utförs först är den längst till vänster. eller cout<< "a har värdet" ( ostream ) << ( text ):ostream Returvärdet från operationen är variabeln cout. ( operationen ger operanden som resultat ) Nästa operation kan alltså läsas ut som cout<< a Även denna operation ger operanden cout som resultat. Den sista operationen kan därför läsas ut som cout<< endl
Med utströmsoperatorn kan man alltså med en enda sats skriva ut så många variabler och texter som man vill. Det är ändå oftast en god ide att hålla raderna så pass korta att de blir lättlästa. Det brukar som regel innebära maximalt 2 3 variabler och en kortare text. 1.1.1 Formatering av utmatning #include<iostream> Man vill gärna att den utskrift som programmet gör på skärmen ska vara snygg och lättläst. Tyvärr blir det inte alltid som man tänkt sig, i synnerhet då värden på flyttalsvariabler ska skrivas ut på skärmen. Exempel, valutaomvandling double kron_dollar_kurs = 10.43; double kronor = 345.50; double dollars; dollars = kronor / kron_dollar_kurs; cout << kronor << " svenska kronor blir "; cout << dollars << " amerikanska dollar" << endl; Resultatet av programkörningen blir 345.5 svenska kronor blir 33.1256 amerikanska dollar Press any key to continue Det är inte speciellt snyggt att få fyra decimaler på dollarkursen. På vissa kompilatorer kan man få ännu mer svårlästa utskrifter ex 3.455E+02 svenska kronor blir 3.31256E+1 amerikanska dollar Press any key to continue Siffrorna ska läsas som 3.455 * 10 2 och 3.31256* 10 1. För att råda bot på detta finns det ett antal knep man kan ta till. För att få ett visst antal decimaler kan man skriva cout.setf(ios::showpoint); // visa alltid decimalpunkt cout.precision( 2 ); // med två flyttalsdecimaler Skriv denna dessa två rader som egna satser innan flyttalen skrivs ut. Obs detta påverkar inte på något sätt flyttalsvariablernas precision utan endast hur de skrivs på skärmen. För att få en decimalpunkt istället för E notationen ovan skriver man
cout.setf(ios::fixed ); cout.width( 20 ); setf och precision är funktioner( eller metoder ) kopplade till utströmmen cout. Det som ges innanför parenteserna ( ios::fixed och heltalet 2 )kallas funktionsargument. Ett annat sätt att formatera utskriften är att ange hur många positioner ett uttryck ska uppta. #include<iostream> Ger att nästföljande utströmsoperation kommer att ta minst 20 teckenpositioner till sitt förfogande. Om talet eller texten är kortare fogas tillräckligt antal blanksteg in. Observera att den angivna bredden bara gäller för den utströmsoperation till cout som kommer direkt efter cout.width( ) Sammantaget kan då programmet se ut som: double kron_dollar_kurs = 10.43; double kronor = 345.50; double dollars; dollars = kronor / kron_dollar_kurs; cout.setf(ios::showpoint); cout.precision( 2 ); cout.setf(ios::fixed ); cout << kronor << " svenska kronor blir "; cout << dollars << " amerikanska dollar" << endl; 1.2 Inmatning från tangentbordet Inmatning görs med strömmar, på ett liknande sätt som utmatningen. Man använder sig av en inströmsoperator>> istället för utströmsoperatorn<<, och inströmmen kallas cin istället för cout. Den stora skillnaden är att en inströmsoperation stannar tillfälligt programmet i väntan på inmatning ifrån tangentbordet. Inströmsoperationen har liknande form som utströmsoperationen ( istream ) >> ( någon datatyp ) : istream Datatypen istream ( input stream, inström) och cin är båda definierade och deklarerade i iostream. För att ta emot inmatning av ett heltal från tangentbordet kan man skriva:
int i; cin >> i; Inströmsoperationen liknar till viss del en tilldelningsoperation, men med den stora skillnaden att värdet som variabeln i får bestäms av användaren som kör programmet. Programmet väntar i inströmsoperationen tills det att användaren faktiskt matat in ett värde. Denna egenhet gör att man för varje inmatningssats ( inströmsoperation från cin ) måste se till att användaren blir varskodd att programmet väntar på inmatning. Det görs ganska enkelt genom att skriva ut lite ledtext på skärmen. int i; cout << "Mata in ett heltal och tryck på return"<<endl; cin >> i; Glömmer man att lägga till ledtext till inmatningen, eller kanske rentav råkar lägga den efter inmatningen, kommer programmet att vänta på en inmatning från användaren, och användaren kommer i sin tur att inte ha en aning om att programmet väntar tålmodigt på en inmatning. Dollarkursprogrammet tidigare blir betydligt mer användbart om man lägger till en inmatningsprocedur
#include<iostream> double kron_dollar_kurs = 10.43; double kronor; double dollars; // ange ledtext direkt före inmatning cout << "Ange hur många kronor du har:"<<endl; cin >> kronor; // resultatet beror på vad som matats in dollars = kronor / kron_dollar_kurs; cout.setf(ios::showpoint ); cout.precision( 2 ); cout.setf(ios::fixed ); cout << "Dina "<< kronor << " svenska kronor blir "; cout << dollars << " amerikanska dollar" << endl; En programkörning kan då se ut som Ange hur mõnga kronor du har: 6500 Dina 6500.00 svenska kronor blir 623.20 amerikanska dollar Press any key to continue Programmet skriver först ut ledtexten, väntar på inmatningen, 6500[Enter]. [Enter] anger att tangenten Enter/Return/Vagnretur skall tryckas. Sedan skrivs resultatet av beräkningen ut. Inströmsoperationen kan i likhet med utströmsoperationen ta emot flera inmatningar i en sats. double variabel1, variabel2; cout<<"skriv in två flyttal, avsluta med return"; cin>> variabel1 >> variabel2; Inmatningen till denna sats kan antingen göras genom att man skriver två tal och trycker return mellan varje tal, eller kan man separera talen med blanksteg eller tab och avsluta inmatningen med return. Se även om vittecken i avsnittet Texthantering, in och utmatning. Problemet med denna typ av inmatning är att man inte kan skriva ut någon ledtext mellan varje inmatning. Utan man kan bara ge ledtexter typ "Ange 4 tal". Det kan därför vara ett bättre alternativ att dela upp det så att man bara har en inmatning per sats, och ledtext till varje inmatning. 1.2.1 Exempelprogram Beräkna area och omkrets hos en rektangel.
#include<iostream> double sida; double bredd; double omkrets; // ange ledtexten cout << "Ange längden på rektangeln:"<<endl; cin >> sida; // ny ledtext cout << "Ange bredden på rektangeln:"<<endl; cin >> bredd; omkrets = sida*2 + bredd*2; cout.setf(ios::showpoint ); cout.precision( 2 ); cout.setf(ios::fixed ); cout <<"Omkretsen på rektangeln är "<< omkrets<< endl; cout <<"Rektangeln har arean "; // sida*bredd är arean cout << sida*bredd<<endl; // observera att beräkningen görs före utströmsoperationen // * har högre prioritet än << 1.2.2 Övning: Skriv ett program som frågar efter hur gammal du är, och därefter berättar hur många dagar du levat. Dela upp lösningen i olika steg. Börja med att fundera på hur du vill att beräkningen ska gå till. Då du vet hur du vill att beräkningen ska fungera tänker du ut hur användardialogen (programkörningen med in och utmatningar) ska se ut. Därefter kan du börja skriva programmet genom att titta på tidigare exempel. Tänk särskilt på vilka variabler du behöver och vilka datatyper dessa variabler bör ha.