Permalänk
Medlem

nybörjare i c++ kodproblem

Hallå!
Jag försöker skriva mitt första program och har lånat en bok från bibloteket om c++. När jag skrivar av kodexemplet exakt som det ser ut i boken så får jag ändå problem.
Min kod:

// ett enkelt program med heltalsvariabler # include <iostream> int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout >>"produkten är" <<produkt; }

Felmeddelande i loggen: 1>Build started 2011-05-17 23:13:29.
1>PrepareForBuild:
1> Creating directory "c:\users\anders\documents\visual studio 2010\Projects\first prog\Debug\".
1>InitializeBuildStatus:
1> Creating "Debug\first prog.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> mycode.cpp
1>c:\users\anders\documents\visual studio 2010\projects\first prog\first prog\mycode.cpp(9): error C2065: 'cout' : undeclared identifier
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.39
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

VARFÖR FUNKAR DET INTE?

Tacksam för hjälp!

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Medlem

cout är en C++ standard-funktion, och ligger därför i namnrymden std. Du har därför tre alternativ:

1) Anropa cout (och alla andra standard-funktioner) genom att prefixa dem med std::, dvs. skriv std::cout istället för cout.
2) Lägg till "using std::cout;" i början av koden under #include-direktiven för att säga till kompilatorn att du vill kunna använda std::cout genom att bara skriva cout.
3) Lägg till "using namespace std;" för att dra in allt från std i ditt program.

Alternativ 3 är enklast som nybörjare, men har vissa nackdelar som gör att man i vissa fall helst undviker det (man har ingen kontroll på vad som dras in). Men kör på det tills du lär dig bättre

Det verkar lite konstigt att exemplet i boken är skrivet så där. Om det står så överallt i boken så skulle jag nog passa mig för den, då den kan vara rätt så gammal.

Edit: cout är förresten inte en funktion, det är en instans av ostream. Inte för att det gör någon skillnad för vad jag sa, men rätt ska vara rätt

Permalänk
Medlem
Skrivet av Anders127:

Hallå!
Jag försöker skriva mitt första program och har lånat en bok från bibloteket om c++. När jag skrivar av kodexemplet exakt som det ser ut i boken så får jag ändå problem.
Min kod:

// ett enkelt program med heltalsvariabler # include <iostream> int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout >>"produkten är" <<produkt; }

Felmeddelande i loggen: 1>Build started 2011-05-17 23:13:29.
1>PrepareForBuild:
1> Creating directory "c:\users\anders\documents\visual studio 2010\Projects\first prog\Debug\".
1>InitializeBuildStatus:
1> Creating "Debug\first prog.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> mycode.cpp
1>c:\users\anders\documents\visual studio 2010\projects\first prog\first prog\mycode.cpp(9): error C2065: 'cout' : undeclared identifier
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.39
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

VARFÖR FUNKAR DET INTE?

Tacksam för hjälp!

// ett enkelt program med heltalsvariabler # include <iostream> int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout >>/*dom pekar åt fel håll du skickar string till cout inte från*/"produkten är" <<produkt; /*lägg till en paus så programmet inte stängs av direkt så du ser vad det skriver ut*/ }

Rättad Version

// ett enkelt program med heltalsvariabler #include <iostream> using namespace std; // Då en del funktioner använder std:: är det enklast att göra på detta vis om du är ny int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout << "produkten är" << produkt; system("PAUSE"); }

EDIT: har ej testat, borde funka om det inte är något typo

Permalänk
Medlem

#include <iostream> using namespace std; // för cout och en hel del till //using std::cout; // denna kan man använda istället int main() { int tal1, tal2, produkt; tal1 = 5; tal2 = 11; produkt = tal1 * tal2; cout << "produkten är" << produkt; // notera att << pekar till vänster! return 0; // funktionen skall returnera en int, så det gör vi }

Hm, för sent :/

Permalänk
Medlem

