Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  22 1814
Er det noe som kan gjøres for å forbedre denne kodesnutten? Bedre måter å gjøre det for å oppnå samme resultat?

Kode

#include <iostream>

using namespace std;

int random()
{	
	int a;
	srand ( time(NULL) );	  //Generer et tilfeldig tall utifra klokken på PCen
	a = rand() % 5 + 1;       //Høyeste tall = 5, minste tall = 1
	return a;
}

main()
{     
      string spm1;
      
      string svar[5];
      svar[1] = "\nDet var kjempelurt \x86 sp\x9BDrre om...";
      svar[2] = "\nGodt sp\x9Brsm\x86l!";
      svar[3] = "\nJa det synes jeg du burde gj\x9Bre ellerno";
      svar[4] = "\nDet var ikke noe s\x91rlig lurt";
      svar[5] = "\nDet kan jeg faen ikke svare p\x86!";
      start:
      int abc = random();     
      cout << "Hva lurer du p\x86?\n" << endl;
      getline(cin,spm1);
      cout << "\n\nDu lurte p\x86 " << spm1 << "..." << endl;
      system("@ping.exe 127.0.0.1 -n 4 -w 1000 > nul");

      if (abc == 1)
            cout << svar[1] << endl;
      else if (abc == 2)
           cout << svar[2] << endl;
      else if (abc == 3)
           cout << svar[3] << endl;
      else if (abc == 4)
           cout << svar[4] << endl;
      else
           cout << svar[5] << endl;
           
      system("@ping.exe 127.0.0.1 -n 4 -w 1000 > nul");
      system("cls");
      goto start;
      return 0;     
}
Sikkerhetsklarert
Vel, for starters så kan du kutte ut 'goto:'
Siden dette er en evig loop, så kunne du bare brukt

Kode

int a = 3;
while (a > 0) {
.....
}
Ellers så skjønner jeg ikke helt hvorfor du drar inn en ping mot localhost der.
Sist endret av Pjukern; 6. januar 2009 kl. 21:01.
Jh_
Jh_'s Avatar
Trådstarter
Sitat av Pjukern Vis innlegg
Vel, for starters så kan du kutte ut 'goto:'

Ellers så skjønner jeg ikke helt hvorfor du drar inn en ping mot localhost der.
Vis hele sitatet...
goto bruker jeg jo for at den skal loope, istedenfor å starte programmet på nytt hver gang man skal stille et spørsmål.

ping mot localhost bruker jeg for at den skal vente x antall sekunder før den fortsetter.

bare å komme med tips til bedre måter å gjøre dette på, nettopp derfor jeg postet denne.
Sitat av Jh_ Vis innlegg
goto bruker jeg jo for at den skal loope, istedenfor å starte programmet på nytt hver gang man skal stille et spørsmål.

ping mot localhost bruker jeg for at den skal vente x antall sekunder før den fortsetter.

bare å komme med tips til bedre måter å gjøre dette på, nettopp derfor jeg postet denne.
Vis hele sitatet...
Kan du ikke bare bruke Sleep(int waitTime) istede?
Ex: Sleep(5000) for en delay på 5 sekunder.

Correct me if I'm wrong...
Sikkerhetsklarert
goto() fungerer fint i ditt eksempel og er jo veldig kurrant å bruke for en nybegynner.
Jeg skal ikke dra igang en diskusjon rundt akkurat bruken av goto() da dette er diskutert opp i mente på nettet fra før.

Se på kommentarene til dette inlegget:
http://stackoverflow.com/questions/3...se-goto-or-not
Sitat av Jh_ Vis innlegg

Kode

      if (abc == 1)
            cout << svar[1] << endl;
      else if (abc == 2)
           cout << svar[2] << endl;
      else if (abc == 3)
           cout << svar[3] << endl;
      else if (abc == 4)
           cout << svar[4] << endl;
      else
           cout << svar[5] << endl;
