C语言刷题第五章(上)

一.题目:

1.竞选社长

(1)题目描述:

假设你们社团要竞选社长,有两名候选人A和B。社团每名同学必须并且只能投一票,最终票数最多的为社长。

(2)输入描述:

一行,包括字符序列,包含A和B,输入以字符0结束。

(3)输出描述:

一行,一行字符,A,B或者E。输出A表示A得到的票数最多,输出B表示B得到的票数最多,输出E表示两个同学得到的票数一样多。

( 4)示例:

输入:AABBBBBBBB0

输出:B

(5)代码实践:

方法一:

#include

int main( )

{

char buffer[100]={0};

gets  ( buffer );

int  count_a=0;

int count_b=0;

while(buffer[i])//创建while循环,当buffer[i]等于0时,循环停止。

{

if(buffer[i]==A)

count_a++;

if(buffer[i]==B)

count_b++

i++;//循环继续的变化

}

if(count_a>count_b)

printf("A");

else if(count_b>count_a)

print("B");

else

printf("E");

return 0;

}

方法二:

#include

int main( )

{

char buffer[100]={0};

gets  ( buffer );

int flag=0;

while(buffer[i])//创建while循环,当buffer[i]等于0时,循环停止。

{

if(buffer[i]==A)

flag++;

if(buffer[i]==B)

flag--;

i++;//循环继续的变化

}

if(flag>0)

printf("A");

else if(flag>0)

print("B");

else

printf("E");

return 0;

}

方法三:

#include

int main( )

{

int ch=0;

int flag=0;

while(((ch=getchar())!=0)&&ch!=EOF)//

{

if(ch==A)

flag++;

if(ch==B)

flag--;

}

if(flag>0)

printf("A");

else if(flag>0)

print("B");

else

printf("E");

return 0;

}

(6)总结:

<1>:在C语言中, gets 函数的作用是从标准输入(通常是键盘)读取一行字符,并将其存储到指定的字符数组中。

<2>:getchar 函数是C语言中的标准输入函数,用于从标准输入(通常是键盘)读取一个字符。

<3>:getchar 和scanf和gets的区别:

  •  读取方式不同

  scanf 按指定格式读取输入,如 scanf("%d",&num); 读取整数, scanf("%s",str); 读取字符串。读取字符串时,遇到空格、制表符\t或换行符\n就会停止读取。

 gets 能读取一整行字符串,包括空格,直到遇到换行符。
getchar 每次只读一个字符。
 

  • 输入缓冲处理不同

      使用 scanf 读取非字符类型数据(如整数、浮点数)后,如果输入缓冲区中还有剩余字符(如换行符),可能会影响后续对字符类型数据的读取,需要额外处理输入缓冲区。               .      gets 和 getchar 相对简单, gets 读取一行后会自动处理换行符, getchar 每次读取一个字符,对缓冲区的处理较为直观。

  •  安全性不同

     scanf 在读取字符串时,如果格式控制字符串设置不当,可能导致缓冲区溢出,存在安全风险。不过它比 gets 相对安全一些,因为可以通过格式控制来限制读取的字符数,如 scanf("%10s",str); 最多读取10个字符到 str 中。         gets 不进行边界检查,容易导致缓冲区溢出,存在较大安全隐患。
     getchar 通常不存在缓冲区溢出问题,因为它只读取一个字符。

2.你是天才吗

(1)题目描述:

据说智商140以上的被称之为天才,KiKi想知道自己是不是天才。请帮他编程判断。输入一个整数,如果大于140则输出天才的英文Genius。

(2)输入描述:

多组输入,每行输入包括一个整数表示智商。

(3)输出描述:

针对每行输入,输出Genius

(4)示例:

输入:160

输出:Genius

(5)代码实践:

方法一:

#include

int main ( )

{

int a=0;

while(scanf("%d",&a)!=EOF)

{

if(a>=140)

printf("Genius");

}

return 0;

}

方法二:

#include

int main ( )

{

int a=0;

while(~scanf("%d",&a))//~为C语言中按位取反的符号

{

if(a>=140)

printf("Genius");

}

return 0;

}

(6)总结:

多组输入的两种方法

方法一:如果scanf的返回值不等于EOF的时候,持续输入数据。

方法二:如果scanf的返回值和EOF(-1)按位取反为0,则停止输入数据。

你可能感兴趣的:(C语言刷题,c语言,学习)