Är lite nyfiken bara, bestämde du dig bara för att lära dig C++ eller finns det något du vill göra med det?

Permalänk
Medlem
Skrivet av Nivo:

Är lite nyfiken bara, bestämde du dig bara för att lära dig C++ eller finns det något du vill göra med det?

Jag vill försöka lära mig c++ för att kunna skapa enklare program på egen hand. Jag tycker det verkar kul. Dessutom ska jag läsa programmering i skolan nästa termin och då skadar det inte att ha lite erfarenhet;).

Till er övriga i tråden tack så mycket! Det fungerar nu när jag använde using namespace std;
En sak bara, kan man mata ut åäö till skärmen?

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Medlem

Har testat nu och för att använda system() om du nu vill det måste du inkludera windows.h

// Ett enkelt program med heltalsvariabler #include <iostream> #include <windows.h> // Behövs för att använda system(), Detta är då windows beroende så om du vill använda en annan plattform måste du använda ett annat sätt using namespace std; // Då en del funktioner använder std:: är det enklast att göra på detta vis om du är ny int main() { int tal1, tal2, produkt; tal1=5; tal2=11; produkt=tal1*tal2; cout << "produkten är: " << produkt << endl; // ">>" ska vara "<<", avråder från att använda ÅÄÖ, endl = end line(ny rad) system("PAUSE"); // För att pausa programmet så du kan läsa output(en del program pausar programmet efteråt om du kör direkt från editorn) }

Permalänk
Medlem
Skrivet av Anders127:

Jag vill försöka lära mig c++ för att kunna skapa enklare program på egen hand. Jag tycker det verkar kul. Dessutom ska jag läsa programmering i skolan nästa termin och då skadar det inte att ha lite erfarenhet;).

Till er övriga i tråden tack så mycket! Det fungerar nu när jag använde using namespace std;
En sak bara, kan man mata ut åäö till skärmen?
http://anders.homeftp.org:81/c+.png

Jag brukar bara inte använda ÅÄÖ då jag skriver alla mina program på Engelska men du kan ladda ner och inkludera "iodos.h" den filen ändrar tecken upsättningen så du kan använda ÅÄÖ
Den här länken borde vara rätt: iodos.h

Permalänk
Medlem
Skrivet av Nivo:

Har testat nu och för att använda system() om du nu vill det måste du inkludera windows.h

Den vanligare vägen brukar väll vara cstdlib?

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Den vanligare vägen brukar väll vara cstdlib?

Det är säkert rätt, windows.h inkluderar en massa andra .h filer och den är troligtvis en av dom

Jag bara testade att inkludera windows.h och det funkade, det var länge sen jag använde system()

Permalänk
Medlem
Skrivet av Nivo:

Jag brukar bara inte använda ÅÄÖ då jag skriver alla mina program på Engelska men du kan ladda ner och inkludera "iodos.h" den filen ändrar tecken upsättningen så du kan använda ÅÄÖ
Den här länken borde vara rätt: iodos.h

Har aldrig testat det sättet själv, utan kört på \x84 \x86 \x94 alternativt † „ ” vilket blir lite jobbigt i längden

Permalänk
Medlem

En bra grej annars är att alltid koda på engelska. dvs använda engelska namn på alla variabler, finns ingen seriös programmerare som gör på något annat sätt. blir även lättare för alla att förstå om det heter "number1" istället för "tal1"

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Medlem
Skrivet av NisseG91:

En bra grej annars är att alltid koda på engelska. dvs använda engelska namn på alla variabler, finns ingen seriös programmerare som gör på något annat sätt. blir även lättare för alla att förstå om det heter "number1" istället för "tal1"

På variabler självklart ja, men svenska språket kan man behöva vid utskrift, speciellt om äldre skall tänkas läsa...

Permalänk
Medlem

tärning?

