Function issue

Hello,

I wrote a code in C++ that can encode and decode files. After that the programm have to check or numbers from the file are lychrel numbers. I used functions for every action.
But when I put all those functions in a row, the last one doesn't work. See my 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;

    long omgekeerd(long);
    bool isPalindroom(long);

void bestanden(ifstream & invoer, ofstream & uitvoer, char & keuze) {
    string origineel; //Bestandsnaam invoer
    string doelfile; //Bestandsnaam uitvoer
    cout << "Goedendag, u kunt kiezen of u met dit programma een bestand wilt "
         << "coderen of decoderen." << endl;
    cout << "Voor coderen voer een 'c' in. Voor decoderen voer een 'd'"
         << "in." << endl;
    cin >> keuze;
    cout << "Voer de naam van het originele bestand in: " << endl;
    cin >> origineel;
    invoer.open(origineel, ios::in);
    cout << "Voer de gewenste naam van het doelbestand in: " << endl;
    cin >> doelfile;
    uitvoer.open(doelfile, ios::out);
}

bool isBackslash(char c) { //Bepaalt of karakter een backslash is
    if(c == 92) { //c is nummer van karakter in ascii
        return true;
    }
    else {
        return false;
    }
}//isBackslash

bool isCijfer(char c) { //Bepaalt of karakter een cijfer is
    if (c > 48 && c < 58) { //c is nummer van karakter in ascii
        return true;
    }
    else {
        return false;
    }
}//isCijfer

void coderen(ifstream & invoer, ofstream & uitvoer) { //Codeert invoer
    char kar1, kar2; //kar 1 is eerste karakter in invoer, kar2 de volgende
    int i = 1; //aantal zelfde karakters
    bool dubbel = false; //staan er 2 dezelfde karakters achter elkaar?

    kar1 = invoer.get();
    kar2 = invoer.get();
//coderen
    while(!invoer.eof()) {
    if(kar1 == '\n') {
        uitvoer.put('\n');
    }
    else {
        if(kar1!=kar2) {
            if(isBackslash(kar1) || isCijfer(kar1)) {
                uitvoer.put('\\');
            }
            uitvoer.put(kar1);
            if(i>1) {
                uitvoer << i;
            }
            i=1;
        }
        else {
            i++;
        }
    }
//Cijfers uit het invoerbestand naar het uitvoerbestand
    if(isCijfer(kar1)){
            dubbel = true;
        }
        kar1 = kar2;

        if (!isCijfer(kar2)&&dubbel==true){
            dubbel= false;
        }
        kar2 = invoer.get();
        }
        uitvoer.put(kar1);
        if (i>1){
            uitvoer << i;
    }
    cout << "Uw bestand is gecodeerd." << endl;
}//coderen

void decoderen(ifstream & invoer, ofstream & uitvoer){ //decodeert de invoer
    char kar1, kar2; //kar 1 is een volgende regel, kar 2 is volgende karakter
    int getal = 0; //Uitrekenen werkelijke getal
    int i = 1; //Teller voor aantal dezelfde karakters

    kar1 = '\n';
    kar2 = invoer.get();
//decoderen
    while (!invoer.eof()){
        if (isCijfer(kar2)) {
            getal = getal * 10 + (kar2 - '0');
        }
        else {
            if(getal > 0) {
                for(i=1; i < getal; i++)
                    uitvoer.put(kar1);
                    getal=0;
            }
            if(isBackslash(kar2)) {
                kar2 = invoer.get();
            }
            uitvoer.put(kar2);
            kar1 = kar2;
        }
        kar2 = invoer.get();
        }
    cout << "Uw bestand is gedecodeerd." << endl;
}//decoderen

bool isPalindroom(long getal) { //check of getal een palindroom is
    return getal == omgekeerd(getal);
}//isPalindroom

