Permalänk
Medlem

C++: en nybörjarfråga

Hej! Den här koden är säkert busenkel för de flesta, men jag som nybörjare hittar inte rätt på det. Det som kan vara lite småklurigt här dock är att jag inte får använda mig av kod som boken jag läser inte lärt ut än.. Så t.ex. får här inte användas av några snitsiga IF typer m.m. Jag tror att koden som jag skrivit är hyffsat korrekt men det är just en detalj som inte stämmer. Programmet skall i slutändan skriva ut totalförsäljning för 3 enskilda år och sen i slutet summera de tre åren. men vad det gör nu är att den lägger ihop årens resultat eftersom för att sen skriva ut en totalsumma som är alldeles för hög. Jag har nyss lärt mig hur nästlade slingor fungerar så jag är ganska säker på att felet ligger där någonstans, men å andra sidan är jag ingen fena på 2D vektorer heller... Men självklart så är det just bara de metoderna som jag får använda mig av. Kan någon se vart jag bör möbelera om för ett vettigt resultat?

#include <iostream>
using namespace std;
const int ar = 3;
const int manad = 12;
int main()
{
char *manader[manad] =
{
"Januari",
"Februari",
"Mars",
"April",
"Maj",
"Juni",
"Juli",
"Augusti",
"September",
"Oktober",
"November",
"December"
};
int salj[manad][ar] =
{
{13, 14, 16},
{17, 15, 12},
{20, 18, 17},
{12, 13, 19},
{22, 21, 10},
{13, 17, 22},
{14, 18, 19},
{28, 22, 14},
{17, 16, 12},
{15, 19, 23},
{23, 21, 24},
{17, 11, 19}
};
int tot = 0;
int kommande = 0;
int perar;
for (int year = 0; year < ar; year++)
{
cout << "Ar " << year << " saldes ";
for (int Manad = 0; Manad < manad; Manad++)
{
tot += salj[Manad][year];
perar = tot;
};

cout << perar << " bocker.\n";
kommande += tot;
};
cout << kommande << " bocker saldes under de tre aren.\n";
cin.get();
cin.ignore('\n', 1024);
return 0;
}

Tack på förhand för eventuella tips!

Fotnot: jag använder mig av o och a istället för åäö eftersom jag ännu inte klurat ut hur jag får MS-DOS att skriva ut de tecknena, kan du hjälpa till även här så skulle jag uppskatta det enormt.

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk

Lite läsning som kanske kan fixa ditt åäö problem:

Jag vet tyvärr ingen snygg lösning på detta problem som fungerar överallt. Visserligen kan man använda alternativa konsoller i Windows som t ex bash, men då måste ju också alla andra personer som man vill ska kunna köra programmet ha det.

Här är en liten sammanfattning jag skrev ihop:

Anledningen till att åäöÅÄÖ (och alla andra "udda" tecken som é, ü, osv) inte ser rätt ut i konsollen, beror på att den som standard är satt till OEM-850 medans allt annat kör Windows-1252 (Latin I). Dessa är inte helt kompatibla då vissa tecken har helt olika koder.

Det finns två sätt att lösa det på, fixa koden eller fixa konsollen.

Lösning 1: (Fixa koden)

Byt ut alla tecken (alternativt använda t ex UltraEdit och köra ANSI-to-OEM):

å = \x86
ä = \x84
ö = \x94
Å = \x8F
Ä = \x8E
Ö = \x99

T ex:
printf("\x86\x84\x94\x8F\x8E\x99\n"); // skriver ut åäöÅÄÖ

Men det är inte alltid detta fungerar så bra; för om man t ex sparar text till en fil och öppnar den med notepad, så ser alla åäöÅÄÖ ut som †„”Ž™. Det går dock att fixa genom att sätta fonten till Terminal.
Knivigare blir det om det är andra (Windows-)program som ska öppna filen, t ex om det är en lista över filer (som en m3u-playlist).

Lösning 2: (Fixa konsollen)

Högerklicka på titelraden för konsollfönstret, välj Properties/Egenskaper.
Gå till Font, sätt den till "Lucida Console", tryck OK och välj att det ska gälla alla fönster.

Lösning 2a: (Fungerar endast i WinNT/2K/XP)
Lägg till i din kod:
#include <windows.h>

och lägg till detta i början av main:
SetConsoleOutputCP(1252);

Lösning 2b:
Skriv i konsollen: (detta måste göras varje gång du startar en ny konsoll, men det går att lösa genom att skapa en genväg till "cmd.exe /c chcp 1252")

Om du kör WinNT/2K/XP:
chcp 1252

Om du kör Win9X:
mode con cp select=1252

Har tyvärr inte tid att kolla igenom ditt inlägg efter felet elelr mitt så det verkligen stämmer.

