您的位置:首页 > 其它

PAT B1031 查验身份证 学会断点调试! 字符串输入两个结果一样!循环自增看清楚要在哪里申明

2015-02-23 22:43 453 查看
//这题让我认识到断点调试的极大好处!!!棒极了!
//这一题调试了很久,后来改了gets为scanf("%s",str)才成功,用gets()时我也去除了换行符啊!目前仍然不知道怎么回事!
//我靠,后来换成gets和getchar()在oj上又全部通过了!看来可能之前是别的原因造成的
//无论如何,下次用断点调试!加油!
#include<stdio.h>
#include<string.h>
//#define LOCAL
int rate[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char change[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int main(){
#ifdef LOCAL
freopen("B1031data.in","r",stdin);
freopen("B1031data.out","w",stdout);
#endif
//这种题可以边读入边输出,因此不需要二维数组
//关于验证是否是数字,可能要用是否在‘0’~‘9’之间了
//从0开始存放到str中
int n=0,count=0,last=0,i;//n<=100
int number;
bool flag=true;
char str[20];//这个确实是字符型数组啊
scanf("%d",&n);
number=n;
//getchar();//这一句很重要,不然就会吞掉一行数据

while(n--){
last=0;
//gets(str);
scanf("%s",str);
flag=true;
for(i=0;i<17;i++){//注意变量的局部性还是应该全局性。自增的不要总是放在循环中申明,看清外面要不要用到再确定在哪里申明
if(!(str[i]>='0'&&str[i]<='9')) break;
last+=(str[i]-'0')*rate[i];//一开始以为这里要除以100,结果发现并不要除
}
if(i<17){//应该=17才是对的
flag=false;
puts(str);
}
else{
//如果前面的正确,再来验证最后一位
if(str[17]!=change[last%11])
{
flag=false;
puts(str);
}
}
if(flag==true){
count++;
}
/*else{
puts(str);//默认输出后换行
}*/
}
if(count==number){
printf("All passed\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