我是C编程的新手。所以我的节目很长,抱歉。
我的教授想要一个数字系统二进制到十进制,十进制到二进制,八进制到十进制,十六进制到二进制。他也想要一个循环(如果他想退出按[E],如果没有,则按任意键)。现在我对这个十六进制有问题,因为它一直在说"重新声明中的类型不匹配"我现在不知道如何解决这个问题。
因为"十六进制"所以继承我尚未完成的程序问题。帮我解决这个错误。不要介意八进制到十进制,我目前正在编程:)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 1000
long num, decimal(long), octal(long), binary(long),j;
char hexadecimal(char), k[MAX];
main()
{
char choice;
clrscr();
printf("[B]inary to Decimal\n");
printf("[D]ecimal to Binary\n");
printf("[O]ctal to Decimal\n");
printf("[H]exadecimal to Binary\n");
printf("[E]xit\n");
printf(" Enter your choice....");
choice=getche();
switch(choice)
{
case 'b':
case 'B': binary(j); break;
case 'd':
case 'D': decimal(num); break;
case 'o':
case 'O':
case 'h':
case 'H': hexadecimal(k[MAX]); break;
case 'e':
case 'E': return 0;
default: printf("\n Invalid choice.... press any key to REPEAT");
getch();
main();
}
printf("\nDo you want to [E]xit?");
choice=getch();
switch(choice)
{
case 'e':
case 'E': printf("\nInvalid choice... press any key to repeat");
getch();
main();
}
getch();
return 0;
}
long binary(long j)
{
long binary_val,decimal_val=0, base=1, rem;
printf("Enter a binary number( 1s & 0s): ");
scanf("%ld",&j);
binary_val=j;
while(j>0)
{
rem=j % 10;
decimal_val=decimal_val + rem * base;
j= j/ 10;
base=base * 2;
}
printf(" The Binary Number is %ld\n",binary_val);
printf(" Its decimal equivalent is = %d\n",decimal_val);
}
long decimal(long num)
{
long decimal_num, remainder, base=1, binary=0;
printf(" \nEnter a decimal integer: ");
scanf("%ld",&num);
decimal_num=num;
while(num>0)
{
remainder= num % 2;
binary=binary + remainder * base;
num=num/2;
base= base * 10;
}
printf(" Input number is %d\n",decimal_num);
printf(" Its binary equivalent is = %ld",binary);
}
char hexadecimal(char k[MAX])
{
long int i=0;
clrscr();
printf(" Enter any Hexadecimal number: ");
scanf("%s",&k);
printf("\n Equivalent binary value: ");
while(k[i])
{
switch(k[i])
{
case '0': printf("0000"); break;
case '1': printf("0001"); break;
case '2': printf("0010"); break;
case '3': printf("0011"); break;
case '4': printf("0100"); break;
case '5': printf("0101"); break;
case '6': printf("0110"); break;
case '7': printf("0111"); break;
case '8': printf("1000"); break;
case '9': printf("1001"); break;
case 'a':
case 'A': printf("1010"); break;
case 'b':
case 'B': printf("1011"); break;
case 'c':
case 'C': printf("1100"); break;
case 'd':
case 'D': printf("1101"); break;
case 'e':
case 'E': printf("1110"); break;
case 'f':
case 'F': printf("1111"); break;
default: printf("\n Invalid hexadecimal digit %c",k[i]); return 0;
}
i++;
}
}
答案 0 :(得分:3)
您获得的错误type mismatch in redeclaration of hexadecimal
是您原型化和实施的功能之间差异的结果。
你的原型是:
char hexadecimal(char), k[MAX];
这一行原型化一个函数十六进制,它返回一个char并将一个char作为一个参数 AND 这一行也声明了一个大小为MAX的全局字符数组k。
您的实际功能是:
char hexadecimal(char k[MAX])
这个函数是一个返回char的函数,但它不是像你的原型那样取一个char而是取一个大小为MAX的char数组。正如您所看到的,原型函数和函数本身并不相同。通过使功能完全相同,您将解决您的问题。
老实说,您不需要将任何内容传递给该函数,也不需要创建全局char数组,因为您可以根据代码在本地保存数组。你使用数组的唯一另一次,你只需将它传递给这个函数,这意味着它最好是作为该函数的本地。所以,你可以这样做:
char hexadecimal(void)
{
char k[MAX]
//same code below...
现在函数不带参数,k仍然在函数中声明,但是是局部的而不是全局的。这个函数的原型就是:
char hexadecimal(void);