C语言作业NOTES

C语言第十一次课后作业NOTES
【字符】自编车号2009年3月9日起,北京市允许机动车所有人自己编写小汽车的以“京N”开头的号牌的后5位。自编小汽车号牌的规则如下:号牌号码的最后一位必须为数字,其余四位有且必须有两位为大写英文字母(字母I、O不可用)。例如:京NAB999,京NC9D99,京NE99F9,京N9GH99,京N9J9K9,京N99LM9等。
输入:
5位自编号牌
输出:
判断自编号牌是否合法

Q1:如何判断自编号牌最后一位是数字还是字母?
A:这个问题一开始还真的难倒了我,我一开始用的是采用大小写字母对应的ACII码的范围来判断,但是后来,我通过查找别人的程序了解到,C语言中,判断一个字符是否为数字或者字母的方法:可采用if(n == ‘9’)或是if((n >= ‘A’)&&(n <= ‘Z’) )这样的单引号加字符的形式,小写字母同理。

Q2:保密用例过不了怎么办?
A:嗯,其实就是反复读题,然后看自己是否漏了条件。像我一开始,就漏了“字母I、O不可用”这一条。但是当我改正以后,仍有一个保密用例过不了。然后我就上网查找车牌号的编码规则,发现,车牌号中使用的数字是有范围的,即“0-9”,当时我还不知道这一条有什么意义,但是当我实在是在其他方面改无可改(就是把ASCII码改成了‘A’之类的形式以后),我觉得,是不是要规定一下数字的范围?(毕竟计算机这么蠢)。然后,我又找了一个别人编写的程序,发现,他确实规定了数字的取值范围。然后我也依葫芦画瓢,把数字的范围给规定了,这才通过最后一个保密用例=_=。

Q3:一点关于字符串读入的小反思:

1)Q:为什么我一开始用scanf()无法读入字符串儿? A: 因为我用scanf读入时,写成了这种形式:scanf(“%s”, &bn[N]),事实上,后来我翻书得知,字符串的读入是不需要加“&”的,因为编译器已经把数组名“bn”当作指针来处理了,我再加一个“&”反而是语法错误。并且也不需要加那个[N]。正确的格式是“scanf(“%s”, bn);”。

2) Q:为什么我改用gets()函数读入字符串,它自动就给我将程序运行完毕了?A:因为我在gets()的括号里写的是gets(&a),和scanf一样的错误,正确的格式也是只需要写数组名就可以了:“gets(bn);”。当时这个问题,着实纠结了我好久,但是后来仔细反复看书,终于发现了自己的错误。

3)Ⅰ.一点别人的程序给我的启发:程序尽量设置但一出口,也就是在程序设计的过程中,当输出的结果,是两种相反的情况时,我们可以引入一个辅助判断的变量flag(或者IsPrime之类的),把它们用做BOOL类型来作出判断,就是“if(flag); printf();else printf();”之类的,从而选择输出的结果。举个栗子,我一开始写这个程序的时候,是一开始判断完最后一位是否为数字的时候,立刻接上“printf(“ok.\n”);”,然后整个程序,我都是一判断就立刻printf()了,就很烦,看着程序也很长。后来,我直接用了flag,把printf()统一移到了程序的结尾,这样不仅看起来清爽很多,而且听翁恺老师说,在编写大型程序时就不容易出错了。

Ⅱ.说说字符串输入时编译器的局限性:这个其实时接着那个数字的范围的一点发现和思考。就是我一开始以为,编译器在读入字符串的时候,一位数字存储在一个单元里。但是后来,我再确定要不要规定范围的时候,我输入了一个10,结果发现,程序仍然能够正常的执行。所以,编译器在读入字符串的时候,应该是秉持这样的原则,就是不是将单位数字储存在一个单元中,而时会将你输入的数据存储进一个单元中。但是我有一点不解的是,它又是如何判断我输入的数据是一位数还是两位数(或者高位数)的呢?我觉得这里面就有一个随机性了,然后不规定范围的后果,现在是保密用例过不了,以后写一些大型程序,就有可能是程序崩溃了,所以,编译器的这种盲目性和随机性,是非常可怕的,这使我意识到,真的要多考虑一下数据的取值范围问题。还有以前我写if的时候,没有加上else,然后编译器就傻傻的过不了用例,非得我去写明else以后如何如何,它才过了用例,所以,编译器真的很蠢,切记,切记!

#include <stdio.h>
#include <string.h>
#define N 5
#define j 2
#define Board_number bn
int main(void)
{ 
 int i, cnt, flag;
 char bn[N + 1];//输入号牌
 scanf("%s", bn);
 //判断最后一位是否为数字 
 if((bn[N - 1] > '9') || (bn[N - 1] < '0')){
  flag = 0;
  }
 //判断其余四位是否有两位为大写英文字母(I,O除外) 
 else {
  cnt = 0;
  for(i = 0; i < (N - 1); i++){
  if((bn[i] >= 'A') && (bn[i] <= 'Z') && (bn[i] != 'I') && (bn[i] != 'O'))
  cnt ++;
  }
   if(cnt == j){
   flag = 1;
  }
  else{
   flag = 0;
  }
 }
  if(flag){
   printf("ok.\n");
  }
  else {
   printf("no.\n");
  }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值