X在你們的幫助下終於找到了一個妹紙,因而開始了漫漫的追求之路,那麼你們猜一猜X能不能追的上呢?數組
X初始對妹紙有一個心動值,妹紙對X有一個好感值,在追求時發生的的一系列事件中,當X對妹紙的心動值大於等於100,而且妹紙對X的好感值也大於等於100時,X就追上了妹紙。而且不會由於之後兩個值低於100的狀況而分手。app
事件1:兩我的一塊兒吃飯,那麼心動值和好感值都增長5spa
事件2:兩我的一塊兒逛街,那麼心動值和好感值都增長10code
事件3:若是X給妹紙買了禮物,那麼心動值減小5,好感值增長10blog
事件4:若是妹紙給X買了禮物,那麼心動值增長20,好感值減小5事件
那麼咱們猜一猜吧。ip
第一行輸入n(n < 100),表示發生了n個事件。字符串
以後的n行,每行一個字符,表示事件i發生了。(事件1的代號A,事件2的代號B,事件3的代號C,事件4的代號D)get
最後一行,輸入兩個整數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)。