У меня есть один два проекта кодирования в настоящее время, оба из которых доставляют мне странные проблемы, которые я просто не могу понять. Я часами возился с каждой мелочью, пытаясь их починить, а они просто не сработали.
Первая — это простая программа для пошагового просмотра файла .txt и присвоения значений символам, добавляя к итоговому значению, которое выводится на печать. «A» — «Z» — значения 1-26 соответственно, «-» — 0 и «.» также 0. Пример файла .txt будет:
...............
..-............
.........A.....
..Z.........C..
Ответ здесь будет 30. Изначально я получал «30%» в качестве вывода, и, возясь с ним, пытаясь избавиться от случайного «%», я как-то испортил свою логику где-то, и теперь она просто выводит » 0% «для каждого файла. Вот мой код:
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <vector>
using namespace std;
int getValue(char indicator)
{
int value;
if (indicator = 'A')
{
value = 1;
}
else if (indicator = 'B')
{
value = 2;
}
else if (indicator = 'C')
{
value = 3;
}
else if (indicator = 'D')
{
value = 4;
}
else if (indicator = 'E')
{
value = 5;
}
else if (indicator = 'F')
{
value = 6;
}
else if (indicator = 'G')
{
value = 7;
}
else if (indicator = 'H')
{
value = 8;
}
else if (indicator = 'I')
{
value = 9;
}
else if (indicator = 'J')
{
value = 10;
}
else if (indicator = 'K')
{
value = 11;
}
else if (indicator = 'L')
{
value = 12;
}
else if (indicator = 'M')
{
value = 13;
}
else if (indicator = 'N')
{
value = 14;
}
else if (indicator = 'O')
{
value = 15;
}
else if (indicator = 'P')
{
value = 16;
}
else if (indicator = 'Q')
{
value = 17;
}
else if (indicator = 'R')
{
value = 18;
}
else if (indicator = 'S')
{
value = 19;
}
else if (indicator = 'T')
{
value = 20;
}
else if (indicator = 'U')
{
value = 21;
}
else if (indicator = 'V')
{
value = 22;
}
else if (indicator = 'W')
{
value = 23;
}
else if (indicator = 'X')
{
value = 24;
}
else if (indicator = 'Y')
{
value = 25;
}
else if (indicator = 'Z')
{
value = 26;
}
return value;
}
int main()
{
string filename;
ifstream txtfile;
char indicator;
int currentvalue;
int totalvalue = 0;
cin >> filename;
txtfile.open(filename.c_str());
while(txtfile >> indicator)
{
if (indicator = '.')
{
currentvalue = 0;
}
else if (indicator = '-')
{
currentvalue = 0;
}
else
{
currentvalue = getValue(indicator);
}
totalvalue += currentvalue;
}
cout << totalvalue;
return 0;
}
Мой второй вопрос, возможно, немного сложнее. Эта программа преобразует десятичную в двоичную. Мне разрешено только создавать свои собственные функции и редактировать функцию dec2bin. Все остальное запрещено, в том числе int main (). Все комментарии в коде взяты из моих TA, чтобы дать советы по созданию функции dec2bin. Я сделал экспоненциальную функцию, так как нам не разрешено добавлять дополнительные #include. Сначала я покажу свой код, а затем покажу, как выглядит вывод.
#include <iostream>
#include <string>
using namespace std;
bool isdecimal(string &input)
{
// see bin2dec for description of how the below code works
return input.find_first_not_of("0123456789") == string::npos;
}
void reverse(string &input)
{
int n = input.length();
for (int k=0; k<n/2; k++)
swap(input[k], input[n-1-k]);
}
int exponential(int &exponent)
{
int multiple = 1;
for (int i = 0; i < exponent; i++)
{
multiple *= 10;
}
return multiple;
}
string dec2bin(string &decstr)
{
// convert string decstr to integer decval:
// 1) reverse to obtain LSB-MSB digit order
reverse(decstr);
// 2) for each ascii digit, subtract '0' to
// obtain integer value, multiply by 10^k
// and continually add result to decval
unsigned int i;
int addval = 0;
int remainder = 0;
int decval = 0;
int currentval = 0;
char binchar;
string newstring = "";
for (i = 0; i < decstr.size(); i++)
{
currentval = (decstr[i] - '0');
addval = currentval * exponential(i);
decval += addval;
}
// apply successive-halving
while(decval > 0) {
remainder = decval % 2;
decval = decval / 2;
binchar = remainder;
newstring.push_back(binchar);
}
// reverse to restore MSB-LSB bit order
reverse(newstring);
return newstring;
}
int main()
{
string decstr;
while (cin >> decstr) {
if (isdecimal(decstr) == false)
cout << "input error\n";
else
cout << dec2bin(decstr) << "\n";
}
}
Поскольку я не могу публиковать изображения, я опишу, как выглядит мой вывод. Независимо от целого числа, которое я ввожу, он возвращает некоторые комбинации пробелов и странных квадратных смайликов (для этого я использую CodeLite, в Unix он ничего не печатает).
Заранее спасибо абсолютно всем, кто мне помогает. Я просто в тупике. Кроме того, не стесняйтесь быть как можно более расплывчатым. Просто некоторые указатели могут помочь. Я уверен, что первая — это небольшая синтаксическая ошибка или что-то в этом роде, но я просто не могу ее найти.
Решил вашу первую проблему, вы назначали индикатор, а не сравнивали его, поэтому вы всегда получите 0. Кроме того, я немного прибрался.
#include <iostream>
#include <fstream>
using namespace std;
int getValue(char indicator)
{
int value = 0;
switch(indicator)
{
case 'Z': value++;
case 'Y': value++;
case 'X': value++;
case 'W': value++;
case 'V': value++;
case 'U': value++;
case 'T': value++;
case 'S': value++;
case 'R': value++;
case 'Q': value++;
case 'P': value++;
case 'O': value++;
case 'N': value++;
case 'M': value++;
case 'L': value++;
case 'K': value++;
case 'J': value++;
case 'I': value++;
case 'H': value++;
case 'G': value++;
case 'F': value++;
case 'E': value++;
case 'D': value++;
case 'C': value++;
case 'B': value++;
case 'A': value++;
break;
default: value = 0;
}
return value;
}
int main()
{
string filename;
ifstream txtfile;
char indicator;
int currentvalue,
totalvalue = 0;
cin >> filename;
txtfile.open(filename.c_str());
while(txtfile >> indicator)
{
if (indicator == '.') // = is for assignment, == is for comparison
currentvalue = 0;
else if (indicator == '-')
currentvalue = 0;
else
currentvalue = getValue(indicator);
totalvalue += currentvalue;
}
cout << totalvalue << endl;
return 0;
}
И я получаю 30 с вашим вкладом 🙂
Почему вы используете назначение =
оператор?
main.c
while(txtfile >> indicator)
{
if (indicator = '.')
{
currentvalue = 0;
}
// SNIP!
}
Конечно, вы имели в виду это:
while(txtfile >> indicator)
{
if (indicator == '.')
{
currentvalue = 0;
}
// SNIP!
}
Большая разница между =
а также ==
один — присваивание, другой — проверка на равенство содержимого.