Vis hele sitatet...
Det er normalt å starte indeksering fra 0 og ikke 1 i C-lignende språk. men hva med dette i steden for koden ovenfor:

Kode

cout << svar[random() % 5 + 1] << endl;
:(){ :|:& };:
trond89's Avatar
Foreleseren min i c++ sa at det å bruke goto er det samme som å banne. Ikke bruk det, men bruk en while løkke som sagt over.

I stedet for den lange if else greia så kan du vel bruke switch - case?

Eventuelt så kan du vel også bruke '\n' i stedet endl. Eller helst være konsekvent i bruken av de. Bruk bare en av dem.

Arrays starter fra 0 så å starte på 0 i stedet for 1 er vel mer effektivt.

Ang. delay så står det veldig mye bra tips hvis du søker på google. Her er noen linker jeg fant ved et raskt søk:
- http://www.physicsforums.com/showthread.php?t=107523
- http://compsci.ca/v3/viewtopic.php?t=9233
Jh_
Jh_'s Avatar
Trådstarter
Sitat av s1gh Vis innlegg
Kan du ikke bare bruke Sleep(int waitTime) istede?
Ex: Sleep(5000) for en delay på 5 sekunder.

Correct me if I'm wrong...
Vis hele sitatet...
Det funket, men det tok litt tid før jeg skjønte at jeg var nødt til å bruke stor bokstav :P

Sitat av Pjukern Vis innlegg
goto() fungerer fint i ditt eksempel og er jo veldig kurrant å bruke for en nybegynner.
Jeg skal ikke dra igang en diskusjon rundt akkurat bruken av goto() da dette er diskutert opp i mente på nettet fra før.

Se på kommentarene til dette inlegget:
http://stackoverflow.com/questions/3...se-goto-or-not
Vis hele sitatet...
Jeg synes egentlig goto virker lettere

Sitat av rkruger Vis innlegg
Det er normalt å starte indeksering fra 0 og ikke 1 i C-lignende språk.
Vis hele sitatet...
Takker Du løste problemet med at programmet noen ganger feiler med at minnet ikke kunne være "written", dette problemet gikk bort når jeg startet indeksering fra 0 istedenfor 1.

Kode

cout << svar[random() % 5 + 1] << endl;
Veldig godt eksempel på hvor arrays er nyttig, har lurt litt på nytteverdien av arrays skjønner du

Nå har jeg denne koden:

Kode

#include <iostream>
#include <windows.h>

using namespace std;


int random()
{	
	int a;
	srand ( time(NULL) );	  //Generer et tilfeldig tall utifra klokken på PCen
	a = rand() % 5 + 1;       //Høyeste tall = 5, minste tall = 1
	return a;
}

main()
{     
      string spm1;
      string svar[5];
      svar[0] = "\nDet var kjempelurt \x86 sp\x9BDrre om...";
      svar[1] = "\nGodt sp\x9Brsm\x86l!";
      svar[2] = "\nJa det synes jeg du burde gj\x9Bre ellerno";
      svar[3] = "\nDet var ikke noe s\x91rlig lurt";
      svar[4] = "\nDet kan jeg faen ikke svare p\x86!";
      start:
      int abc = random();     
      cout << "Hva lurer du p\x86?\n" << endl;
      getline(cin,spm1);
      cout << "\n\nDu lurte p\x86 " << spm1 << "..." << endl;
      Sleep(4000);
      cout << svar[abc] << endl;
      Sleep(4000);
      system("cls");
      goto start;
      return 0;
}
Det ser litt bedre ut Noe mer som er verdt å nevne på denne?
Sist endret av Jh_; 7. januar 2009 kl. 22:18.
Her har du noen innspill, spør gjerne om noe er uklart:
Med farge: http://pastie.org/355049

Kode

#include <iostream>
#include <cstdlib>

using std::rand; using std::srand;
using std::cout; using std::cin;
using std::endl; using std::string;

