-2

我目前有两个编码项目,这两个项目都给我带来了我无法弄清楚的奇怪麻烦。我花了几个小时搞乱每件小事来尝试修复它们,但它们似乎并没有奏效。

第一个是一个简单的程序,通过一个 .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()。代码中的注释均来自我的助教,提供制作 dec2bin 函数的技巧。我已经制作了指数函数,因为我们不允许添加任何额外的#includes。我将首先显示我的代码,然后显示输出的样子。

#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 中它什么也不打印。)

提前感谢任何帮助我的人。我只是难住了这一点。另外,请尽可能含糊其辞。只是一些指针可能会有所帮助。我确定第一个是一些小的语法错误或类似的东西,但我根本找不到它。

4

2 回答 2

3

为什么要使用赋值=运算符?

main.c

while(txtfile >> indicator)
{
  if (indicator = '.')
  {
     currentvalue = 0;
  }
  // SNIP!
}

你的意思肯定是这样的:

while(txtfile >> indicator)
{
  if (indicator == '.')
  {
     currentvalue = 0;
  }
  // SNIP!
}

=和之间的很大区别==,一个是赋值,另一个是内容的相等检查。

于 2014-01-13T20:59:54.717 回答
1

解决了你的第一个问题,你分配了指标而不是比较它,所以你总是得到 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 :)

于 2014-01-13T21:23:04.327 回答