Visa signatur

| i5 10600k@4,7 Ghz | AMD 6800 | 4Ghz RAM | 1 TB m.2 |

Permalänk
Medlem

Tack för åäö lösningen! \x86 etc. fungerade fint. Men eftersom jag kör Visual C++ 2005 så fungerar inte #include <windows.h> ("No such file or directory").

Jag får nog lära mig att korta ner mina frågor om jag vill ha ett snabbt svar, mitt ovanstående problem är inte alls krångligt egentligen :/

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk
Medlem

Antar att du kör Microsoft visual studio 2005 express... och då har man inte Platform SDKn inbakad så man får installera den själv...

Info om SDKn och hur du tankar hem och installerar finns på
http://en.wikipedia.org/wiki/Platform_SDK

Permalänk
Medlem

Jag laddade ner SDKn, men jag vet inte riktigt vad det är meningen att den skall göra? Det står att jag får tillgång till hundratals nya bibliotek och 1.700 headers m.m. men inte fungerar <windows.h> för det

Edit: Och ja, jag använder Express, rekommenderar du att jag skall få tag på en icke Express variant istället?

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk

Det var år och dar sedan jag senast lekte med C++, men jag har ett tips. Vid felsökning av enklare program som detta, kan det hjälpa att lägga till extra utskrifter av alla berörda variabler. Så du kan se om de någon gång får konstiga värden.

En sak jag störde mej lite på i koden var Manad och manad. Jag minns inte om stor/liten bokstav i variabelnamn har betydelse, men tycker ändå om att ta det säkra före det osäkra. Jag tror att jag brukade börja alla iteratorers namn med "it", så "itManad" skulle nog passa bättre i for-loopen. Då syns det i alla fall tydligt vad variabeln i fråga är till för.

Hoppas du hittar felet med koden. Jag hatade när allt såg felfritt ut, men fortfarande bara skrev ut nonsens.

Visa signatur

"Robots have shiny metal posteriors which should not be bitten."

Permalänk

Ange sökvägen.

#include "c:\sökväg\windows.h"

Och som don_m säger, att deklarera 2 olika variabler med samma namn förutom stor/liten begynnelsebokstav är väldigt dålig programmerings sed.

Permalänk
Medlem

#include <iostream> using namespace std; const int ar = 3; const int manad = 12; int main() { // manader är orelevant int salj[manad][ar] = { {13, 14, 16}, {17, 15, 12}, {20, 18, 17}, {12, 13, 19}, {22, 21, 10}, {13, 17, 22}, {14, 18, 19}, {28, 22, 14}, {17, 16, 12}, {15, 19, 23}, {23, 21, 24}, {17, 11, 19} }; int perAr; int tot = 0; for (int year = 0; year < ar; year++) { perAr = 0; cout << "Ar " << year << " saldes "; for (int itManad = 0; itManad < manad; itManad++) { perAr += salj[itManad][year]; } tot += perAr; cout << perAr << " bocker.\n"; } cout << tot << " bocker saldes under de tre aren.\n"; return 0; } }

Du nollställde aldrig countern, skrev om din kod till ovanstående för att försöka hitta felet. Är dessvärre för trött för att tala om exakt, men du kan ju jämföra din och min kod så kanske du ser vad problemet är.

Visa signatur

Stationär: Intel-baserad, Arch + KDE
Bärbar: Dell XPS 13, Arch + KDE

Permalänk
Citat:

Ursprungligen inskrivet av don_Martin
Det var år och dar sedan jag senast lekte med C++, men jag har ett tips. Vid felsökning av enklare program som detta, kan det hjälpa att lägga till extra utskrifter av alla berörda variabler. Så du kan se om de någon gång får konstiga värden.

En sak jag störde mej lite på i koden var Manad och manad. Jag minns inte om stor/liten bokstav i variabelnamn har betydelse, men tycker ändå om att ta det säkra före det osäkra. Jag tror att jag brukade börja alla iteratorers namn med "it", så "itManad" skulle nog passa bättre i for-loopen. Då syns det i alla fall tydligt vad variabeln i fråga är till för.

Hoppas du hittar felet med koden. Jag hatade när allt såg felfritt ut, men fortfarande bara skrev ut nonsens.

C++ 'är' case-sensitive, så Manad och manad är två olika variabler. Och istället för att börja debugga genom att köra med utskrifter lite överallt är det väl ett perfekt tillfälle att lära sig lite riktig debugging...

Permalänk
Medlem
Citat:

Jag laddade ner SDKn, men jag vet inte riktigt vad det är meningen att den skall göra? Det står att jag får tillgång till hundratals nya bibliotek och 1.700 headers m.m. men inte fungerar <windows.h> för det

