Hjälp med c++(igen)

Diskussion i 'Off Topic' startad av googleye, 29 sept 2011.

  1. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Då var det dags för programmet att hålla på med (för mig)oförklarligt beteende, har en liten kodsnutt jag klistrat in här under. Det jag vill ska hända är att när det står |uttag| kr räknas... så ska punkterna dyka upp en efter en med en liten fördröjning och för det var det bästa jag kunde komma på en for( sats. Koden kompileras korrekt men det som istället händer är att fördröjningen hamnar innan |uttag| kr räknas... dyker upp. Och då dyker hela meningen upp med punkter och allt. Någon som kan lösa det?

    Här är kodsnutten:

    Kod:
    case 2:
            cout << "Hur mycket pengar vill du ta ut(endast j\x86mna hundratal)? ";
            cin >> uttag;
                if (uttag > behallning){
                    cout << "Du har inte s\x84 mycket pengar i kontot!" << endl
                    << "Din balans \x86r: " << behallning << " kr." << endl;
                }
                else{
                    cout << uttag << " kr r\x86knas";
                    for (int loop=0;loop<100000000;loop++){
                        //pausar
                    }
                    cout << ".";
                    for (int loop2=0;loop2<100000000;loop2++){
                        //pausar
                    }
                    cout << ".";
                    for (int loop3=0;loop3<100000000;loop3++){
                        //pausar
                    }
                    cout << "." << endl;
                    for (int loop4=0;loop4<100000000;loop4++){
                        //pausar
                    }
                    cout << "Ta sedlarna." << endl;
                }
     
    Last edited: 29 sept 2011
  2. signoc

    signoc Kid Droid Medlem

    Blev medlem:
    17 dec 2010
    Inlägg:
    56
    Mottagna gillanden:
    7

    MINA ENHETER

    Kan vara så att cout buffrar outputen, dvs den väntar till ett senare tillfälle innan den skriver ut.

    Pröva cout.flush(); inför varje paus så borde den skriva ut buffern.

    Annars så kan tomma for-loopar optimeras bort av kompilatorn beroende på optimeringsinställningar. För kompilatorn är det tydligt att variablerna loop till loop4 inte används till någon ting, varför vissa optimeringsinställningar rationaliserar bort dem helt och hållet.
     
  3. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Tack nu gick det, passar på att fråga något liknande. Går det att göra samma sak med |uttag|, att summan skrivs ut en siffra i taget?

    Problemet med for loopar där är att koden blir lång och onödig och att hela summan är en int. Går det att göra?
     
  4. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Allting går :-) Nu är inte jag så hemma på C++ utan bara C, men i C skulle jag t ex lösa det genom att använda sprintf eller ännu hellre snprintf för att placera beloppet i en sträng och sedan skriva ut ett tecken i taget från den strängen.

    Som sagt, en loop är inte någon lyckad lösning för att skapa en paus. Hur lång den pausen blir beror väldigt mycket på vilken dator du kör på, vilken kompilator du använder samt vilka kompileringsflaggor du använder. Du kan som sagt bli helt utan paus med en smart kompilator som optimerar bort din nonsens-loop.

    Bättre är att använda någon paus-funktion som erbjuds av din miljö. Om du är i en posix-miljö har du tillgång till sleep och nanosleep.

    m v h Henrik
     
  5. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Om det inte framgick av koden skriver jag fortfarande konsol program så jag fatta i princip inte ett ord av vad du sa :P Fast det där med att placera beloppet i en sträng, vad jag vet motsvarar det en char i c++. Hur skriver jag ut varje bokstav för sig själv?

    Ska kolla om det finns nån funktion för pauser i c++, för övrigt använder jag gcc med code::blocks i ubuntu när jag programmerar.
     
  6. Etzolin

    Etzolin Teen Droid Medlem

    Blev medlem:
    12 sept 2010
    Inlägg:
    463
    Mottagna gillanden:
    118
    Operatör:
    Tre

    MINA ENHETER

    Operatör:
    Tre
    Platta:
    Apple iPad Pro
    Inkludera "#include <ctime>".

    Anledningen till att man använder en loop är för att man vill göra en sak flera gånger. I ditt fall är det att skriva ut en punkt :) Är inte helt hemma med C++, och har inte testat det här men det borde fungera. Om inte så får du ju iaf ett exempel på hur du kan lösa det hela :)

    Kod:
    for(int dots = 0; dots < 4; dots++) {
        cout << ".";
        sleep(1000); // Dröjsmål i ms
        if(dots == 3) { // Radbryter efter sista punkten
            cout << endl;
        }
    }
    EDIT: Såg att du körde Ubuntu, sleep() ska finnas inkluderad i gcc då såg jag efter en snabb googling
     
  7. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Prova att skriva följande i konsolen:

    man snprintf
    man 3 sleep

    Den sistnämnda sidan är kort och lättöverskådlig, där ser du hur du med hjälp av sleep enkelt kan pausa ett antal hela sekunder. Om du vill pausa kortare än så kan du i stället läsa:

    man nanosleep

    Nanosleep är lite mer komplicerat att använda, då måste du fylla en struktur med data.

    Snprintf har en riktigt lång manualsida, enklast är nog om jag ger dig ett exempel:

    Kod:
    #include &lt;stdio.h>
    #include &lt;unistd.h>
    #include &lt;string.h>
    
    int main(int argc, char **argv)
    {
       int belopp = 3497;
       char string[10];
       int i;
    
       snprintf(string, 10, "%d", belopp);
       for(i=0; i&lt;strlen(string); i++)
       {
          printf("%c", string[i]);
          fflush(stdout);
          sleep(1);
       }
       printf("\n");
       return 0;
    } /* main */
    
    Se ovan.

    Jag som föredrar C kompilerar min exempelkod ovan enligt följande:

    Kod:
    gcc -o string -pedantic -Wall string.c
    Flaggorna -pedantic och -Wall ger mig några extra varningar om jag skulle slarva.

    Men du som föredrar C++ kan precis lika gärna kompilera koden med:

    Kod:
    g++ -o string2 string.c
    Som kuriosa kan nämnas att jag testade dessa kommandon på ovanstående kod och då noterar att C-kompilatorn genererar en binär som blir lite mindre än C++-binären.

    m v h Henrik
     
    Last edited: 1 okt 2011
  8. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Code::blocks kompilerar åt dig men när jag innan kompilerade i terminalen använde jag g++ -o hej hej.cpp.

    Ang era #include strängar så syns det inte vilken fil som ska skrivas in, kan ni skriva dom utan >< ?

    Tack!
     
  9. Reconnnn

    Reconnnn Professional Droid Hedersmedlem

    Blev medlem:
    9 mar 2010
    Inlägg:
    2 809
    Mottagna gillanden:
    263

    MINA ENHETER

    Mest lite nyfiken varför börjar du programmera i c++ som är ett svårt språk för en nybörjare tycker jag och inte java eller pascal som är betydligt enklare att börja med.

    Själv kan jag c# och java relativt väl och en del c++. Missförstå mig inte tycker det är skit bra att du lär dig c++ då det är ett riktigt bra språk men det är svårt.
     
  10. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Sorry, jag redigerade mitt inlägg och knackade html-kod för &lt; , då syns det bättre.

    m v h Henrik
     
  11. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Bad om att få börja med java men för att få godkänt i kursen måste man följa kursplanen och den går ut på att lära sig c++ :-P

    Tack för editen

    Sent from my HTC Desire HD
     
  12. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Har grubblat på era exempel ett tag nu men lyckas inte göra det jag vill. Etzolin, din kod funkade bra förutom att sleep är i sek och inte millisek. Henca, tog delar av koden och satte mina integers i den och det fungerade bra, vill dock att "" kr räknas, skrivs ut en och en också. Provade sätta de orden i en string men jag lyckades inte, och eftersom att man med sleep som minst kan ha en sekunds intervaller tar det för lång tid att skriva ut siffran. Förlorade precis allt jag skrev pga att datorn hängde sig så jag postar det jag har om en stund.
     
  13. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Sådär nu har jag den här koden och allt fungerar bra:

    HTML:
    #include <iostream>
    #include <time.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    using namespace std;
    
    int main(void)
    {
       int behallning = 1000;
       int insattning, uttag, val, val2, i, f;
       char minneslapp, j, n;
       char string[10];
       char string2[] = "kr r\x86knas";
    Kod:
    [HTML]else{
                    snprintf(string, 10, "%d", uttag);
                    for(i=0; i<strlen(string); i++){
                        printf("%c", string[i]);
                        fflush(stdout);
                        sleep(1);
                    }
                    snprintf(string, 10, "%d", string2);
                    for(f=0; f<strlen(string2); f++){
                        printf("%c", string2[f]);
                        fflush(stdout);
                        sleep(1);
                    }
                    for(int dots = 0; dots < 3; dots++) {
                        cout << ".";
                        cout.flush();
                        sleep(1);
                    }
                    cout << endl << "Ta ut pengarna." << endl;
                    sleep(1);
             }[/HTML]

    Enda problemet är att sleep(1) pausar i en sekund mellan varje bokstav och siffra vilket tar för lång tid, hur pausar jag i millisekunder? Det är bara punkterna som jag vill ska pausas i en sekund :)
     
    Last edited: 4 okt 2011
  14. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Ok, här kommer mitt modifierade exempel:

    Kod:
    #include &lt;stdio.h>
    #include &lt;unistd.h>
    #include &lt;string.h>
    #include &lt;time.h>
    
    int main(int argc, char **argv)
    {
       int belopp = 3497;
       char string[10];
       int i;
       struct timespec pause;
    
       pause.tv_sec=0;
       pause.tv_nsec=200000000; /* 200000000 ns = 200000 us = 200 ms */
    
       snprintf(string, 10, "%d", belopp);
       for(i=0; i&lt;strlen(string); i++)
       {
          printf("%c", string[i]);
          fflush(stdout);
          /* sleep(1); */
          nanosleep(&pause, NULL);
       }
       printf("\n");
       return 0;
    } /* main */
    
    För mer info, se "man nanosleep".

    m v h Henrik
     
  15. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Läste om nanosleep men fatta inget så jag tog ett exempel och ändra för mina behov, sen håller jag på med att ändra så all text skrivs ut bokstav för bokstav. Skulle uppskatta om någon orkade skumma igenom koden och bedöma hur effektivt jag kodar eller om jag kan göra saker smidigare?

    Tack så mycket för hjälpen hittills!!!

    Edit: Jag länkar till min cpp fil imorgon om någon orkar titta :-)

    Sent from my HTC Desire HD
     
  16. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Själv började jag med c++ och har fortfarande nytta av det jag lärde mig då. Jag kan inte se att man får alls samma förståelse av vad som händer i bakgrunden om man som nybörjare startar med java eller c#. Men jag har haft fel förr.

    Fast jag ryser lite av skol-c++:en, headers ska ju inte ha .h suffix och man bör ju använde std namespacet när så är möjligt. ;)
     
  17. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Ang .h i headers så är det för att den inte kände igen just de filerna utan konstigt nog.

    Using namespace std säger läraren att vi inte ska ha, men man måste tydligen i ubuntu så jag kör med det ändå. Det enda jag hittills tycker är tråkigt är att kursen inte tar upp något om hur man skapar ett gui för sin applikation vilket är mitt nästa mål.
     
  18. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Din lärare har rätt, men troligen har han fel. :)

    Jag såg faktiskt inte att du hade den using satsen, då hade jag inte kommenterat det.

    Ska man vara anal så bör man "egentligen" deklarera de funktionsanrop som ska användas i programmet.

    alltså:

    Kod:
    using std::cout
    using std::cin
    
    Alternativt skriva std::cout och std::cin överallt i koden. Men det spelar ingen roll för dig, knappt någon annan applikation heller.

    Däremot ska inte en C++ applikation där du använder cout, utan att först ha sagt till kompilatorn att det är std namespacet som du ska använda, kompilera.

    Angående GUI så vet jag inte hur det fungerar i linux, men windows programmering var i alla fall på min tid en helt annan best, det lämnas bäst åt lite mindre low level språk som c#.

    Varför du måste ha .h suffixen på vissa filer är för att det är C headers, jag tror till exempel att stdio.h heter cstdio i c++, time.h kanske heter ctime.

    Kan tilläggas att det var kanske fem år sedan jag rört c++, sitter nästan bara med c# nu för tiden.
     
    Last edited: 5 okt 2011
  19. googleye

    googleye Professional Droid Medlem

    Blev medlem:
    8 mar 2010
    Inlägg:
    2 255
    Mottagna gillanden:
    247
    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Huawei Nexus 6P
    ROM:
    Stock
    Platta:
    Samsung Galaxy Note 10.1
    ROM:
    CM 10
    Verkar vara många som sitter och skriver i C# och C istället för C++, någon särskild anledning? Största skillnaderna?

    Nu är i alla fall min bankapp klar, blev lite mer än 400 rader tror jag, säker på att jag skrivit den på sämsta möjliga sätt, men jag gillar den :P