标签:简单 第一个字符 一起 回车 越界 个人 problem 编译 就会
X在大家的帮助下终于找到了一个妹纸,于是开始了漫漫的追求之路,那么大家猜一猜X能不能追的上呢?
X初始对妹纸有一个心动值,妹纸对X有一个好感值,在追求时发生的的一系列事件中,当X对妹纸的心动值大于等于100,并且妹纸对X的好感值也大于等于100时,X就追上了妹纸。并且不会因为以后两个值低于100的情况而分手。
事件1:两个人一起吃饭,那么心动值和好感值都增加5
事件2:两个人一起逛街,那么心动值和好感值都增加10
事件3:如果X给妹纸买了礼物,那么心动值减少5,好感值增加10
事件4:如果妹纸给X买了礼物,那么心动值增加20,好感值减少5
那么我们猜一猜吧。
第一行输入n(n < 100),表示发生了n个事件。
之后的n行,每行一个字符,表示事件i发生了。(事件1的代号A,事件2的代号B,事件3的代号C,事件4的代号D)
最后一行,输入两个整数k1,k2(0 < k1 < 100 && 0 < k2 < 100),k1表示X对妹纸的心动值,k2表示妹纸对X的好感值。
输出一行。
如果X追上妹子,那么输出”happy!”。
否则,输出”tiantai!” (不含引号) 。
4 A B C D 80 80
happy!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 int i,n,m,z,f=0; 8 char a[100]; 9 scanf("%d",&z); 10 getchar(); 11 for(i=0;i<z;i++) 12 { 13 scanf("%c",&a[i]); 14 getchar(); 15 } 16 scanf("%d %d",&n,&m); 17 for(i=0;i<z;i++) 18 { 19 if(a[i]==‘A‘) 20 { 21 n=n+5; 22 m=m+5; 23 } 24 else if(a[i]==‘B‘) 25 { 26 n=n+10; 27 m=m+10; 28 } 29 else if(a[i]==‘C‘) 30 { 31 n=n-5; 32 m=m+10; 33 } 34 else if(a[i]==‘D‘) 35 { 36 n=n+20; 37 m=m-5; 38 } 39 printf("%d %d\n",n,m); 40 if(n>=100&&m>=100) 41 { 42 f=1; 43 44 } 45 46 } 47 if(f==0) 48 { 49 printf("tiantai!\n"); 50 } 51 else printf("happy!\n"); 52 return 0; 53 }
非常简单的一道题目,只需要注意字符输入时规避回车的影响每次做完一件事就进行一次判断就可以了
问题在于和我同学讨论的过程中,发现他输入字符的代码是这样的:
1 scanf("%d",&z); 2 getchar(); 3 for(i=0;i<z;i++) 4 { 5 scanf("%s",&a[i]); 6 }
这里对于字符的输入,他使用了%s,而且不需要考虑回车的影响,这看起来是非常奇怪的;
事实上,由于后面是一个字符数组,当使用%s时,会以&a[i]为首地址输入一个字符串 "X\0"(X为大写字母),而在下一次输入时,a[i+1]处储存的‘\0‘就会被下一个字符串的第一个字符覆盖,在这道题中不会产生影响。
在此程序中定义的字符数组是足够大的,所以不会产生其他影响,当定义的数组大小为临界值时,这种输入方式就会因越界产生崩溃的可能,且当后面的变量为一个字符时,编译器也不会报错(CodeBlocks)。
【SDUT】2019SDUTACM第一次选拔赛 F- X的追求道路
标签:简单 第一个字符 一起 回车 越界 个人 problem 编译 就会
原文地址:https://www.cnblogs.com/sdtuzxr/p/11980491.html