[C++] getal 124 ==> 2+4 =6 hoe te programeren.

Pagina: 1
Acties:
  • 162 views sinds 30-01-2008
  • Reageer

  • Mich
  • Registratie: December 2000
  • Laatst online: 01:32
Ok beetje rare topictitel, maar ik ben dus bezig in C++ en nu moet ik een getal invoeren. En van dat getal moet die de laatste 2 cijfers optellen.

Ik ben nog maar net bezig met C en dat er een getal ingevoerd moet worden enzo lukt wel, maar hij kan ik uit een ingevoerd getal nou de laatste 2 cijfers apart als een integer gebruiken ?

Ik heb al lopen zoeken en moet er volgens mij een string van maken, maar weet verder niet hoe ik dat moet doen ook met behulp van http://www.cplusplus.com/ref/ lukte het niet

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Heb je wel eens gehoord van modulus? Daarmee krijg je de rest van een deling. Dus:

7 / 3 = 2 (rest 1)
7 mod 3 = 1

Als je nu de rest van een deling door tien neemt (want je werkt decimaal), krijg je het meest rechtse getal. Hoe je het eennalaatste getal krijgt moet je zelf wel kunnen uitvogelen vermoed ik ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:13
Als je een getal deelt door 100, hou je als rest de laatste 2 cijfers over. 12345/100 == 123 (want bij deling van integers wordt altijd omlaag afgerond). De rest (12345 - 100*123) is 45 en dat zijn de laatste twee cijfers.

Voor de rest bij deling (ook wel modulus genoemd) kent C/C++ ook al de operator %. Er geldt dus zowel 12345/100 == 123 (eerste drie cijfers) en 2345%100 == 45 (laatste twee cijfers).

Hiermee zou je er uit moeten komen, maar je moet natuurlijk wel je verstand erbij gebruiken.

  • flowerp
  • Registratie: September 2003
  • Laatst online: 04-02 02:01
Een andere mogelijkheid, gewoon je getal als string laten invoeren en daar dan de laatste twee karakters van pakken. Deze kun je zeer snel omzetten in een int (char - '0' doen) en als je dat niet zelf wilt doen kun je bv atoi gebruiken. Deze laatste kun je ook nog gebruiken als je het gehele getal wilt doen.

Zowieso is het vaak beter om via een string in te voeren. Als je bv cin gebruikt op een int, dan heeft dit de vervelende eigenschap dat er niks uit stdin wordt gehaald als er geen int in je invoer zit. Via een string kun je dat zelf controleren en een foutmelding geven.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Je moet die getallen omzetten naar een string. Dan kun je bij die string de laatste 2 cijfers/letters afknippen en die gebruiken. Een string is een array van chars, dus dat moet niet zo moeilijk wezen. Met behulp van strlen kun je de lengte van de string bepalen.

C++:
1
2
3
4
5
6
7
8
string str1;
int inp1, inp2, antwoord;

//de input is hierbij een string
str1 = input[strlen(input) - 3]; //gebruik -3 ipv -2 vanwege de index 0-based is
inp1 = atoi(str1[0]);
inp2 = atoi(str1[1]);
antwoord = inp1 + inp2;
Werkt dit niet :? Ik programmeer zelf niet in c++, dus weet niet zeker, maar ik heb het ff aan de hand van die reference en mijn fantasie geprobeert. ;) :) Input is hierbij je ingevoerde getal als string.

[ Voor 3% gewijzigd door eghie op 05-09-2004 23:10 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:13
@flowerp:
Je krijgt met jouw voorstel ook allerlei rare dingen als je niet netjes een echt getal invoert en de laatste twee 'cijfers' geen cijfers blijken te zijn. Je moet om dat te voorkomen dus toch allerlei dingen gaan checken.

Verder vind ik het niet vervelend dat er "niets uit cin wordt gehaald als er geen int in je invoer zit", want dat kun je simpel detecteren:
C++:
1
2
3
4
5
6
7
8
9
int getal;
if(std::cin >> getal)
{
    /* Jouw code hier! */
}
else
{
    std::cerr << "Geen getal ingevoerd!" << std::endl;
}

[ Voor 46% gewijzigd door Soultaker op 05-09-2004 19:56 ]


  • flowerp
  • Registratie: September 2003
  • Laatst online: 04-02 02:01
Soultaker schreef op 05 september 2004 @ 19:54:
C++:
1
2
3
4
5
6
7
8
9
int getal;
if(std::cin >> getal)
{
    /* Jouw code hier! */
}
else
{
    std::cerr << "Geen getal ingevoerd!" << std::endl;
}
He, dat wist ik niet eens dat het resultaat van >> null terug geeft als het geen int was die in de stream zat. Weer wat geleerd :)