long omgekeerd(long num) { //is een getal een spiegelgetal?
    long omgekeerd = 0; //check of getal een spiegelgetal is
    while(num > 0) {
        long rest = num%10; //getal wat bij berekening er nog bij komt
        omgekeerd = (omgekeerd*10)+rest;
        num=num/10;
    }
    return omgekeerd;
}//omgekeerd

bool checkLychrel(long num, int & p) { //checkt of getal een lychrelgetal is
    if(isPalindroom(num)) {
        if(p>0) {
            p=p-1;
        }
        return false;
    }
    else {
    for(p=1; p>0; p++) { //p is teller voor iteraties
        num = num + omgekeerd(num);
        if(isPalindroom(num)) {
            return false;
        }
    }
     return true;
}
}//checkLychrel

void isLychrel(ifstream & invoer) {//haalt getallen uit de invoer en haalt deze
    int p=0; //teller iteraties    //door checkLychrel
    char kar; //karakter uit de invoer
    while(!invoer.get(kar)) {
        if(isCijfer(kar)) {
            invoer.unget();
            int n; //geheel getal uit invoer
            invoer >> n;
            if(n < INT_MAX) {
                if(checkLychrel(n, p)) {
                    cout << n << " is een lychrelgetal. " << endl;
            }
                else {
                cout << n << " is geen lychrelgetal." << " Het aantal iteraties"
                     << " om bij een palindroom te komen is " << p << endl;
            }
            }
            else {
                cout << n << " Dit getal is te groot." << endl;
            }
    }
}
}//isLychrel

int main() {
    ifstream invoer;
    ofstream uitvoer;
    char keuze;
    bestanden(invoer, uitvoer, keuze);
    if(keuze == 'c') {
        coderen(invoer, uitvoer);
    }
    if(keuze == 'd') {
        decoderen(invoer, uitvoer);
    }
    else {
        cout << "Wrong letter." << endl;
    }
    cout << "Dit programma controleert nu alle getallen uit de invoerfile op"
         << " lychrelgetallen." << endl;
    isLychrel(invoer);
return 0;
}//main 


So, everything works, except the isLychrel function.
When I write the code withoud the encode (void coderen()) part or the decode (void decoderen()) part, the isLychrel function works. What am I doing wrong?
Hello pieterdehoogd,

So what is not working in the "main" function? (You said the last function).

A few blank through out your code would make it much easier to read and avoid any delays in a response.

Andy
in the main function:
void bestanden(), user can choose whether he wants to encode or decode and user have to give the filenames.

if he choose 'c' the programm must go to the function coderen() (coderen is dutch for encode) and if he choose 'd' the programm must go to the function decoderen() (decoderen is dutch for decode).
If he choose an other letter than c or d the programm says: Wrong letter.
When the programm is done with encode or decode, all of the numbers from the imputfile have to be checked whether they are lychrel numbers or not. I wrote a function void isLychrel().

So when I only put void isLychrel in the main function, the programm checks al of the numbers from the imput file whether they are lychrel number or not. But when I put the if(keuze == 'c') then coderen en if(keuze == 'd') then decoderen part in the main function, the isLychrel function doesn't work anymore...
Hello pieterdehoogd,

Thank you. I believe that you are the first to mention what language you use in your program. It really helps.

Now that I understand what to look for I will check into it. Translating some of the code will take a bit longer, but not a problem.

Andy
Hello Andy,

It's written in C++, dutch language.
Thank you.
What exactly do you mean by "doesn't work"?

Look at this snippet:

1
2
3
4
5
6
7
void isLychrel(ifstream & invoer)  //haalt getallen uit de invoer en haalt deze
{
    int p = 0; //teller iteraties    //door checkLychrel
    char kar; //karakter uit de invoer
    while(!invoer.get(kar))
    {
        if(isCijfer(kar))


First since you are using this stream in several places I would recommend you always check the state of the stream before you try to use it and you may also want to rewind the stream in this function as well.

Also why are you only executing the code within that while() statement when you fail to get a character?

Also here: http://www.cplusplus.com/forum/general/273355/
Last edited on
Topic archived. No new replies allowed.