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
| |