C 言語のブランチとループの古典的な例 (初心者向け)

1. n の階乗を計算する

まず、このトピックを見て、数学的な観点から分析します
。例: 5! =1×2×3×4×5=120は
1から5までの5つの連続する数字になるので、必然的に循環
を考えることになります。

#include <stdio.h>
int main()
{
    
    
	//n的阶乘
	int i, n;
	scanf("%d", &n);
	int ret = 1;//ret是阶乘的最终得数,因为1×任何数=任何数
	for (i = 1; i <= n; i++)
	{
    
    
		ret = ret * i;
	}
	printf("%d的阶乘为:%d",n , ret);
	return 0;
}

2. 1!+2!+3!+...+10!を計算します。

先ほどの前菜を取り除いた後、この問題をもう一度見てみましょう。
階乗の加算です。nの階乗の計算方法は
すでに知っています。では、逐次階乗の加算を計算するにはどうすればよいでしょうか。前の質問では、次のように計算できます。その階乗が n であるものであれば、次のことができます。 ネストされたループでは、n はループ変数です。


int main()
{
    
    
	int i, n;
	int sum = 0;
	int ret = 1;
	for (n = 1; n <= 5; n++)
	{
    
    
		for (i = 1; i <= n; i++)
		{
    
    
			ret = ret * i;
		}
		sum = sum + ret;//for循环嵌套中要注意表达式的位置噢,万万不可搞错循环体

	}
	printf("%d",sum);
	return 0;
}

こうして
完成です
——————————————————————————————————————————— ————————————————————————————————————————————————— ————————————————————————————————————————————————— ——
_ コードを作成すると、
結果が間違っていることがわかり、
デバッグします ( F10 を押し、デバッグ中にモニタリングに入り、表示するには ret と sum を入力します)。
ここに画像の説明を挿入

理由は、ret が2 番目の for に入るたびに 1 に変化せず、異常に高いデータが発生するためです。その後
、最初の for ループにret=1
を追加する必要があります。変更後、次の結果が得られます。

int main()
{
    
    
	int i, n;
	int sum = 0;
	int ret = 1;
	for (n = 1; n <= 5; n++)
	{
    
    
	    ret = 1for (i = 1; i <= n; i++)
		{
    
    
			ret = ret * i;
		}
		sum = sum + ret;//for循环嵌套中要注意表达式的位置噢,万万不可搞错循环体

	}
	printf("%d",sum);
	return 0;
}

正しい答えを得るために

3. 順序付けされた配列内の特定の数値 n の添え字を見つけます。(二分探索)

:これは順序付けられた配列です。
まず基本的な原理を理解する必要があります。二分探索についてあまり触れたことがない人も多いと思います。まずは二分探索の2から簡単に想像できることを簡単に理解しましょう
。途中から検索し、一度の検索で半分のデータを除外することができます 検索が実行されます 操作は比較的簡単です
二分探索の概念図

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = (sizeof(arr) / sizeof(arr[0]))-1;//数组下标从0开始
	int input;//你要查找的数字
	int flag = 0;//一个标志,用来判断是否找到数字
	scanf("%d", &input);
	while (left <= right)
	{
    
    
		int mid = (left + right) / 2;
		if (arr[mid] < input)
		{
    
    
			left = mid+1;
		}
		else if (arr[mid] > input)
		{
    
    
			right = mid-1;
		}
		else
		{
    
    
			printf("congratulations,下标是%d\n", mid);
			break;
			int flag = 1;
		}
	}
	if (flag == 0)
	{
    
    
		printf("找不到");
	}
	return 0;
}

4. 数字当てゲーム

メインイベント、重要なイベント、重要なイベント、重要なことを 3 回言います
。上記の基礎があれば、すでに簡単なミニゲームを作成できると思います。
ミニゲームを作成しているので、デザインアイデア

デザインのアイデア

まず、選択用のメニューを作成する必要があり、ゲームに参加することを選択した後、入力した数値と比較するための乱数が必要になります。
そこで、メニュー、乱数、比較の 3 つのモジュールに分けて設計します。

メニュー

メニューのデザインは複雑な操作は必要ありません。できるだけシンプルな道なので、
機能を設計しました
ここに画像の説明を挿入
。初心者は呆然とすると思います。どうやって書き続ければよいですか?

次に対応する操作を実行するために番号を選択することがわかっています

次に、 1 と 0 が対応するプログラムに対応するように分岐ステートメントを記述します。
ここに画像の説明を挿入
このように、関数ゲームを作成するだけで、基本的にミニゲームが完成します。

しかしその前に、メニューとスイッチの接続を改善する必要がありますが、同時にスイッチも改善する必要があります。
プレイヤーは一度しか入力できないことが知られており、時には間違いを犯し、時には入力したい場合もあります。プレイを続けてください。
問題を解決するにはループが必要です。Do while で問題を完全に解決できます。

void menu()
{
    
    
    printf("********************\n");
	printf("******1.play  ******\n");
	printf("********************\n");
	printf("******0.exit  ******\n");
	printf("********************\n");
}
void game()
{
    
    
   
}
int main()
{
    
    
    int input;
    do
    {
    
    
      menu();
      scanf("%d",&input);
      switch (input)
		{
    
    
		case 1:
			game();
			break;//switch中的break用来跳出switch
		case 0:
			printf("您已退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);//input为0时,直接跳出循环
	return 0}

これでゲーム関数の作成を開始できます

ゲームのデザイン()

数字当てゲームなので乱数と切り離せないはず

乱数生成(リンク)
リンクの内容を読んで、皆さんは理解できたと思いますが、わからなくても大丈夫です、使い方は後ほど説明しますので覚えておいてください
。以下の図は乱数生成の核心です

srand((unsigned)time(NULL));//strsnd理解为种子,rand从中调用种子
int ret=rand()%100+1;//这里我们选用随机数范围是1到100,模100是因为任何数模100结果为0到99,故+1

結局、数字の推測まであと 1 つだけです。

	int guess;
	while (1)
	{
    
    
		printf("输入猜的数字\n");
		scanf("%d", &guess);
		if (guess > ret)
		{
    
    
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
    
    
			printf("猜小了\n");
		}
		else
		{
    
    
			printf("猜对了\n");
			break;
		}
     }
}

完全なコード

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
    
    
	printf("********************\n");
	printf("******1.play  ******\n");
	printf("********************\n");
	printf("******0.exit  ******\n");
	printf("********************\n");
}
void game()
{
    
    
	//1.设置随机数;
	int ret=rand()%100+1;//利用随机数种子创建1到100的随机数,因为任何数模100结果为0到99.
	//2.进行比较;
	int guess;
	while (1)
	{
    
    
		printf("输入猜的数字\n");
		scanf("%d", &guess);
		if (guess > ret)
		{
    
    
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
    
    
			printf("猜小了\n");
		}
		else
		{
    
    
			printf("猜对了\n");
			break;
		}
     }
}
int main()
{
    
    
	srand((unsigned)time(NULL));//随机数种子,strand在主函数中是语法规则哦,不用过于深究
	//猜数字
	int input;//不能设置在循环内部,否则为局部变量,while出现未定义标识符
	do
	{
    
    
		menu();//打印菜单

		scanf("%d", &input);
		switch (input)
		{
    
    
		case 1:
			game();
			break;
		case 0:
			printf("您已退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

間違いがありましたらご指摘ください

おすすめ

転載: blog.csdn.net/2301_78636079/article/details/131815754