请问这段c语言代码怎么解释 if(a[i]-'0'>=n&&a[i]<'A'||a[i]-'A'+10>=n)

这是一个“n进制转换为十进制”的实例中判断输入的数据和进制数是否相符的语句,请做详细解释,谢谢!

//语句的意思是,如果 字符 a[i]表示的n进制数据是0到9,或者10到ABCE...,则执行if语句
//看看我这个程序,
#include <stdio.h>
#include <string.h>
#include "stdlib.h"
#include <conio.h>
#define size 100
//定义一个栈
typedef struct
{
int x[size];
int top ;
}stack;
//栈初始化
void init(stack &p){
p.top=0;
}
//入栈
int push(stack &p,int &e){
if (p.top<size)
{
p.x[p.top++]=e;
return 1;
}
return 0;
}
//出栈
int pop(stack &p,int &e){
if (p.top>0)
{
e=p.x[--p.top];
return 1;
}
return 0;
}
//将 n进制数据转化为十进制表示
void td(char s[],int n,int &num){
char *p;
int e;
p=s;
num=0;
while(*p){
if(*p>='A') //16 进制转化
e=*p-'A'+10;
else
e=*p-'0';
p++;
num=num*n+e;
}
}
//将十进制转化为 m 进制
void tp(int num,int m,char s[]){ //
int n=0,e;
char *p;
stack b; init(b);
p=s;
while(num){ //将十进制数据逐位分离 压入栈中 此时 数据为倒序
n=num%m;
if(n>9)
e=n-10+'A';
else
e=n+'0';
push(b,e);
num/=m;
}
while(pop(b,e)){ //从栈中取出元素,存入数组 s 中 此时 数据为顺序
*p=e;
p++;
}
*p='\0'; //在数组 尾部加结束标志
}

int check(char s[],int n){
char *p;
p=s;
if(n<=10){
while(*p){
if(*p-'0'>n)
return 1;
p++;
}
}
else if(n>10){
while(*p){
if(*p>='A'&&*p-'A'+10>n)
return 1;
p++;
}
}
return 0;
}

void trans(char s[],int n,int m){
int *p,num;
td(s,n,num);
s[0]='\0';
tp(num,m,s);
}
void main(){
int n,m;
char s[size],c;
int fp=1; //是否结束的标志
do{
puts("\t\t\t数据的各个进制之间的转化\n");
s[0]='\0'; //数组初始化
printf("\n输入一个数据: "); gets(s); //读入数据 字符串型
printf("\b输入原来的进制 和 要转化的进制, 如 10-2 : ");
scanf("%d%c%d",&n,&c,&m); //读入 进制转化 由 n进制转化为 m进制 输入形式 如:10-2 16-2
if(check(s,n)) { //判断是否合法
printf("\n\t错误 !输入的数据与进制不相配, 按任意键,继续输入。");
getch();
}
else{
printf("\n结果\n\t\t\t%d 进制 : %s ",n,s);
trans(s,n,m);//转化
printf("\n \t\t\t%d 进制 : %s \n\n",m,s); //输出 数据 字符串型
printf("\t\t\t继续输入 1, 退出输入 0: ");
scanf("%d",&fp);
}
c=getchar(); //读取 回车键
system("cls");
}while(fp);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-20
先说明a[i]定义为char,是字符,所以在ascii码中‘0’=48,‘9’=57,‘A‘=65,依次类推
如果n=2
a[i]-'0'>=n // 表示a[i]可以为’2‘,’3’。。显然和我们的原意不一样
&&表示AND
a[i]<'A' //表示可以为’9‘,’8‘
a[i]-'0'>=n && a[i]<'A' // ’2‘,’3’..'9',' :'....'@' 还有一些奇怪的字符都能被选择
||表示OR
a[i]-'A'+10>=n //所以’:'..'@','A'....很多都能被选择 所以
我判断这不是一个有效的语句。。。
修改为
if(a[i]-'0'>=0&&a[i]-'0'<=n)此判断仅对小于10的进制有用
如果变成到16进制
修改为
if((a[i]-'0'>=0&&a[i]-'0'<=9)||(a[i]-'A'>=0&&a[i]-'A'<=5))
谁能给个通式啊 我想不出来了。。。
第2个回答  2011-01-19
数组a是char类型吧?!
对于n<=10,只可能为0~9中的数。考虑到为char类型,减去字符0的ASCII码值,与整型n比较,大于n说明输入的数据不符。
对于n>10,可能出现字母A,B......减去字符A的ASCII码值,加上10,大于或等于n时,输入的数据不符。本回答被提问者采纳
第3个回答  2011-01-19
我觉得第二个判断应该是A[i]-'0'<'A'吧.
相似回答