中国大学MOOC《程序设计入门-C语言》学习(四):循环的一些例子

算平均数

问题描述

让用户输入一系列的正整数,最后输入-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”。

思路

变量->算法->流程图->程序

整数的分解:

  1. 对一个整数做%10的操作,就得到它的个位数;
  2. 对一个整数做/10的操作,就去掉了它的个位数;
  3. 然后再对2的结果做%10的操作,就得到原来数的十位数;
  4. 依此类推可得到所有的位数。

变量:
这里需要两个变量:一个变量记录输入的正整数,一个变量记录整数每一位的数字。

算法:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章