SCAU高级语言程序设计--实验5 循环结构(一)(2)
二、堂下练习
1、字符变换
题目:由键盘输入一个句子(字符个数不定,最多不超过80个,以'\n'结束),将其中的大写字符变成小写(其它类型的字符不变), 最后输出变换后的句子。
思路:循环取每一个字符,如果取到\n,就结束循环。判断是否为大写。getchar()函数是仅取一个字符。
#include<stdio.h>
int main (){
char c;
while((c=getchar())!='\n'){
if( c>='A' && c<='Z')
c = c + 'a' - 'A';
putchar(c);
}
return 0;
}
2、计算数列和
题目:编程实现,由键盘输入n,计算输出数列前n项和。(结果保留四位小数,提示:要使用double,否则精度不够)
思路: 观察数列可以知道,下一个数的分子=上一个数的分子+分母,下一个数的分母=上一个数的分子。变量t为中间数,过渡作用。
#include<stdio.h>
int main (){
int i,t,n;
double a=2,b=1,s=0;
scanf("%d"&n);
for(i=1;i<=n;i++);{
s = s+a/b;
t = a;
a += b;
b = t;
}
printf("%.4f\n",s);
return 0;
}
3、*统计单词个数
题目:写一个函数实现:输入一行字符,以空格分割单词,回车结束输入,输出单词的个数
思路:一般单词之间会有空格,但是可能出现两个问题:
1)句子开头就有单个或者多个空格。例如:__This_is_\n
2)单词后有连续多个空格。例如:This__is_______a____\n
故需要复杂一些的算法。
方法:1.我们核心思想是通过一个flag来确定单词的起始。
2.flag起始为1,然后开始遍历每一个字符。如果遇到flag为1而且取到的字符c不为空格的时候,才计算这是单词的开始位置,同时flag=0设置单词的起始位置。
3.起始位判定为flag=1,c不为空格;结束位判定为flag=0,c为空格。(好好体会一下,可以自己画个流程图)
#include<stdio.h>
int main (){
int num=0,flag=1,i;
char c;
for(i=0;(c=getchar())!='\n';i++){//遍历,同时判断输入结束了。
if(flag == 1){
if(c != ' '){//单词的起始,如果有连续空格或者句子开头就又空格,不计算单词数。
num++;
flag = 0;
}
}
else if(c == ' ')//判断单词的结束位置。
flag = 1;//遇到单词结尾,flag为1
}
printf("%d\n",num);
return 0;
}
4、*百万富翁
题目:一个百万富翁遇到一个陌生人,陌生人找他谈了一个换钱的计划。该计划如下:我每天给你m元, 而你第一天只需给我一分钱。第二天我仍给你m元,你给我2分钱。第三天,我仍给你m元, 你给我4分钱。依次类推,你每天给我的钱是前一天的两倍,直到一个月(30天)。 百万富翁很高兴,欣然接受这个契约。现要求,编写一个程序,由键盘输入m, 计算多少天后,百万富翁开始亏钱。
思路:1、计算陌生人累加给的。2、计算富翁累加给的。3、每天比较,到富翁亏的那天就输出天数。
#include<stdio.h>
#include<math.h>
int main (){
int n=0,m,i;
scanf("%d",&m);
for(i=1;i<=30;i++){//计算天数
n += 0.01*pow(2,i-1);//富翁累加的钱
if(n-i*m >= 0)//比较陌生人与富翁给的钱
break;//如果富翁开始亏了,就跳出循环
}
printf("%d\n",i);
return 0;
}