Edit: Och ja, jag använder Express, rekommenderar du att jag skall få tag på en icke Express variant istället?

Gör så här, starta Visual C++ Express.

1. Välj "Tools->Options" i menyn.
2. I dialog rutan, expandera "Projects And Solutions".
3. Välj "VC++ Directories".
4. Ändra val i valrutan under "Show Directories For" till "Include Files".
5. Klicka på mapp-ikonen, om du hovrar så står det "New Line".
6. Klicka på "..." knappen i den nya raden och bläddre till stället där du installerade PDSK, och välj mappen "Include" och klicka "Open".
7. Ändra val i valrutan under "Show Directories For" till "Library Files".
8. Klicka på mapp-ikonen "New Line".
9. Klicka på "..." knappen i den nya raden och bläddra till stället där du installerade PDSK och välj mappen "Lib".
10. Klicka på "Ok".

Efter det borde allt fungera (tror jag)

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Talavis
Du nollställde aldrig countern

*Slår handen mot pannan*

DÄR har vi det! Jag behövde bara nollställa och möbelera om lite så fungerade min kod också, tack Talavis!

Och nu till åäö problemet; Jag försökte följa datorsakers tips om att ange sökvägen till Windows headern, men det ville inte fungera utan jag fick felmeddelandet: "Cannot open include file: 'sdkddkver.h': No such file or directory" vilket jag inte alls förstår mig på, ingenstans i min kod finns teckenföljden "sdkddkver.h". Jag prövade också alla möjliga kombinationer av citationstecken och < > för att inkludera filen men det ville sig inte.

Jag följde även pagos anvisningar, men nu när jag efter det skrev in \x84 igen för att få tecknet 'ö' så får jag felmeddelandet "error C2022: '2380' : too big for character" vilket jag googlade och hittade något som verkar relaterat men som jag inte förstår mig på:

"'number' : too big for character

The octal number following a backslash (\) in a character or string constant is too big to represent a character."

Tack för alla tips! och låt dem gärna komma, jag tror jag lär mig mycket nyttigt av det här.

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk

Nej det är windows.h som har en include till sdkddkver.h. Men det funkade efter du angav sökvägen i VS efter pagos instruktioner antar jag?

Permalänk
Medlem

Nej, som det är nu fungerar ingenting faktiskt. Jag får upp samma felmeddelande både när jag försöker skriva \x84 eller vill inkludera windows.h: Cannot open include file: 'windows.h': No such file or directory.

Jag följde pago's instruktioner noggrant så där ska det inte vara några problem. Jag trodde inte att det skulle kunna vara sådana problem med ett till synes enkelt problem.. Några fler tips?

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk

Jag har aldrig använt express versionen men jag tycker det borde funkat. Men om du kopierar alla header filer till VS standard include map ska det nog funka. Får väl slänga med lib filerna med, jag ska kolla vart de borde ligga.

Edit:

C:\Program\Microsoft Visual Studio 8\VC\include för *.h

C:\Program\Microsoft Visual Studio 8\VC\lib för *.lib

Du borde hitta dom i

C:\Program\Microsoft SDKs\Windows\v6.0\Include

C:\Program\Microsoft SDKs\Windows\v6.0\Lib

Kan vara lite anorlunda sökväg i express versionen kanske men du lär väl hitta den om du letar lite.

Och just det, lär väl kanske bli en del dubbletter men behåll orginal filerna.

Permalänk
Medlem

Såja! nu får jag inkludera windows.h. Så med hjälp av SetConsoleOutputCP(1252); och ändring av typsnitt till Lucida Console så kan jag skriva ö i koden och det visas som det ska.

Men det verkar som att efter omstart av datorn så återgår typsnittet till Bitmappteckensnitt.. Fast jag får anse det som överkurs att fixa till det nu. Jag är nöjd som det är. Plus att det här är inga program som andra behöver ta del av ändå

Tack för all hjälp datorsaker och alla andra! Sweclockerscommunityt gjorde det igen

Visa signatur

AMD Athlon 64 3k+, ASUS A8N-SLI deluxe, NVIDIA GeForce 6200 TurboCache, Q-TEC PSU 650W, NVIDIA nForce nätverkskort, SB Audigy 2, 2 x 1GB Corsair PC3000 DDR-SDRAM, WD Raptor 36.7GB SATA 8MB 10k RPM och Maxtor 200GB SATA

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hejsan123
C++ 'är' case-sensitive, så Manad och manad är två olika variabler. Och istället för att börja debugga genom att köra med utskrifter lite överallt är det väl ett perfekt tillfälle att lära sig lite riktig debugging...

Han menade la att det inte var så bra att skriva så bara? Klart det funkar, men det är inte bra att döpa sina variabler på det viset

Edit: Såg nu att han faktiskt frågade om det var case sensitive.