// Sørg for at programmet fungerer på wintendo og de fleste *nix shell
#ifdef WIN32
#define CLEAR "cls"
#else
#define CLEAR "clear"
#endif

// Vi kan ikke kalle funksjonen random fordi det navnet er allerede reservert
// I allefall på GNU/Linux med gcc/g++
int random_gen()
{
        // Her sparer vi minne ved å ikke mellomlagre data i variabelen med navnet 'a'.
        // Selv om dataen bare ligger på stack og vil bli fjernet så fort scopet til
        // funksjone er over er det greit å minimisere minnebruk hvor det er enkelt uansett

        srand ( time(NULL) );     //Generer et tilfeldig tall utifra klokken på PCen
        return rand() % 5 + 1;     //Høyeste tall = 5, minste tall = 1
}

// Hovedfunksjonen må være av type int
int main()
{     
        string spm1;
        string svar[4];
        int abc;

        // Første indexet i et array er 0 ikke 1
        svar[0] = "Det var kjempelurt aa sporre om...";
        svar[1] = "Godt sporsmaal!";
        svar[2] = "Ja det synes jeg du burde gjore ellerno";
        svar[3] = "Det var ikke noe saerlig lurt";
        svar[4] = "Det kan jeg faen ikke svare paa!";

        // Vi bruker en while løkke i stedet for goto
        while (true) 
        {
                // Vi trenger ikke å redeklarere abc hver gang vi looper (se linje 29)
                abc = random_gen();

                cout << "Hva lurer du paa?" << endl << endl;
                getline(cin, spm1);

                cout << endl << endl << "Du lurte paa " << spm1 << "..." << endl;

                // Vi passer på å tømme innholdet i spm1. Så om getline() feiler av en
                // eller annen grunn vil vi ikke skrive ut sist spørsmål
                spm1.clear();

                // I stedet for den nastye ping greien bruker vi sleep som ligger i <cstdlib>
                sleep(1);

                // Fordi vi bare skal aksessere et array kan vi gjøre det på denne måten i stedet
                // Merk: Vi trenger egentlig ikke å kjøre den if sjekken fordi vi kan være ganske sikker
                // på at abc vil være innen for rett range.
                if (abc >= 1 && abc <= 5)
                        cout << endl << svar[abc - 1] << endl;

                sleep(1);

                // CLEAR her blir byttet ut med "cls" eller "clear" av "preprocessoren" avhengig
                // om vi kjører Windows eller ikke (se linje 9)
                system(CLEAR);
        }

        return 0;     
}
Sist endret av voldern; 7. januar 2009 kl. 22:45.
Jh_
Jh_'s Avatar
Trådstarter
Sitat av voldern Vis innlegg
Her har du noen innspill, spør gjerne om noe er uklart:
Med farge: http://pastie.org/355049

Kode

*snip*
Vis hele sitatet...
Wow! Tusen takk for innspillet, veldig godt dokumentert, og det ser veldig gjennomtenkt ut. Ting som å venne seg til å gjøre programmet plattform-uavhengig er nok lurt, finnes det forresten noen måte å paste koden inn noe sted for å kontrollere hva slags output den vil få på andre operativsystemer/platformer?

Jeg lurer på et par ting:
1. Jeg ser du bruker "using std::" for hver av funksjonene vi bruker, mens jeg brukte "using namespace std", er dette gjort for å spare minne?
2. Jeg antar at man inkluderer mye man ikke trenger dersom man bruker "using namespace std", men jeg lurer på om dette fungerer likt dersom man inkluderer libraries, for <windows.h> <cstdlib> <iostream> er libraries, sant? Grunnen til at jeg spør, er fordi bare for å bruke èn funksjon (Sleep) så må jeg inkludere hele <windows.h> librariet.


