一个很简单的C语言题,就是把十六进制的数转换为十进制的数,有2个地方不了解,请大家帮帮忙,先谢谢啦!
#include<stdio.h>#include<conio.h>#include<ctype.h>intmain(){intchange(chars[]);charh...
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
int main()
{
int change(char s[]);
char hex[100];
int flag=0;
int flag1=1;
int i=0;
char c;
printf("Please input a hex number:");
while((c=getchar())!='\0' && i<100 && flag1==1)
{
if( isdigit(c) || (c>='a' && c<='f') || (c>='A' && c<='F'))
{
hex[i++]=c;
flag=1;
}
else if(flag)//不是很理解这里用else if 而不是直接用if//还想问问发生什么情况时程序才执行else if 后面的语句(是因为输入了回车吗??)
{
hex[i]='\0';
printf("\nThe hex number is %d in decimal:",change(hex));
printf("\nContinue or not?");
c=getchar();
if(c=='n' || c=='N')
flag1=0;
else
{
i=0;
flag=0;//不是很理解这里为什么又要初始化??//
printf("\nPlease input a hex number again: ");
}
}
}
getch();
}
int change(char s[])
{
int i=0,n=0;
while(s[i]!='\0')
{
if(isdigit(s[i]))
n=n*16+s[i]-'0';
if(s[i]>='a' && s[i]<='z')
n=n*16+s[i]-'a'+10;
if(s[i]>='A' && s[i]<='Z')
n=n*16+s[i]-'A'+10;
i++;
}
return n;
}
中间的注释就是我的问题,请教下大家,谢谢哈! 展开
#include <conio.h>
#include <ctype.h>
int main()
{
int change(char s[]);
char hex[100];
int flag=0;
int flag1=1;
int i=0;
char c;
printf("Please input a hex number:");
while((c=getchar())!='\0' && i<100 && flag1==1)
{
if( isdigit(c) || (c>='a' && c<='f') || (c>='A' && c<='F'))
{
hex[i++]=c;
flag=1;
}
else if(flag)//不是很理解这里用else if 而不是直接用if//还想问问发生什么情况时程序才执行else if 后面的语句(是因为输入了回车吗??)
{
hex[i]='\0';
printf("\nThe hex number is %d in decimal:",change(hex));
printf("\nContinue or not?");
c=getchar();
if(c=='n' || c=='N')
flag1=0;
else
{
i=0;
flag=0;//不是很理解这里为什么又要初始化??//
printf("\nPlease input a hex number again: ");
}
}
}
getch();
}
int change(char s[])
{
int i=0,n=0;
while(s[i]!='\0')
{
if(isdigit(s[i]))
n=n*16+s[i]-'0';
if(s[i]>='a' && s[i]<='z')
n=n*16+s[i]-'a'+10;
if(s[i]>='A' && s[i]<='Z')
n=n*16+s[i]-'A'+10;
i++;
}
return n;
}
中间的注释就是我的问题,请教下大家,谢谢哈! 展开
4个回答
展开全部
flag是一个标志,为0的时候表示是等待输入状态,为1的时候表示已经有输入开始了。
while循环退出的条件有三个:
1. 读到字符串结束符'\0';
2. 输入字串长度达到100,防止越界;
3. flag1(是否继续标志)为n/N。
如果没有上述情况就要一直循环下去。
循环体首先读取输入,如果符合下述要求,else-if是不进入的,即始终处于读取状态而不转换:
1. 当前字符是数字;
2. 当前字符是a-f中的一个字母;
3. 当前字符是A-F中的一个字母;
如果满足这些,将始终处于读取输入的状态。否则开始进行转换,就是else -if处理了。
转换结束之后,把flag再置回0,确认是否continue之后,等于再次转回等待输入的状态,还继续循环刚才的操作。
while循环退出的条件有三个:
1. 读到字符串结束符'\0';
2. 输入字串长度达到100,防止越界;
3. flag1(是否继续标志)为n/N。
如果没有上述情况就要一直循环下去。
循环体首先读取输入,如果符合下述要求,else-if是不进入的,即始终处于读取状态而不转换:
1. 当前字符是数字;
2. 当前字符是a-f中的一个字母;
3. 当前字符是A-F中的一个字母;
如果满足这些,将始终处于读取输入的状态。否则开始进行转换,就是else -if处理了。
转换结束之后,把flag再置回0,确认是否continue之后,等于再次转回等待输入的状态,还继续循环刚才的操作。
展开全部
问题1: if。。。。else if。。。 这种结构中,当if的条件不成立时,才会对else if的条件进行判定,如果为真就执行其语句。 如果是两个if,就会逐次进行判定。 这个程序中的else if 语句是当该16进制数读入结束时起作用的,当程序读到非16进制的字符时(空格,结束时的回车,其他字母如R T W Q等等等等)就会执行该语句(当然,前提是有读入过16进制字符,通过之前的if语句使flag=1)。
问题2: 这里的else 语句是当用户要再次输入时执行的,所以将flag重新赋值为0(之前为1),以回到初始状态。
问题2: 这里的else 语句是当用户要再次输入时执行的,所以将flag重新赋值为0(之前为1),以回到初始状态。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得你这个程序有问题吧...
else if(flag)//不是很理解这里用else if 而不是直接用if//还想问问发生什么情况时程序才执行else if 后面的语句(是因为输入了回车吗??)
在if……else if语句中,如果第一个if条件成立,则执行之,后面的elseif语句不执行。
如果把else if 改为if,则无论第一个if执行与否,第二个if都要进行判断是否执行。
这里应该用if吧... 然后执行后面的语句..是看if 后面的括号里面 的值 知否为零 非零的时候执行后面的语句.
flag=0;//不是很理解这里为什么又要初始化??//
if(flag)
flag 是个标记么...当他是0到9的时候 flag=0 不要转换..a到f的时候 令flag=1 证明你需要转换了...转换玩一次后...flag 也要回复原来的0啊... 要不然flag一直是1的话 就算你输入 0到9得数.. 也会一直执行if 之后的转换 的那些东西了..没有用啊...
还有啊..朋友一点分都没有啊...忒扣了吧..怎么也得象征性的给5分吧...
else if(flag)//不是很理解这里用else if 而不是直接用if//还想问问发生什么情况时程序才执行else if 后面的语句(是因为输入了回车吗??)
在if……else if语句中,如果第一个if条件成立,则执行之,后面的elseif语句不执行。
如果把else if 改为if,则无论第一个if执行与否,第二个if都要进行判断是否执行。
这里应该用if吧... 然后执行后面的语句..是看if 后面的括号里面 的值 知否为零 非零的时候执行后面的语句.
flag=0;//不是很理解这里为什么又要初始化??//
if(flag)
flag 是个标记么...当他是0到9的时候 flag=0 不要转换..a到f的时候 令flag=1 证明你需要转换了...转换玩一次后...flag 也要回复原来的0啊... 要不然flag一直是1的话 就算你输入 0到9得数.. 也会一直执行if 之后的转换 的那些东西了..没有用啊...
还有啊..朋友一点分都没有啊...忒扣了吧..怎么也得象征性的给5分吧...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
#define MAX 1000
void main()
{ int func(char s[]);
int c,i=0,flag=0,flag1=1;
char t[MAX];
printf("请输入一个十六进制的数:\n");
while((c=getchar())! ='\0'&&i<MAX&&flag1)
{ if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F')
{ flag=1;
t[i++]=c;
}
else if(flag)
{ t[i]='\0';
printf("十进制数为:%d\n",func(t));
printf("是否继续?");
c=getchar();
if(c=='N'||c=='n')
flag1=0;
else
{ flag=0;
i=0;
printf("\n输入一个十六进制的数:");
}
}
}
}
int func(char s[])
{
int i,n=0;
for(i=0;s[i]!='\0';i++)
{if(s[i]>='0'&&s[i]<=9)
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return(n);
}
#define MAX 1000
void main()
{ int func(char s[]);
int c,i=0,flag=0,flag1=1;
char t[MAX];
printf("请输入一个十六进制的数:\n");
while((c=getchar())! ='\0'&&i<MAX&&flag1)
{ if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F')
{ flag=1;
t[i++]=c;
}
else if(flag)
{ t[i]='\0';
printf("十进制数为:%d\n",func(t));
printf("是否继续?");
c=getchar();
if(c=='N'||c=='n')
flag1=0;
else
{ flag=0;
i=0;
printf("\n输入一个十六进制的数:");
}
}
}
}
int func(char s[])
{
int i,n=0;
for(i=0;s[i]!='\0';i++)
{if(s[i]>='0'&&s[i]<=9)
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return(n);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询