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