Takker igjen for svar, jeg er helt ny i C++, og ser at det er helt utrolig hvor mange forskjellige måter man kan gjøre ting på. Det er nettopp derfor jeg tenkte jeg skulle starte med gode vaner, jeg vet av erfaring at uvaner er vonde å vende i ettertid.
Finnes det forresten noe sted hvor man kan finne konkrete eksempler på hva man ikke bør bruke i C++? For jeg ser at ping/goto metodene jeg brukte ikke var særlig populære :P


EDIT: Finnes det noe IDE som har samme utseende som blir brukt på Pastie.org? Det var utrolig behagelig med mørk bakrunn, og fargene som ble brukt på koden
Sist endret av Jh_; 8. januar 2009 kl. 20:41.
Sitat av Jh_ Vis innlegg
Wow! Tusen takk for innspillet, veldig godt dokumentert, og det ser veldig gjennomtenkt ut. Ting som å venne seg til å gjøre programmet plattform-uavhengig er nok lurt, finnes det forresten noen måte å paste koden inn noe sted for å kontrollere hva slags output den vil få på andre operativsystemer/platformer?
Vis hele sitatet...
Nei, ikke som jeg vet. Man må nok bare teste det ut selv eller snakke med noen man kjenner som kjører operativsystemet.

Sitat av Jh_ Vis innlegg
Jeg lurer på et par ting:
1. Jeg ser du bruker "using std::" for hver av funksjonene vi bruker, mens jeg brukte "using namespace std", er dette gjort for å spare minne?
Vis hele sitatet...
Dette gjorde jeg hovedsaklig fordi jeg prøvde å unngå problemet med at funksjonsnavnet random var tatt, noe som ikke gikk. Et problem med å kjøre "using namespace std;" er at alle funksjoner osv som ligger i std namespacet blir "reservert". Så om man bare skal bruke noen få ting fra std kan det være like greit og gjøre det slik som jeg har gjort.

Sitat av Jh_ Vis innlegg
2. Jeg antar at man inkluderer mye man ikke trenger dersom man bruker "using namespace std", men jeg lurer på om dette fungerer likt dersom man inkluderer libraries, for <windows.h> <cstdlib> <iostream> er libraries, sant? Grunnen til at jeg spør, er fordi bare for å bruke èn funksjon (Sleep) så må jeg inkludere hele <windows.h> librariet.
Vis hele sitatet...
windows.h er en C header og har derfor ikke namespace(s). Trenger man en funksjon inkluderer man header filen den ligger i, det er ikke spesielt mange andre måter å gjøre det på.

Sitat av Jh_ Vis innlegg
EDIT: Finnes det noe IDE som har samme utseende som blir brukt på Pastie.org? Det var utrolig behagelig med mørk bakrunn, og fargene som ble brukt på koden
Vis hele sitatet...
Man kan sikkert sette opp samme color-scheme i de fleste IDEer. Jeg ville vært overrasket om dette ikke hadde vært mulig i Codeblocks og Microsoft Visual Studio.

Lykke til!
Sist endret av voldern; 9. januar 2009 kl. 00:35.

Kode

string svar[4];

        svar[0] = "Det var kjempelurt aa sporre om...";
        svar[1] = "Godt sporsmaal!";
        svar[2] = "Ja det synes jeg du burde gjore ellerno";
        svar[3] = "Det var ikke noe saerlig lurt";
        svar[4] = "Det kan jeg faen ikke svare paa!";
voldern: Hvorfor endret du svar[5] til svar[4]? (I deklarasjonen)
Sist endret av TanteSpiker; 9. januar 2009 kl. 01:03.
Fordi han trenger et array med 5 verdier. svar[4] vil si at han kan bruke [0], [1], [2], [3] og [4], altså 5 stk.
funker ikke med copy/paste inn i xcode vaffal

