算平均数
问题描述
让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入数字的个数和平均数。
思路
变量->算法->流程图->程序
变量:
这里需要三个变量:一个变量记录读到的整数,一个变量记录累加的结果,一个变量记录读到的数的个数。
算法:
1、初始化变量sum和count为0;
2、读入number;
3、如果number不是-1,则将number加入sum,并将count加1,回到2;
4、如果number是-1,则计算和打印出sum/count(注意换成浮点来计算)。
程序:
/*
计算平均数
*/
#include <stdio.h>
int main()
{
//初始化
int sum = 0;
int count = 0;
int number;
//计算平均数
scanf("%d", &number);
while(number != -1){
sum += number;
count++;
scanf("%d", &number);
}
printf("%f\n",1.0*sum/count ); //sum和count为整数,乘以1.0是为了换成浮点数计算
return 0;
}
可以看到在程序中scanf("%d", &number)出现了两次,我们可以考虑用do_while语句。
程序:
/*
计算平均数
*/
#include <stdio.h>
int main()
{
//初始化
int sum = 0;
int count = 0;
int number;
//计算平均数
do{
scanf("%d", &number);
if(number != -1){
sum += number;
count++;
}
}while(number != -1);
printf("%f\n",1.0*sum/count );
return 0;
}
猜数游戏
问题描述
让计算机来想一个1到100之间的数,然后让用户来猜,用户每输入一个数,就告诉他(她)是大了还是小了,直到用户猜中为止,最后还要告诉用户他(她)猜了多少次。
思路
变量->算法->流程图->程序
变量:
这里需要三个变量:一个变量记录计算机产生的随机数,一个变量记录用户猜的数,一个变量记录用户猜数的次数。
算法:
1、计算机随机想一个数,记在变量number里;
2、一个负责记次数的变量count初始化为0;
3、让用户输入一个数字a;
4、count递增(加一);
5、判断a和number的大小关系,如果a大,就输出“大”,如果a小就输出“小”;
6、如果a和number是不相等的,程序回到第三步;
7、否则,程序输出“猜中”和次数,然后结束。
程序:
/*
猜数游戏:系统产生一个1到100的随机数,用户进行猜测
*/
#include <stdio.h>
int main()
{
//产生一个1到100之间的随机数
srand(time(0));
int number = rand()%100+1;//rand()为产生一个任意位数的随机数,将得到的数对100取余得到0到99之间的随机数,然后加一得到1到100之间的随机数
// 初始化
int count = 0;
int a = 0;
printf("我已经想好了一个1到100之间的数。");
//猜数
do{
printf("请猜这个1到100之间的数:");
scanf("%d", &a);
count++;
if(a > number){
printf("你猜的数大了");
}else if(a < number){
printf("你猜的数小了");//应该用else if 而不是else
}
}while(a != number);
printf("太好了,你用了%d次就猜到了答案\n",count );
return 0;
}
数的逆序
问题描述
输入一个正整数,输出逆序的数,其结尾的0也应逆序输出,如输入“700”,应输出“007”。
思路
变量->算法->流程图->程序
整数的分解:
- 对一个整数做%10的操作,就得到它的个位数;
- 对一个整数做/10的操作,就去掉了它的个位数;
- 然后再对2的结果做%10的操作,就得到原来数的十位数;
- 依此类推可得到所有的位数。
变量:
这里需要两个变量:一个变量记录输入的正整数,一个变量记录整数每一位的数字。
算法:
1、让用户输入一个正整数x;
2、x对10取余得到最右位的数,将其保存在变量digit中;
3、输出digit的值;
4、x/10,去掉它的最右位数;
5、如果x>0,程序回到第2步;
6、否则,该整数所有位数已经逆序输出,程序结束。
程序:
/*
数的逆序:输入一个正整数,输逆序的数
*/
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int digit = 0;
do{
digit = x%10;
printf("%d",digit);
x /= 10;
} while(x > 0);
return 0;
}
素数判断
问题描述
输入一个正整数,判断这个数是不是素数。
思路
变量->算法->流程图->程序
变量:
这里需要三个变量:一个变量记录输入的正整数,一个变量记录这个数是不是素数,一个变量记录判断能否被该整数整除的除数。
算法:
1、让用户输入一个正整数x;
2、一个负责记录是否为素数的变量isPrime初始化为1(是素数);
3、x对除数i取余,如果结果为0,让isPrime=0,转到6;
4、如果结果不为0,i加1;
5、如果i<x,转到3;
6、如果isPrime=1,该数为素数;
7、否则,不是素数;
8、程序结束。
程序:
/*
素数判断:输入一个正整数,判断这个数是不是素数。
*/
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int isPrime = 1;//是素数
int i;
for(i=2; i<x; i++){
if(x%i == 0){
isPrime = 0;//不是素数
break;
}
}
if(isPrime == 1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
break vs continue:
- break:跳出循环;
- continue:跳过循环这一轮剩下的语句进入下一轮循环。
100以内的素数
问题描述
输出100以内的素数。
思路
变量->算法->流程图->程序
算法:
1、初始化变量x=2;
2、判断x是不是素数;
3、如果x是素数,输出x;
4、x加1;
5、如果x<=100,转到2;
6、否则,程序结束。
程序:
/*
输出100以内的素数
*/
#include <stdio.h>
int main()
{
int x ;
for(x = 2; x <= 100; x++){
int isPrime = 1;//是素数
int i;
for(i=2; i<x; i++){
if(x%i == 0){
isPrime = 0;//不是素数
break;
}
}
if(isPrime == 1){
printf("%d ",x);
}
}
printf("\n");
return 0;
}
前50个素数
问题描述
输出前50个素数。
程序:
/*
输出前50个素数
*/
#include <stdio.h>
int main()
{
int x ;
int cnt = 0;
for(x = 2; cnt < 50; x++){
int isPrime = 1;//是素数
int i;
for(i=2; i<x; i++){
if(x%i == 0){
isPrime = 0;//不是素数
break;
}
}
if(isPrime == 1){
printf("%d ",x);
cnt++;
}
}
printf("\n");
return 0;
凑硬币
问题描述
用1角、2角和5角的硬币凑出10元以下的金额,该金额由用户指定。
程序:
/*
凑硬币:用1角、2角和5角的硬币凑出10元以下的金额,该金额由用户指定
*/
#include <stdio.h>
int main()
{
int x ;
int one, two, five;
scanf("%d",&x);
for(one = 1; one < x*10; one++) {
for(two = 1; two < x*5; two++) {
for(five = 1; five < x*2; five++) {
if(one + two*2 + five*5 == x*10) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",
one, two, five, x);
}
}
}
}
return 0;
}
前面的程序会输出所有的可行方案,如果我们只需要一种方案就可以,就需要使用break语句。
程序:
/*
凑硬币:用1角、2角和5角的硬币凑出10元以下的金额,该金额由用户指定
*/
#include <stdio.h>
int main()
{
int x ;
int one, two, five;
int exit = 0;
scanf("%d",&x);
for(one = 1; one < x*10; one++) {
for(two = 1; two < x*5; two++) {
for(five = 1; five < x*2; five++) {
if(one + two*2 + five*5 == x*10) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",
one, two, five, x);
exit = 1;
break;
}
}
if (exit == 1) break;
}
if (exit == 1) break;
}
return 0;
}
这里有三重循环,因此需要用到三次break语句,我们也可以用goto语句,但是goto语句一般只能用于打破循环。
程序:
/*
凑硬币:用1角、2角和5角的硬币凑出10元以下的金额,该金额由用户指定
*/
#include <stdio.h>
int main()
{
int x ;
int one, two, five;
scanf("%d",&x);
for(one = 1; one < x*10; one++) {
for(two = 1; two < x*5; two++) {
for(five = 1; five < x*2; five++) {
if(one + two*2 + five*5 == x*10) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元。\n",
one, two, five, x);
goto out;
}
}
}
}
out:
return 0;
}