【问题标题】:Converting from letters to binary to decimal and finally to char从字母转换为二进制到十进制,最后转换为字符
【发布时间】:2017-06-29 17:33:48
【问题描述】:

所以我有这个代码是逐个字符地获取用户输入(不使用字符数组),应该发生的是每 7 个字母对应一个字母,7 个字母中的每个字母是 1 或 0,取决于该字母的 ascii 值是偶数还是奇数(0s 偶数,1s 奇数)。
例如:"GCJLLBI" = "1100001",转换为十进制 = 97,即 'a' 的 ascii 码。
因此,如果用户输入“GCJLLBI”,则程序需要将其转换为二进制,然后再转换为十进制,然后使用 %c 和十进制值打印。
不得使用数组 I我试图只用原语,没有抽象数据类型或数组来做到这一点。 这是我目前得到的代码:

/** given a binary number, convert to decimal. */
int binToDec(int binary) 
{
    int decimal = 0, i = 1, remainder;

    /* Iterate until number becomes zero */
    while (binary != 0)
    {
        remainder = binary % 10;
        decimal = decimal + remainder * i;
        i = i * 2;
        binary = binary / 10;
    }

    return decimal;
}

/* Decodes text.*/
int decode(void) {
    char ch;
    printf("? ");
    discardToEOL(); /*Discards any newlines from previous. */
    /*Get Input */
    do {
        scanf("%c", &ch);
    if (ch >= 0 && ch <= 128 && ch != 10) {
        //Send each char to get converted 
        //to binary and then convert binary to ddecimal, 
        //then display as char.

    }
    } while(ch != '\n');
    printf("\n");   
}

所以我真正需要帮助但不明白的是,如果用户输入了 21 个字符,这些字符是逐字符输入的,而不是数组,我该如何将它们解析成组7,然后根据它们的偶数或奇数将它们转换为二进制?

【问题讨论】:

  • 类似int b = 0; for (i=0; i&lt;7; i++) { int ch = fgetchar(); b = b*2 + (ch&amp;1); }

标签: c


【解决方案1】:

您可以一次从输入流中读取一个字符,并为要打印的当前字符保留一个连续的值。

下面的代码首先将value 初始化为64,如果输入字符的值为奇数,则将其添加到当前打印字符的总值中。然后value 减少,循环继续。当value 达到零时,打印与前一组输入字符相关的当前打印字符,并重置valuecur_sum。循环继续,直到到达换行符或文件结尾。循环退出后,应该有一个字符要打印(与\n 之前的输入相关联的字符)。如果此时value不为零,则输入字符数不是7的倍数,并打印错误消息;否则打印最后一个字符。

#include <stdio.h>

int main(void)
{
    int c;
    int value = 64;
    int cur_sum = 0;

    while ((c = getchar()) != '\n' && c != EOF) {
        if (value == 0) {
            putchar(cur_sum);
            value = 64;
            cur_sum = 0;
        }
        cur_sum += (value * (c % 2));
        value /= 2;
    }

    if (value) {
        putchar('\n');
        puts("Input format error");
    } else {
        putchar(cur_sum);
        putchar('\n');
    }

    return 0;
}

示例交互:

GJLIBBLGCJBIBIGCJIIBBGCJIIBBGCJICICJGJLLBBGCIJGCIGCJICICGCIJLIBGCJGCJJGCJLIBBJGLLBBI
Hello world!

【讨论】:

    【解决方案2】:

    您只需添加某种计数器和一个累加器(总和)。这里的问题是 pow()。因为它接受双倍。您还可以制作自己的 pow 函数,该函数接受整数并将它们相乘多次。 (对不起我的答案,stackoverflow中的第一个答案)

    int count = 0; //add a counter here
    int sum = 0;
    do {
        scanf("%c", &ch);
    if (ch >= 0 && ch <= 128 && ch != 10) {
        //Send each char to get converted 
        //to binary and then convert binary to ddecimal, 
    
        sum += pow(2,count) * convertedBinaryNumber;
        //convertedBinaryNumber either 1 or 0
    
        count++;
        if(count == 7){
             count == 0;
             //print sum here to ascii
             sum = 0;
        }
    
        }
    } while(ch != '\n');
    

    【讨论】:

    • 嗯,不,只是每六个字符打印一次。因此,例如,如果一个人在一行“GCJLLBI”中输入以下内容,然后按 Enter,则程序应获取整个系列的字符,将每个字母转换为 1 或 0,具体取决于 ASCII 值是偶数还是奇数, THEN 将整个 7 位二进制字符串转换为十进制,然后打印十进制。
    • 所以代替“发送每个字符进行转换”,累积位,代替“显示为字符”,显示累加器。
    • 好的,所以我想更好的方法是在我的第一个 if 语句下,检查每个字母是偶数还是奇数,并将 0 或 1 添加到 int (表示二进制数) ,然后在 7 个字符后,将 int 发送到我的 bin 到 dec 转换器并将二进制重置为 0 并重新开始,直到 EOL。但我不确定如何将 1 和 0 添加到我的二进制数中。
    猜你喜欢
    • 2022-11-29
    • 1970-01-01
    • 2023-03-04
    • 2020-04-28
    • 2014-11-07
    • 2014-12-15
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多