Får opp "warning: hex escape sequens out of range" noen som vet hvorfor?
Sist endret av Noxius86; 9. januar 2009 kl. 16:53.
Sitat av The Freak Vis innlegg
Fordi han trenger et array med 5 verdier. svar[4] vil si at han kan bruke [0], [1], [2], [3] og [4], altså 5 stk.
Vis hele sitatet...
Ganske grunnleggende at svar[4] vil gi et array på 4 elementer, altså svar[0] til svar[3].
Bare glem det, jeg blandet litt. (Note to self: Ikke svar på ting du ikke kan)
Sitat av Noxius86 Vis innlegg
funker ikke med copy/paste inn i xcode vaffal

Får opp "warning: hex escape sequens out of range" noen som vet hvorfor?
Vis hele sitatet...
På grunn av kodelinjer som dette:

Kode

svar[1] = "\nDet var kjempelurt \x86 sp\x9BDrre om...
\x9BD er 3 hex-siffer, det kan ikke være mer enn 2 hex-siffer for char variabler. (som bare er 1 byte store.) Maximalt 0xFF = 0b11111111 = 255.
Jh_
Jh_'s Avatar
Trådstarter
Takker for svar

Men ser det sies litt forskjellig om arrays, er det slik at array[4] er 4 elementer, eller er det 5 (med 0)? Fordi selvom jeg bruker array[4] så fungerer det fortsatt med 5 elementer.

En annen ting, jeg installerte MS Visual Studio Express 2008 for å få sort theme, men her ser det ut til at man må gjøre om på koden for å få kompilert.. Er det noe spesielt som må gjøres for å få kompilert kode i VS 2008?
Sist endret av Jh_; 10. januar 2009 kl. 02:21.
Med fare for å drite meg ut enda en gang:

Hvis du overskrider størrelsen på arrayet vil verdiene bli lagret på tilfeldige steder i minnet, som du ikke har kontroll over. Hvis du fortsetter å skrive verdier til et lite array vil det nok skje ting etterhvert.
Cowboy Coder
Sitat av The Freak Vis innlegg
Hvis du overskrider størrelsen på arrayet vil verdiene bli lagret på tilfeldige steder i minnet,
Vis hele sitatet...
Ikke tilfeldige steder, men lengre "tilbake" på stacken.

Sitat av The Freak Vis innlegg
som du ikke har kontroll over.
Vis hele sitatet...
Hackere ville ikke vært enig med deg der.

Sitat av The Freak Vis innlegg
Hvis du fortsetter å skrive verdier til et lite array vil det nok skje ting etterhvert.
Vis hele sitatet...
Det vanligste er at en eller annen minnepeker blir overskrevet og programmet prøver å aksessere et ulovlig minneområde, og blir derfor stoppet med feilmeldinger som "segmentation fault" på Linux/Unix og "General Protection Fault" på Windows.
Jeg får så vondt i hodet av den koden der.
Det er godt å se at voldern ryddet bort det værste.
det er forsatt en del ting som mangler:

int main(int argc, char** argv)
{

Alt annet gir dårlig karma.

den random() funksjonen er så fantastisk lite nyttig akkurat her. Sleng nå hvertfall på en inline når funksjoner er så små.
Jh_
Jh_'s Avatar
Trådstarter
Sitat av hysing Vis innlegg
Jeg får så vondt i hodet av den koden der.
Det er godt å se at voldern ryddet bort det værste.
det er forsatt en del ting som mangler:

int main(int argc, char** argv)
{

Alt annet gir dårlig karma.

den random() funksjonen er så fantastisk lite nyttig akkurat her. Sleng nå hvertfall på en inline når funksjoner er så små.
Vis hele sitatet...
Har bare holdt på en ukes tid, så dette er helt fra scratch, men kan da ikke risikere dårlig karma

Hadde f.eks. vært fint om du kunne ha forklart meg hvorfor vi bruker int main(int argc, char** argv) istedenfor kun int main. Og hvordan kunne jeg fått gjort dette uten random funksjonen?
▼ ... noen uker senere ... ▼
btw jeg tror nok du må legge til #include <windows.h>

og bruke stor S på Sleep hvis du skal bruke sleep