C语言选择、循环练习——n阶乘、二分法、显示字符串、密码验证、猜数字、关机恶作剧

内容

1.n阶乘
2.二分法
3.显示字符串
4.密码验证
5.猜数字
6.关机恶作剧
———————————————————————————————————

*1.n阶乘

n! = n*(n-1)(n-2) * … *1;
sum=1!+2!+…+n!;
实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int factor(int num){
	int ret=1;
	for(int i=0;i<n;i++){
		ret=ret*i;
	}
	return ret;
}

int main(){
	int n=0;
	int sum=0;
	printf("请输入一个整数\n");
	scanf("%d",&n);
	for (int i = 1; i <= n;i++) {
		int factor = 1;//乘积
		printf("%d的阶乘为:%d\n",i,factor(i));
		sum=sum+factor(i);
	}
	printf("前n阶阶乘和为:%d\n",sum);
	system("pause");
	return 0;
}

结构为:
在这里插入图片描述

*2.二分法

二分法:在有序数组中实现快速查找的方法;
int s[]={1,2,3,4,5,6 } 查找数num=2
方法:首先设置两个变量,left和right表示第一个和最后一个数组元素下标;计算中间元素下标mid=(left+right)/2 ;比较num和s[mid],如果数num在s[mid]左侧则right值变为mid-1;反之在右侧更新left为mid+1;继续比较,直到s[mid]==num;返回下标mid。
实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int dichotomy(int arr[],int num, int len) { //定义一个函数:实现二分法查找数组元素
	int left = 0;
	int right = len - 1;
	int mid = 0;
	while(left<=right) {
		mid = (left + right) / 2 ;
		if (num > arr[mid]) {
			left = mid + 1;
		}
		else if (num < arr[mid]) {
			right = mid - 1;
		}
		else {
			break;
		}
	}
	if (left > right) {
		return -1;
	}
	return mid;
}

int main()
{
	//二分法查找数组元素,找到返回下标,找不到则输出 找不到
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int num = 0;
	printf("请输入一个需要查找的整数:\n");
	scanf("%d", &num);
	int ret = dichotomy(arr, num, len);
	if (ret == -1) {
		printf("找不到\n");
	}
	else {
		printf("找到了,%d 在数组中的下标为:%d\n", num, ret);
	}
	
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述

*3.显示字符串

演示多个字符(字符串“welcome to C!”),从两边移动并显示,向中间汇集。
实现:

#include<stdio.h>//包含打印输出函数
#include<stdlib.h>//包含system库函数
#include<string.h>//包含strlen函数,计算字符串长度
#include<Windows.h>//包含Sleep库函数

int main(){
	char str1[]="welcome to C!";
	char str2[]="#############";
	int left=0;
	int right =strlen(str1)-1;
	while(left<=right){	
		str2[left]=str1[left];
		str2[right]=str1[right];
		left++;
		right--;
		printf("%s\n",str2);
		//Sleep(500);  延迟时间
		//system("cls"); 清屏操作
	}
	system("pause");//请按任意键继续!
	return 0;
}

结果:
在这里插入图片描述
增加效果:让字符串从str2从两边向中间显示str1
实现方法:通过清屏 system(“cls”) 操作,清除前几行显示的字符串,让其只显示最后一行,然后通过 Sleep() 库函数让程序进程放慢。
注意:要使用这两个函数,必须包含头文件

  • #include<stdlib.h>//包含system库函数
  • #include<Windows.h>//包含Sleep库函数

*4.验证密码

模拟用户登录,验证密码,允许用户 登录三次,若密码正确则显示登陆成功,错误则显示您已错误3次,退出登录!
实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main(){
	char password[1024]={0};
	printf("请输入登录密码:");
	scanf("%s",password);//scanf输入字符串时不用加地址符&,输入整数时必须加&
	int i = 0;
	for(;i<3;i++){
		if(strcmp(password ,1234)==0){
			printf("登陆成功\n");
			break;
		}else{
			printf("密码错误\n");
		}
	}
	if(i>=3){
		printf("您已错误3次,退出登录!\n");
	}
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述

*5.猜数字

  • 随机生成数,设置随机种子,避免每次生成的随机数时一样的:int random=rand()%100+1; srand((unsigned)time(NULL));
  • 循环判断玩家输入猜测的数字和系统随机生成的数进行比较
  • 定义菜单函数和猜测游戏函数

实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu(){
	printf("****************************\n");
	printf("*** 1.play guess game!\n ***\n");
	printf("*** 2.exit! ****************\n");
	printf("****************************\n");
	printf("请选择功能:");
}

void guessGame(){
	int input=0;
	int random_num = rand()%100+1;
	while(1){
		printf("请输入你猜测的数字:\n");
	    scanf("%d",&input);
		if(input<random_num){
			printf("猜小了!\n");
		}else if(input>random_num){
			printf("猜大了!\n");
		}else{
			printf("猜对了!\n");
			break;
		}
	}
}

int main(){
	srand((unsigned)time(NULL));
	int select=0;
	menu();
	printf("请选择功能:");
	scanf("%d",&select);
	while(1){
		switch(select){
		case 1: guessGame();
			break;
		case 0: printf("exit!\n");
				system("cls");
			break;
		}
		break;
	}
	system("pause");
	return 0;	
}

结果:
在这里插入图片描述

*6.关机恶作剧

命令操作:

  • shutdown -s -t 60; //电脑将在10分钟内关机
  • shutdown -a; //解锁,取消关机
#include<stdio.h>
#include<stdlib.h>

int main() {
	//goto 跳转语句的使用
	char input[] = { 100 };
	system("shutdown -s -t 600");
	while (1) {
		printf("电脑将在10分钟内关机,如果输入:我是猪,就取消关机!\n请输入:");
		scanf("%s", input);
		if (0 == strcmp(input, "我是猪"))
		{
			printf("你真听话\n");
			system("shutdown -a");
			break;
		}
		printf("再给你一次机会,考虑清楚要不要输入\n");
	}
	system("pause");
	return 0;
}

在这里插入图片描述

  • C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
    从理论上 goto语句是没有必要的, 实践中没有goto语句也可以很容易的写出代码。
    但是某些场合下goto语句还是用得着的, 最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


int main() {

	//goto 跳转语句的使用
	char input[10] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
	scanf("%s", input);
	if (0 == strcmp(input, "我是猪"))
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值