Hallå alla!
Jag har ett nytt problem. Denna gång gäller det att göra ett program som kan ta fram tärningsslag.
Enligt min bok ska detta fungera, men det gör det inte. Någon som vet hur jag ska göra för att kunna generara random tal mellan 1-6?. Jag använder visual studio 2010 för att kompilera koden och den verkar inte känna igen randomize eller random.

#include <iostream> using namespace std; #include <conio.h>; #include <stdlib.h>; int entarning(); int main() { int resultat; randomize(); //ingår normalt i stdlib resultat=entarning(); cout << "Första kastet= " <<resultat <<endl; resultat=entarning(); cout <<"Andra kastet =" <<resultat <<endl; getch(); } int entarning() { int antprickar; antprickar=random(6)+1; //random ingår normalt i stdlib return (antprickar); }

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Medlem
Skrivet av Nivo:

Har testat nu och för att använda system() om du nu vill det måste du inkludera windows.h

Vilket för övrigt är en extremt dålig vana att göra, varför låsa sig till en specifik plattform helt i onödan när det t.o.m. finns enklare sätt att åstadkomma samma sak:

cin.get();

Detsamma gäller för getch() som också är plattformsberoende.

Visa signatur

Assembly är ett högnivåspråk.

Permalänk
Medlem
Skrivet av Gramner:

Vilket för övrigt är en extremt dålig vana att göra, varför låsa sig till en specifik plattform helt i onödan när det t.o.m. finns enklare sätt att åstadkomma samma sak:

cin.get();

Detsamma gäller för getch() som också är plattformsberoende.

En sak att komma ihåg är att .h är deprecated alltså något man borde unvika.

Visa signatur

Arch - Makepkg, not war -||- Gigabyte X570 Aorus Master -||- GSkill 64GiB DDR4 14-14-15-35-1T 3600Mhz -||- AMD 5900x-||- Gigabyte RX6900XT -||- 2x Adata XPG sx8200 Pro 1TB -||- EVGA G2 750W -||- Corsair 570x -||- O2+ODAC-||- Sennheiser HD-650 -|| Boycott EA,2K,Activision,Ubisoft,WB,EGS
Arch Linux, one hell of a distribution.

Permalänk
Medlem
Skrivet av Anders127:

Hallå alla!
Jag har ett nytt problem. Denna gång gäller det att göra ett program som kan ta fram tärningsslag.
Enligt min bok ska detta fungera, men det gör det inte. Någon som vet hur jag ska göra för att kunna generara random tal mellan 1-6?. Jag använder visual studio 2010 för att kompilera koden och den verkar inte känna igen randomize eller random.

#include <iostream> using namespace std; #include <conio.h>; <--- du har ; efter #include <stdlib.h>; <--- här också int entarning(); int main() { int resultat; randomize(); //ingår normalt i stdlib <---- gör inte alls resultat=entarning(); cout << "Första kastet= " <<resultat <<endl; resultat=entarning(); cout <<"Andra kastet =" <<resultat <<endl; getch(); } int entarning() { int antprickar; antprickar=random(6)+1; //random ingår normalt i stdlib return (antprickar); }

#include <iostream> #include <cstdlib> // standard c++ #include <ctime> // för time baserat på klockan using namespace std; int dice(); int main(int argc, char **argv) { srand(time(NULL)); // en skickar in time för att generera random tal. results=dice(); cout << endl << "First try= " << results << endl; results=dice(); cout << endl << "Second try= " << results << endl; return(0); } int dice() { int chance; chance=random() % 11; // random som kör modulus, kommer välja ett tal mellan 0 & 10 return(chance); }

Försök att ha någon form av ordning vid include och namespace, samt att hålla koden i samma format hela tiden så dina << inte flyger ihop med andra eftersom blir jobbigt att läsa.
Sedan försök att undvika .h libs. Sedan för att slippa hålla på med pause kan du köra den med hjälp av terminalen.

Visa signatur

