重学C语言(五)

一、猜数字游戏

(一)代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
/*
	猜数字游戏游戏
*/
int menu(){
	printf("===========================\n");
	printf("      1,开始游戏\n");
	printf("      0,退出游戏\n");
	printf("===========================\n");
	int choice = 0;
	printf("请输入你的选择:\n");
	scanf("%d", &choice);
	return choice;
}
void guessNumber(){
	printf("请输入你的猜测:\n");
	int number;
	int result = rand() % 100 + 1;
	while (1){
		scanf("%d", &number);
		if (number < result){
			printf("猜小了\n");
		}
		else if (number > result){
			printf("猜大了\n");
		}
		else{
			printf("猜对了\n");
			return;
		}
	}
}

int main(){
	int choice = 0;
	//加载界面和选择
	choice = menu();
	if (choice == 1){
		guessNumber();
	}
	else{
		exit(0);
	}
	system("pause");
	return 0;
}

(二)结果
在这里插入图片描述
(三)总结
随机数与伪随机数的区别:随机数字的详解
难点在于如何生成一个随机数。rand()函数是C语言里生成随机数的一个函数,rand() % 100 的范围是0-99,要想在1-100之间,只要 rand() % 100 + 1 就可以;它的头文件是#include<stdlib.h>,但它并不是实际意义的随机数,每次编译,出现的随机数都是一样的。因此这里就需要用srand()函数进行初始化,利用 srand((unsigned)time(NULL)) 来实现真正意义的随机;它的头文件也是#include<stdlib.h>,这里还用到了time()函数,需要引用头文件#include <time.h>。

二、折半查找

(一)代码

#include<stdio.h>
#include<stdlib.h>
/*
	折半查找:
	写代码可以在整型有序数组中查找想要的数字,
*/
/*
	传入的值:数组,数组长度,在数字中要找到的数字
	返回值:找到了返回下标,找不到返回-1.
*/
int BinarySearch(int arr[],int len,int n){
	int left = 0;
	int right = len - 1;
	int mid = (left + right) / 2;
	while (left <= right){
		if (arr[mid] < arr[n]){//在右边找
			left = mid + 1;
			mid = (left + right) / 2;
		}
		if (arr[mid] > arr[n]){//在左边找
			right = mid - 1;
			mid = (left + right) / 2;
		}
		if (arr[mid] == n){
			return mid;
		}
	}
	return -1;
}
int main(){
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int len = sizeof(arr) / sizeof(int);
	printf("%d\n", BinarySearch(arr, len, 2));
	system("pause");
	return 0;
}

(二)结果
在这里插入图片描述
(三)总结
    折半查找又称二分查找法,这种方法要求待查找的表顺序存储而且表中关键字的大小有序排序。其查找过程是:先确定待查找记录所在的范围(区间),然后逐步缩小范围直到找到或找不到记录为止。具体方法是:将表中间位置的关键字与查找关键字进行比较,如果两者相等,则查找成功;否则利用中间位置将表分成前、后两个子表,如果中间位置的关键字大于查找的关键字,则进一步查找前一子表,否则查找后一子表。重复以上过程,直到找到满足条件的记录,查找成功,或直到子表不存在为止,此时查找不成功。

三、模拟三次密码输入的场景

最多能输入三次密码,密码正确,提示“登录成功”,
密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。

(一)代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
	模拟三次密码输入的场景
	最多能输入三次密码,密码正确,提示“登录成功”,
	密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
*/
int main(){
	char password[20] = "12345";
	int i = 3;
	while (i){
		scanf("%s", &password);
		if (strcmp(password, "88888888") == 0){
			printf("登陆成功!\n");
			break;
		}
		i--;
		printf("您还有%d次机会!\n", i);
	}
	system("pause");
	return 0;
}

(二)结果
在这里插入图片描述
在这里插入图片描述
(三)总结
字符串与字符数组的区别:
    字符数组与字符串的本质区别在于==“字符串结束标志”==。字符数组中的每个元素都可以存放任意的字符,并不要求最后一个字符必须是’\0’;但作为字符串使用时,就必须以’\0’结束,因为很多有关字符串的处理都要以’\0’作为操作时的辨别标志。如果缺少这一标志,系统并不报错,有时甚至可以得到看似正确的运行结果。但是这种潜在的错误可能导致严重的错误。这是因为在字符串处理过程中,系统在未遇到’\0’之前,会一直向后访问,以至超出分配给该字符串的内存空间而访问到其他数据所在的存储单元。
字符串比较函数:strcmp()
    strcmp()函数的一般调用形式:
                    strcmp(str1.str2)
其中,str1和str2为字符串常量或字符串数组名。
(1)从左至右比较每个字符的ASCAII码
(2)遇到’\0’为止
(3)若全部字符串相同,则两个字符串相等,比较结果为0
(4)若不等,返回第一个不相同字符的ASCAII(str1)-ASCAII(str2)

四、接收键盘字符

编写一个程序,可以一直接收键盘字符,
如果是小写字符就输出对应的大写字符,
如果接收的是大写字符,就输出对应的小写字符,
如果是数字不输出。

(一)代码

#include<stdio.h>
#include<stdlib.h>
int main(){
	char ch;
	while ((ch = getchar()) != EOF){
 		if (ch >= 'a'&&ch <= 'z'){
			putchar(ch - 32);
		}	
		else if (ch >= 'A'&&ch <= 'Z'){
			putchar(ch+32);
		}
		else if(ch>= 48 && ch<=57){
			putchar(ch);
		}
	}
	system("pause");
	return 0;
}

一个改进版本:

#include<stdio.h>
#include<stdlib.h>
//用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等
#include<ctype.h>
//强制大写 &~32
//强制小写 或
//大小写转换 异或
int main(){
	char ch = getchar();
	// 是否为字母
	if (iswalpha(ch)){
		//是否为小写
		if (islower(ch))
			putchar(ch^32);
		if (isupper(ch))
			putchar(ch ^ 32);
	}
	// 是否为数字
	if (isdigit(ch));
	system("pause");
	return 0;
}

(二)结果
在这里插入图片描述
(三)总结

学会查ASCAII表是做这道题的关键。
ctype.h是C语言的标准头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节字符,也支持宽字符。
在这里插入图片描述

发布了65 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44002167/article/details/103145591