Toch blijf je nu er nog wel een beetje mee zitten dat je wel de stream moet leeghalen voor de volgende invoer, maar dat is natuurlijk niet zo zware operatie. Ik liep altijd de string met de hand na en stopte bij de eerste char die geen nummer was. Intern zal cin wel ongeveer hetzelfde doen, maar jouw voorbeeld staat netter vind ik.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Verwijderd

flowerp schreef op 05 september 2004 @ 23:43:
Toch blijf je nu er nog wel een beetje mee zitten dat je wel de stream moet leeghalen voor de volgende invoer, maar dat is natuurlijk niet zo zware operatie. Ik liep altijd de string met de hand na en stopte bij de eerste char die geen nummer was. Intern zal cin wel ongeveer hetzelfde doen, maar jouw voorbeeld staat netter vind ik.
Ik doe het meestal zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cctype>

... 

int getal;
if(std::cin >> getal && (std::cin.peek() == EOF || std::isspace(std::cin.peek())) {
    // correct
} else {
    std::cerr << "Illegale input." << std::endl;
}


Door de truuk met peek() weet je zeker dat een invoer als "123a" niet het getal 123 maar een foutmelding oplevert.

  • Mich
  • Registratie: December 2000
  • Laatst online: 01:32
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
void lees_invoerwaarden(int &beginwaarde, int &eindwaarde, int &stapgrootte)
{
    while (beginwaarde < 1)
    {  printf("type begin waarde: ");
       scanf("%d", &beginwaarde);
    } 
   
    while (eindwaarde < beginwaarde)
    {  printf("\ntype eind waarde: ");
       scanf("%d", &eindwaarde);
    }
  
    while(stapgrootte < 1)
    {  printf("\ntype stapgrootte: ");
       scanf("%d", &stapgrootte);
    }
}

void toon_tabel(int beginwaarde, int eindwaarde, int stapgrootte)
{
    printf("[beginwaarde: %d, eindwaarde: %d, stapgrootte: %d]\n", beginwaarde, eindwaarde, stapgrootte);
    for (int i = beginwaarde; i < eindwaarde; i += stapgrootte)
    {   char str[10] = { 0 };
        itoa(i, str, 10);
//      printf("%s\n", str); // Show that string
/*      
        // Show that string in array and in nrs
        for (int j = 9; j > 0; j--)
        {  printf("%d ", str[j]);
        }       
*/        
        int count = 0;
        int som = 0;
        for (int j = 9; j > 0; j--)
        {  
           // printf("j = %d, str[j] = %d\n", j, str[j]); // Walking the string
           if (str[j] > 0)
           {  // printf("som = %d\n", som);
              som += (str[j] - 48); 
              // printf("som = %d\n", som);
              ++count;
           }
           if (count >= 2)
           {   break;
           }
        }
        printf("%d %d\n", i, som);
    }
}

int main()
{
    int beginwaarde = 0, eindwaarde = 0, stapgrootte = 0;

    lees_invoerwaarden(beginwaarde, eindwaarde, stapgrootte);
    toon_tabel(beginwaarde, eindwaarde, stapgrootte);
    // toon_tabel(240, 250, 2);

    return 0;
}


dit is de code die ik nu gebruik. Overgins niet zelf gemaakt, maar door iemand anders. Jullie suggesties kwamen ook van pas voor ideen voor een volgende keer
bedankt allemaal

Verwijderd

Je algoritme werkt door een getal uit te printen als een string, terwijl het (zoals reeds vermeld) makkelijker kan met (modulo) delingen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>

inline int get_number(const char* msg, int min, int max = 0)
{
    int number= min - 1;
    while(number < min || (max != 0 && number > max)) {
        std::cout << msg;
        if(!(std::cin >> number)) {
            std::cin.clear();
            int ch;
            do {
                ch= std::cin.get();
                if(ch == EOF) return EOF;
            } while(ch != '\n');
        }
    }
    return number;
}

inline void show(int begin, int end, int step)
{
    std::cout << "Begin:" << begin << " end:" << end
        << " step:" << step << '\n';
    for(; begin < end; begin+= step) {
        int sum= begin % 100;
        sum= sum / 10 + sum % 10;
        std::cout << begin << ' ' << sum << '\n';
    }
}

int main()
{
    int begin= get_number("Enter begin value: ", 1);
    int end= get_number("Enter end value:   ", begin + 1);
    int step= get_number("Enter step value:  ", 1, end - begin);
    show(begin, end, step);
    return 0;
}


(De show() hierboven doet dus exact het zelfde als jouw toon_tabel(), maar het geheel is wat eleganter en omgezet naar C++ streams.)

[ Voor 12% gewijzigd door Verwijderd op 07-09-2004 17:44 ]

Pagina: 1