Arch - Makepkg, not war -||- Gigabyte X570 Aorus Master -||- GSkill 64GiB DDR4 14-14-15-35-1T 3600Mhz -||- AMD 5900x-||- Gigabyte RX6900XT -||- 2x Adata XPG sx8200 Pro 1TB -||- EVGA G2 750W -||- Corsair 570x -||- O2+ODAC-||- Sennheiser HD-650 -|| Boycott EA,2K,Activision,Ubisoft,WB,EGS
Arch Linux, one hell of a distribution.

Permalänk
Medlem
Skrivet av Dalton Sleeper:

int main() { ... return 0; // funktionen skall returnera en int, så det gör vi }

Inte så viktigt men kanske mer intressant är att man faktiskt inte behöver returnera något från main i C++. Om man utelämnar return-satsen i main så returneras automatiskt 0. Det gäller dock endast main.

Och Commanders exempel är inte riktigt rätt. Du ska använda srand och rand, inte srandom eller random. srandom och random är POSIX-funktioner och inte standard C++-funktioner, så det är onödigt att använda dem när ekvivalenta standard-funktioner finns.

Jag har även sett nybörjare använda slumptal fel så många gånger att det nog är värt att säga några ord om dem också. Slumptal inom normal programmering är egentligen inte slumpmässiga i verkligheten, utan man använder psuedoslumptalsgeneratorer. Såna slumpgeneratorer "seedas" med ett värde som blir startvärdet, seed eller frö på svenska. Från detta frö så kan man sedan generera en sekvens med tal som egentligen inte är slumpmässiga men ser ut som att de är det. Samma frö kommer alltid att ge samma sekvens av tal, och man använder oftast time för att få ett någorlunda slumpmässigt frö.

I C++ så används srand för att seeda generatorn, och rand returnerar sedan nästa slumptal i sekvensen. Slumptalet som returneras är ett tal mellan 0 och RAND_MAX (som är minst 32767), och man använder ofta modulo för att få ett tal inom ett särskilt intervall som Commander visade. Viktigt att notera är att srand oftast bör anropas endast en gång i hela programmet. Det många gör fel på är att anropa srand varje gång innan man anropar rand, och eftersom time inte är så nogrann så får man då oftast samma tal flera gånger från rand.

Permalänk
Medlem

Ny bok, nya problem:)

Hej igen!

Nu har jag skaffat mig en ny bok som heter c++ direkt skriven av Jan Skansholm och har ett litet problem med ett program jag skrivit.

Uppgiften går ut på att konstruera ett program som i en lista skriver ut värdena till funktionen f(x)=3x^2 - 5x^2 + 2x - 20. Den ska skriva ut alla värden mellan -2x till 2x med 0.1 steg i taget.

Här är min kod som jag skrivit:

#include <iostream> #include <conio.h> #include <cmath> using namespace std; int main() { double x; cout << "X Y" << endl << endl; for(x=-2; x<=2.05; x+=0.1) { cout << x << " " << (3*pow(x, 3) - 5*pow(x, 2) + 2*x - 20) << endl; } getch(); } }

Problemet är att den inte adderar x med exakt 0.1 varje loop och att den inte visar att x=0 när den är 0 utan 6.38378e-016 istället. Om jag kör debuggern och går igenom koden rad för rad så ser jag att på sista for loopen är x=2.0000000000000013 istället för 2.0 som den egentligen borde vara. Hur får datorn det värdet om den bara ska addera med 0.1 efter varje loop?

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Medlem

Det är för att 0.1 inte går att representera exakt som flyttal, så din kod kommer drifta lite. Det är nått man får räkna med när man använder flyttalsrepresentation (float eller double).

När du väl accepterat det så kan du använde iostream manipulators för att sätta hur dina flyttal ska skrivas ut. T.ex. http://www.cplusplus.com/reference/iostream/manipulators/setp...

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.