C语言学习笔记 从零开始

今日第一课(看我能坚持多久吧)

进度174节/68节

每次学习完后我都会在Github上传源码

ASCII对照

十进制八进制十六进制Ctrl符ASCIIMsg
000000CTRL-@NUL
100101CTRL-ASOHGTL
200202CTRL-BSTX
300303CTRL-CETX
400404CTRL-DEOTSDC
500505CTRL-EENQPPC
600606CTRL-FACK
700707CTRL-GBEL
801008CTRL-HBSGET
901109CTRL-IHTTCT
100120ACTRL-JLF
110130BCTRL-KVT
120140CCTRL-LFF
130150DCTRL-MCR
140160ECTRL-NSO
150170FCTRL-OSI
1602010CTRL-PDLE
1702111CTRL-QDC1LLO
1802212CTRL-RDC2
1902313CTRL-SDC3
2002414CTRL-TDC4DCL
2102515CTRL-UNAKPPU
2202616CTRL-VSYN
2302717CTRL-WETB
2403018CTRL-XCANSPE
2503119CTRL-YEMSPD
260321ACTRL-ZSUB
270331BCTRL-[ESC
280341CCTRL-\FS
29035一维CTRL-]GS
300361ECTRL-^RS
310371FCTRL-_US
3204020SPMLA0
3304121!MLA1
3404222MLA2
3504323编号MLA3
3604424$MLA4
3704525%MLA5
3804626&MLA6
3904727MLA7
4005028(MLA8
4105129)MLA9
420522A*MLA10
430532B+MLA11
440542C,MLA12
45055二维MLA13
460562E.MLA14
470572F/MLA15
48060300MLA16
49061311MLA17
50062322MLA18
51063333MLA19
52064344MLA20
53065355MLA21
54066366MLA22
55067377MLA23
56070388MLA24
57071399MLA25
580723A:MLA26
590733B;MLA27
600743C<MLA28
610753D=MLA29
620763E>MLA30
630773F?UNL
6410040@MTA0
6510141AMTA1
6610242BMTA2
6710343CMTA3
6810444DMTA4
6910545EMTA5
7010646FMTA6
7110747GMTA7
7211048HMTA8
7311149IMTA9
741124AJMTA10
751134BkMTA11
761144CLMTA12
771154DMMTA13
781164ENMTA14
791174FOMTA15
8012050PMTA16
8112151QMTA17
8212252RMTA18
8312353SMTA19
8412454TMTA20
8512555UMTA21
8612656VMTA22
8712757WMTA23
8813058XMTA24
8913159YMTA25
901325AZMTA26
911335B[MTA27
921345C\MTA28
931355D]MTA29
941365E^MTA30
951375F_UNT
9614060`MSA0,PPE
9714161aMSA1,PPE
9814262bMSA2,PPE
9914363cMSA3,PPE
10014464dMSA4,PPE
10114565eMSA5,PPE
10214666fMSA6,PPE
10314767gMSA7,PPE
10415068hMSA8,PPE
10515169iMSA9,PPE
1061526AjMSA10,PPE
1071536BkMSA11,PPE
1081546ClMSA12,PPE
1091556DmMSA13,PPE
1101566EnMSA14,PPE
1111576FoMSA15,PPE
11216070pMSA16,PPD
11316171qMSA17,PPD
11416272MSA18,PPD
11516373sMSA19,PPD
11616474tMSA20,PPD
11716575uMSA21,PPD
11816676vMSA22,PPD
11916777wMSA23,PPD
12017078xMSA24,PPD
12117179yMSA25,PPD
1221727AzMSA26,PPD
1231737B{MSA27,PPD
1241747C|MSA28,PPD
1251757D}MSA29,PPD
1261767E~MSA30,PPD
1271777FDEL

2023年7月5日

第一个C语言程序

准备程序 VS2023

注意项目命名 注意后缀

如果后缀为CPP 会按照C++语法编译

第一个程序

//c语言代码中一定要有main函数
//主函数

//printf是一个库函数
// 专门用来打印程序

//vs2022快捷键
// ctrl+F5
// FN+ctrl+F5
//std - 标准
// i - input
// o - output

#include <stdio.h>
//main函数为程序的入口
// 只能拥有一个main函数
//标准的主函数写法
int main() //int 为整形类型 括号内void表示无参数可写可不写
{
	printf("hello hehe\n");
	printf("hehe\n");
	return 0; //返回0为整数 
}

//古老的写法 -不推荐
//void main()
//{
//
//}

数据类型

//数据类型
//#include <stdio.h>
//int main()
//{
//	printf("%d\n", 100);
//	printf("%zu\n", sizeof(char)); //1 字节
//	printf("%zu\n", sizeof(short)); //2 字节
//	printf("%zu\n", sizeof(int)); //4 字节
//	printf("%zu\n", sizeof(long)); //4 字节
//	printf("%zu\n", sizeof(long long)); //8 字节
//	printf("%zu\n", sizeof(float)); //4 字节
//	printf("%zu\n", sizeof(double)); //8 字节
//	return 0;
//}
//计算机单位
//bit - 比特位 
//byte - 字节 1byte=8bit
//kb 1024 mb 1024  gb 1024  tb 1024  pb 1024

#include <stdio.h>
int main()
{
	int age = 20;
	double price = 66.6;

	return 0;
}

变量和常量

/ 常量和变量
// 变量分为
// 局部 括号内部
// 全局 括号外部


//#include <stdio.h>

//int b = 20;
//
//int main()
//{
//	short age = 20; // 年龄
//	int high = 180;//身高
//	float weight = 88.5; // 体重
//	int a = 10;
//	return 0;
//}

//全局变量和局部变量可以相同
// 局部变量优先

//int a = 100;
//
//int main()
//{
//	int a = 10;
//	printf("a=%d\n", a);
//	return 0;
//}

// 建议不要将全局变量和局部变量名字一致

// 写一个代码,计算两个整数的和
// scanf 输入函数
// printf 输出函数
// 变量的使用
//int main()
//{
//	int num1 = 0;
//	int num2 = 0;// 初始化
//	// 输入两个整数
//	scanf("%d %d", &num1, &num2);
//	// 求和
//	int sum = num1 + num2;
//	// 输出
//	printf("%d\n", sum);
//	return 0;
//}


//变量的作用域
// 局部变量
//	局部变量所在的范围
// 全局变量
//	在整个工程中都可以使用

//变量的声命周期
// 局部变量
//  进入作用域开始结束作用域结束
// 全局变量
//	整个程序
// 作用域约等于声明周期

int main()
{
	{
		int a = 100;
		printf("a=%d\n", a);
	}
	printf("a=%d\n", a);
	return 0;
}

// int a = 10;

//声明来自外部的值
extern int a;

void test()
{
	printf("test==>%d\n", a);
}
int main()
{
	test();
	{
		
		printf("a=%d\n",a);
	}
	printf("a=%d\n", a);

	return 0;
}

笔记

###笔记 2023/7/5
主程序框架
#inclued <stdio.h>
int main()
{
    return 0;   
}
数据类型有 char float int long (long long) double short (详细看程序)

// 输入变量 scanf
// 输出变量 printf
// 外部引入 extern

练习整理(不运行)

#define  _CRT_SECURE_NO_WARNINGS
//控制台输出 hello word
#include <stdio.h>
int main()
{
	printf("hello word\n");
	return 0;
}
// 全局变量
int a = 100;
int main()
{
	printf("a=%d", a);
	return 0;
}

// 局部变量
int main()
{
	{
		int a = 100;
		printf("a=%d\n", a);
	}
	printf("a=%d\n", a);// 这里不受上面大括号变量影响
	return 0;
}
// 变量的使用
int main()
{
		//初始化
		int num1 = 0;
		int num2 = 0;
		//输入变量
		int sum = scanf("%d %d", &num1, &num2);
		//输出变量
		printf("%d\n", sum)
	return 0;
}
// 外部的值
extern int a;
//全局
void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test()
	{
		printf("a=%d\n",a)
	}
	printf("a=%d\n",a)
	return 0;
}

//数值的命名
int main()
{
	int age = 20;
	short high = 174;
	float weight = 55.5;
	return 0;
}

2023年7月6日

  • // 1.字面常量
  • // 2.const修饰的常变量
  • // 3.define 定义的标识符常量
  • // 4.枚举常量
#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
// 1.字面常量
// 2.const修饰的常变量 
// 3.define 定义的标识符常量
// 4.枚举常量

//int main()
//{
//	//30;
//	//3.14;
//	//'w';// 字符
//	//"abc";// 字符串
//	//const int a = 10; // 在c中是变量但是,const后不能被修改
//	//a = 20;
//	//printf("%d\n", a);
//
//	
//	int arr[10] = { 0 }; // []内不可放赋值后
//
//	return 0;
//}


//#define MAX 100
//#define STR 'abcdef'
//
//int main()
//{
//	//printf("%d\n", MAX);
//	//int a = MAX;
//	//printf("%d\n", a);
//	//printf("%s\n", STR);
//	MAX = 200;
//	return 0;
//}

枚举常量

/ 枚举常量
//enum color
//{
//	RED,
//	GREEN,
//	BLUE
//};
//
//// 性别
//enum Sex
//{
//	// 枚举常量
//	MALE,
//	FEMALE,
//	SECRET
//};
//
//int main()
//{
//	//三原色
//	//  Red Green Blue
//	int num = 10;
//	enum color c = RED;
//	RED = 20; //不可改
//	MALE = 10;// 不可改
//	return 0;
//}

字符串

// 字符串
//#include <string.h>
//int main()
//{
//	//1000 - int
//	// char 字符类型
//	//'a';//字符常量
//	//char ch = 'w';
//	// 字符串
//	//C语言没有字符串类型
//	//"abcdef";// 字符串
//	char arr1[] = "abcdef";//可以存入
//	char arr2[] = {'a','b','c','d','e','f','\0'};// 没有转义字符
//
//	printf("%d\n", strlen(arr1));
//	printf("%d\n", strlen(arr2));
//	//int len = strlen(arr1);//求一个字符串长度的函数 需要头文件string.h
//	//printf("%s\n", arr1);
//	//printf("%s\n", arr2);
//	//printf("%d\n", len);
//
//	return 0;
//}

转义字符

//转义字符
//int main()
//{
//	printf("abc\n"); //换行
//	printf("abc\0df");	// 结束
// printf("%s\n", "(are you ok \?\?)"); //问号
// printf("%c\n", '\''); // 打印单引号
// printf("%c\n","\""); // 打印双引号
// printf("abcd\\0ef"); // 让斜杠不再是转义字符
// printf("\a"); // 警告音
// printf("%c\n", '\130'); //8转10进制 0-7
// printf("%c\n", '\x60'); // 16转10进制
//	return 0;
//}
//#include <string.h>
//int main()
//{
//	//printf("%d\n", strlen("qwer t"));
//	//printf("%d\n", strlen("C:\test\628\test.c"));
//	return 0;
//}

注释

// 注释
//int main()
//{
//	/*int a = 10; c语言的注释风格
//	int a = 20;*/
//	// int a = 10;
//	// 创建指针变量 并赋值为NULL
//	int* p = NULL;
//	return 0;
//}

//int main()
//{
//	// int a = 10; 
//	// C++ 风格
//	return 0;
//}

选择语句

//int main()
//{
//	int input = 0;
//	printf("加入bite\n");
//	printf("要好好学习吗(0/1)\n");
//	scanf("%d", &input);
//	if (input == 1)
//	{
//		printf("好offier\n");
//	}
//	else 
//	{
//		printf("卖红薯\n");
//	}
//	return 0;
//}

循环while语句

//int main()
//{	
//	int line = 0;
//	printf("加入bite\n");
//
//	while (line<20000)
//	{
//		printf("敲代码\n");
//		line++;
//	}
//	if (line >= 20000)
//	{
//		printf("好offer\n");
//	}
//	else
//	{
//		printf("加加油\n");
//	}
//
//	return 0;
//}

函数

// 函数
//add(int x, int y)
//{
//	return (x + y);
//}
//int main()
//{	
//	// 初始化
//	int n1 = 0;
//	int n2 = 0;
//	//输入
//	scanf("%d %d", &n1, &n2);
//	//求和
//	//int sum = n1 + n2;
//	int sum = add(n1,n2);
//	int t1 = 200;
//	int t2 = 300;
//	int r1 = add(t1, t2);
//	//打印
//	printf("%d\n", sum);
//
//
//
//	return 0;
//}

数组

// 数组
int main()
{
	int arr[] = {10,11,12,13,14,15,16,17,18,19};
	/*printf("%d\n", arr[8]);*/
	int i = 0;
	while (i < 10)
	{
		printf("%d\n", arr[i]);
		i++;
	}

	return 0;
}

练习

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//在内变量
int main()
{
	int a = 20; 
	const int n = 15; // 不能被改变
	printf("%d\n", a, n);
	return 0;
}

#define MAX 100
#define STR 'abcdef'
int main()
{
	printf("%d\n", MAX);
	int a = MAX
	printf("%d\n,a");
	return 0;
}

enum color
{
	RED,
	GREEN,
	BLUE
};
int main()
{
	enum color c = RED;	
	return 0;
}

#include<string.h>
int main()
{
	printf("%d\n", strlen(arr1));
	return 0;
}

int main()
{	
	int line = 0;
	printf("加入bite\n");

	while (line<20000)
	{
		printf("敲代码\n");
		line++;
	}
	if (line >= 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("加加油\n");
	}

	return 0;
}

 /*函数*/
add(int x, int y)
{
	return (x + y);
}
int main()
{	
	// 初始化
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	//int sum = n1 + n2;
	int sum = add(n1,n2);
	int t1 = 200;
	int t2 = 300;
	int r1 = add(t1, t2);
	//打印
	printf("%d\n", sum);



	return 0;
}


// 数组
int main()
{
	int arr[] = { 10,11,12,13,14,15,16,17,18,19 };
	/*printf("%d\n", arr[8]);*/
	int i = 0;
	while (i < 10)
	{
		printf("%d\n", arr[i]);
		i++;
	}

	return 0;
}

笔记

###笔记 2023/7/6
变量可以被改变 不想改变可以增加 const
#includ <stdio.h>

int main()
{
    const int a = 10;
    a = 20 ;
    printf("%d\n",a);
}

#define MAX 100 //表示赋常量 如果其他常量赋值于MAX 其则值为MAX 赋值后在程序中不可修改
#define STR 'abcdef' // 可以为字符串 赋值后在程序中不可修改
int mian()
{
    printf("%d\n",MAX)
    int a = MAX
    printf("%d\n",MAX)
    printf("%s\n",STR)
    return 0;
}

// 枚举常量
enum Color 
{
    RED,
    GREEN,
    BLUE
};
int main()
{
    enum color c = RED;
    RED = 10 ;// 不可修改
    GREEN = 20;// 不可修改
}

// 字符串
#include <string.h>
int main()
{
    char ch = 'w';
    char zh = "abjdef";
    char arr1[] = "abcdef" ;
    char arr2[] = {'a','b','c','d','e','f','\0'};
    printf("%d\n",strlen(arr1));
    return 0;
}

//转义字符
 \n换行 \0结束 \?连续书写多个问号使用 \'用于表示字符常量 \"用于表示一个字符串内部的双引号 \\用于表示一个反斜杠 \a警告字符 \b退格符 \f禁止符 \r回车 \t水平制表符 \v垂直制表 \ddd表示1·3个八进制数字如、130X \xdd表示两个十六进制数字 如 \x30 0 

// 注释
// 为C++ 注释风格
/*为C注释风格*/
//推荐为自己的代码注释 梳理思路 对下一个接手的也好 

// 选择语句
int main()
{
	int input = 0;
	printf("加入bite\n");
	printf("要好好学习吗(0/1)\n");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offier\n");
	}
	else 
	{
		printf("卖红薯\n");
	}
	return 0;
}
//循环语句 while
int main()
{	
	int line = 0;
	printf("加入bite\n");

	while (line<20000)
	{
		printf("敲代码\n");
		line++;
	}
	if (line >= 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("加加油\n");
	}

	return 0;
}

//函数
add(int x , int y)
{
    int z = 0;
    z = x + y;
    return 0
}
int main()
{
    int n1 = 0;
    int n2 = 0;
    scanf("%d %d",&n1,&n2);
    int sum = add(n1,n2);
    printf("%d\n",sum);
    return
}

//数组
// int arr[] = {10,11,12,13,14,15,16,17,18,19};
                0   1  2  3  4  5  6  7  8  9

// %s 用来打印字符串
// %d 用来打印数值
// %c 打印字符
// %f 打印float类型数
// %lf 打印double类型数
// %zu 打印sizeof类型
// enum 枚举常量
// 求字符串长度函数需要引用头文件 #include <string.h> 配合 strlen(//所求字符串)

2023年7月7日

练习题

//#include <stdio.h>
//int num = 10;
//
//int main()
//{
//	int num = 1;
//	printf("num = %d", num);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	printf("     **     \n");
//	printf("     **     \n");
//	printf("************\n");
//	printf("************\n");
//	printf("    *  *    \n");
//	printf("    *  *    ");
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	printf("Name    Age    Gender\n");
//	printf("---------------------\n");
//	printf("Jack    18     man");
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	printf("Hello Nowcoder!");
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	float i =0;
//	scanf("%f",&i);
//	printf("%.3f", i);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 40;
//	int c = 212;
//	printf("%d",(-8+22)*a-10+c/2);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char i = 'q';
//	scanf("%c",&i);
//	printf("%c\n", i);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	scanf("%d %d %d", &a, &b, &c);
//	printf("%d\n",b);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char i = '#';
//	scanf("%c", &i);
//	printf("%c",i);
//	printf("%c", i);
//	printf("%c\n", i);
//	printf("%c", i);
//	printf("%c", i);
//	printf("%c\n", i);
//	printf("%c", i);
//	printf("%c", i);
//	printf("%c", i);
//	return 0;
//}
//#include <stdio.h>
//int Max(int x, int y)
//{
//	if (x < y)
//	
//		return y;
//	else
//		return x;
//	
//}
//
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int r = Max(a, b);
//	printf("%d\n", r);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char i;
//	scanf("%c", &i);
//	printf("  %c  \n", i);
//	printf(" %c%c%c\n", i,i,i);
//	printf("%c%c%c%c%c\n", i,i,i,i,i);
//	printf(" %c%c%c\n", i,i,i);
//	printf("  %c  ", i);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int x = 0;
//	int y = 0;
//	scanf("%d",&x);
//	if (x < 0)
//		y = 1;
//	else if (x == 0)
//		y = 0;
//	else
//		y = -1;
//	printf("%d", y);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char i;
//	scanf("%c", &i);
//	printf("%d", i);
//	return 0;
//}

操作符

//#include <stdio.h>
//int main()
//{
//	//int a = 7 / 2;
//	//int b = 7 / 2;//取模
//	// 除号两端都是整数的时候,执行的是整数除法,如果两端有一个浮点数,就执行浮点数除法
//	float a = 7 / 2.00;
//	int b = 7 / 2; // 取模不能浮点函数只能是整数
//	printf("%.2f", a); // .2表示保留两位小数
//	return 0;
//}
#include <stdio.h>
//int main()
//{
//	int a = 0;// 初始化
//	a = 10;// 赋值
//	a = a + 3;// a += 3 加 乘除同意
//	return 0;
//}

单目操作符

//int main()
//{
//	/*int arr[10] = { 0 };
//	printf("%d\n", sizeof(arr));
//	printf("%d\n", sizeof(arr[0]));
//	printf("%d\n", sizeof(arr)/sizeof(arr[0]));*/
//	int a = 10;
//	int b = a++;
//	//int b = a;a=a+1
//	int a = 20;
//	int b = ++a;
//	//a=a+1; b=a a-- --a 同意
//	printf("%d\n", b);
//	printf("%d\n", a);
//	int a = (int)3.14; // 强制转换为整数
//	printf("%d", a);
//	return 0;
//}

// 逻辑操作符
//int main()
//{
//	//&& 逻辑与 - 并且
//	//|| 逻辑或 - 或者
//
//	int a = 0;
//	int b = 20;
//	if (a && b)
//	{
//		printf("hehe\n");
//	}
//	if (a || b)
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}

条件操作符

/int main()
//{
//	int a = 10;
//	int b = 20;
//
//	int r = a > b ? a : b; // a大输出a b大于a输出b exp1? exp2: exe3
//	return 0;
//}

逗号表达式从左向右一次运算,结果为最后一个

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = (c = a - 2, a = b + c, c - 3);
	printf("%d", d);
	return 0;
}

笔记

//具有的数据类型
///1.内置的 char short int long longlong float double 2.自定义的
//局部函数的作用域的
///局部变量所在的局部范围
//局部变量优先 
// 字符串的结束标志 \0
// 数组下表是从0开始

//操作符
// 除号两端都是整数的时候,执行的是整数除法,如果两端有一个浮点数,就执行浮点数除法
// 取模不能浮点函数只能是整数
printf("%.2f", a); // .2表示保留两位小数
//	int a = 0;// 初始化
弹幕操作符
//	a = 10;// 赋值
//	a = a + 3;// a += 3 加 乘除同意
// !逻辑反操作
// - 负值
// + 正值
//  sizeof 操作数的类型长度(以字节为单位)
// & 取地址
// ` 对一个数的二进制按位取反
// -- 前置、后置--
// ++ 前置、后置++
// * 间接访问操作符(解引用操作符)
// (类型) 强制类型转换

逻辑操作符
 && ||
//&& 逻辑与 - 并且
//|| 逻辑或 - 或者

//逗号表达式从左向右一次运算,结果为最后一个
int a = 10;
int b = 20;
int c = 30;
int d = (c = a - 2, a = b + c, c - 3);

// 关键字 C语言本身内置
auto break case char const continue default do double else enum extern float for
goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

练习

突然发现牛客上的练习挺好的,有时间可以去试一试

2023年7月10日

typedef 关键字

//typedef unsigned int unit;
//
//int mian()
//{
//	unsigned int num = 0;
//	unit num2 = 2;    //unsigned = unit
//	return 0;
//}

static

//static
//1.修饰局部变量
//2.修饰全局变量
//3.修饰函数

//void test()
//{
//	static int a = 1;
//	a++;
//	printf("%d ",a);
//}
//
//int main()
//{
//	int i = 0;
//	while (i < 10)
//	{
//		test();
//		i++;
//	}
//	return 0;
//}
//
//extern int g_val;
//
//int main()
//{
//	printf("%d", g_val);
//
//	return 0;
//}

//extern int add(int x, int y);
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = add(a, b);
//	printf("%d", c);
//	return 0;
//}

define 定义常量和宏

//#define num 100;
//int main()
//{
//	printf("%d\n", num);
//	int n = num;
//	printf("%d\n", n);
//	int arr[num] = { 0 };
//	return 0;
//}

//definr 定义宏
//#define add(x,y) ((x)+(y))
//
//
//int main()
//{
//	int a = 90;
//	int b = 20;
//	int c = add(a, b);
//	printf("%d", c);
//	return 0;
//}

指针

//int main()
//{
//	int a = 10;//向内训申请4个字节,存储10
//	&a; // 取地址符
//	int* p = &a;
//	// P就是指针变量
//	char ch = 'w';
//	char* pc = &ch;
//	*p = 20;
//	printf("%d\n", a);
//	return 0;
//}

#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char a;
//	gets(a);
//	int t = 0;
//	t = strlen(a);
//	printf("%d", t);
//
//	return 0;
//}

结构体

//学生
struct Stu
{
	//结构体的成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
void print(struct Stu* ps)
{
	printf("%s,%d,%s,%s\n", (*ps).age, (*ps).name, (*ps).sex);
	//->
	//结构体指针变量->成员名字
	printf("%s,%d,%s,%s\n", ps->name, ps->age, ps->sex, ps->tele);
}
int main()
{
	struct Stu s = {"zhangsan",20,"nan","1559665562"};
	/*printf("%s,%d,%s,%s", s.name, s.age, s.sex, s.tele);*/
	print(&s);
	return 0;
}

笔记


// 关键字 typedef
// 类型重命名 只能针对类型

//关键字 static
// 可以修饰局部变量
// 修饰全局变量
// 修饰函数
// static 修饰局部局部变量不销毁 改变了变量的存储位置 生命周期变为程序周期
// static 修饰全局变量 这个全局变量的外部链接属性变为内部链接属性 其他源文件不能引用该变量
// static 修饰函数 这个函数的外部链接属性也变为内部链接属性 其他源文件不能引用该函数

// define 定义量 宏
#define add(x,y) ((x)+(y)) //宏名 宏体

// 指针
内存划分为一个个内存单元(一个内存单元大小是一个字节)每个内存单元都有编号
内存单元 编号->地址->指针
int a = 10;
int * p = &a;
int* p
*p = 20; 解引用操作符,意思就是通过P中存放点地址,找到P所指对象,*p就是指向的对象
*说明p指针变量 int 说明P指向的对象是int类型 如果a不是int 那么*前也要改
P里面存的是a的内存指针
指针就是用来存放地址的

//结构体
结构体是吧一些单一类型组合在一起
struct Stu
{
	//结构体的成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
void print(struct Stu* ps)
{
	printf("%s,%d,%s,%s\n", (*ps).age, (*ps).name, (*ps).sex);
	//->
	//结构体指针变量
	printf("%s,%d,%s,%s\n", ps->name, ps->age, ps->sex, ps->tele);
}
int main()
{
	struct Stu s = {"zhangsan",20,"nan","1559665562"};
	/*printf("%s,%d,%s,%s", s.name, s.age, s.sex, s.tele);*/
	print(&s);
	return 0;
}

2023年7月11日

if and While语句

//int main()
//{
	////判断真假
	//int a = 3;
	//if (a ==5 )
	//	printf("hehe\n");
	////单分支
	//int age = 10;
	//if (age > 18)
	//	printf("chengnian");
	////双分支
	//int age = 10;
	//if (age < 18)
	//{
	//	printf("未成年\n");
	//	printf("不能饮酒\n");
	//}		
	//else
	//	printf("成年\n");
	////多分支
	//int age = 0;
	//scanf("%d", &age);
	//if (age < 18)
	//	printf("青少年");
	//else if (age >= 18 && age < 28)
	//	printf("青年");
	//else if (age >= 29 && age < 40)
	//	printf("中年");
	//else if (age >= 40 && age < 60)
	//	printf("壮年");
	//else if (age >= 60 && age < 100)
	//	printf("老年");
	//else
	//	printf("老寿星");
	//return 0;
//}


//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//	{
//		if (b == 2)
//			printf("hehe\n");
//		else
//			printf("haha\n");
//	}
//
//	return 0;
//}

//1.变量的命名(有意义)
//2.空格 换行
//int main()
//{
//	char first_name[20] = { 0 };
//
//	int a = 10;
//
//
//	return 0;
//}

//int test()
//{
//	int a = 3;
//	if (a == 3)
//		return y;
//	else
//	return 0;
//}
//
//int main()
//{
//	int r = test();
//	printf("%d", r);
//	return 0;
//}


//int main()
//{
//	//int num = 3;
//	//if (5 == num)// if (num == 5)
//	//	printf("hehe\n");
//	//if (5 == num)
//	//{
//	//	printf("hehe\n");
//	//}
//
//
//	return 0;
//}

//判断一个数是否为奇数
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	//判断
//	if (num % 2 == 1)
//		printf("这是个奇数\n");
//	else
//		printf("不是奇数\n");
//	return 0;
//}

//输出1-100的奇数
//int main()
//{
//	int num = 1;
//	while (num <101)
//	{
//		if (num % 2 == 1)
//			printf("%d  ", num);
//		num++;
//	}
//	return 0;
//}

//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
	/*if (1 == day);
	{
		printf("星期一");
	}
	if (2 == day);
	{
		printf("星期二");
	}	if (3 == day);
	{
		printf("星期三");
	}	if (4 == day);
	{
		printf("星期四");
	}
	if (5 == day);
	{
		printf("星期五");
	}
	if (6 == day);
	{
		printf("星期六");
	}
	if (7 == day);
	{
		printf("星期日");
	}*/

	//switch (day)
	//{
	//case 1:
	//	printf("星期一");
	//	break;
	//case 2:
	//	printf("星期二");
	//	break;
	//case 3:
	//	printf("星期三");
	//	break;
	//case 4:
	//	printf("星期四");
	//	break;
	//case 5:
	//	printf("星期五");
	//	break;
	//case 6:
	//	printf("星期六");
	//	break;
	//case 7:
	//	printf("星期日");
	//	break;
	//}

//	switch (day)
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5:
//		printf("weekady");
//		break;
//	case 6:
//	case 7:
//		printf("weekend");
//		break;
//	default:
//		printf("选择错误");
//		break;
//	}
//
//	return 0;
//}



//int main()
//{
//	int n = 1;
//	int m = 2;
//	switch (n)
//	{
//	case 1: n++;
//	case 2: m++;
//	case 3: 
//		switch (n)
//		{
//		case 1: n++;
//		case 2: m++; n++;
//			break;
//		}
//	case 4:
//		m++;
//		break;
//	default:
//		break;
//	}
//	printf("m = %d n = %d", m, n);
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	while (i<=10) 
//	{
//		i++;
//		if(5==i)
//			continue;
//		printf("%d", i);
//	}
//
//	return 0;
//}

//int main()
//{
//	/*int ch = 0;*/
//	//while(getchar())
//	//int ch = getchar();
//	//printf("%c", ch);
//	//putchar(ch);
//	//int ch = 0;
//	//while ((ch = getchar()) != EOF)
//	//{
//	//	putchar(ch);
//	//}
//	char password[20] = { 0 };
//	printf("请输入密码:");
//	scanf("%d", password);
//
//	//getchar();//读取
//	int ch = 0;
//	while ((ch = getchar()) != '\n')
//	{
//		;
//	}
//	printf("确认密码(Y/N)");
//	int ret = getchar();
//	if ('Y' == ret)
//	{
//		printf("Yes");
//	}
//	else
//	{
//		printf("No");
//	}
//	return 0;
//}

//int main()
//{
//	char ch = '\0';
//	while ((ch = getchar()) != EOF)
//	{
//		if (ch < '0' || ch > '9')
//			continue;
//		putchar(ch);
//	}
//	return 0;
//}

笔记

// if语句
if 语句不加;
if 语句后多语句许要添加{}套入
判断真假 单分支 双分支 多分支
else 寻找距离自己最近的if
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");


	return 0;
}


//1.变量的命名(有意义)
//2.空格 换行

// switch 语句
case 必须整形常量表达式
swutch 可以嵌套

// while循环
continue 会跳过本次循环代码但不结束许嵌套在if语句
break 结束本次循环直接跳出
getchar获取缓存区的字符
putchar打印读取的字符

2023年7月12

牛客网练习

//#include <stdio.h>
//int main()
//{
//	int ch = 0;
//	while ((ch = getchar())!=EOF)
//	{
//		printf("%c\n", ch+32);
//		getchar();
//
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	printf("%15d", 0xABCDEF);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	printf("%#o %#X", 1234, 1234);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	char a = '0';
//	int  b = 0;
//	float c = 0.0;
//	scanf("%c\n%d\n%f", &a, &b, &c);
//	printf("%c %d %6f", a, b, c);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a;
//	int b;
//	int c;
//	scanf("%d %d %d",&a,&b,&c);
//	printf("%d%8d%8d", a, b, c);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	float a = 0.0;
//	scanf("%f", &a);
//	printf("%d", (int)a%10);
//	return 0;
//}

for 循环

/ 1-10
#include<stdio.h>
//int main()
//{
//	int a = 0;
//	for (a = 1; a <= 10; a++)
//		printf("%d ", a);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	for (i = 0; i <= 9; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}
 

do while 循环

//int main()
//{
//	int i = 1;
//	do
//	{
//		
//		if (5 == i)
//			continue;
//		printf("%d", i);
//		i++;
//	}
//		while (i <= 10);
//
//	return 0;
//}

计算n的阶乘

//int main()
//{
//	int i = 1;
//	int n = 0;
//	int ret = 1;
//	scanf("%d", &n);
//	for (i = 1; i <= n; i++)
//	{
//		ret = ret * i;
//	}
//	printf("%d", ret);
//	return 0;
//}

计算1!+2!+3!……

//int main()
//{
//	int i = 1;
//	int n = 0;
//	int ret = 1;
//	int num = 0;
//	/*for (n = 1; n <= 10; n++)
//	{
//		ret = 1;
//		for (i = 1; i <= n; i++)
//		{
//			ret = ret * i;			
//		}
//		num = ret + num;
//	}*/
//	for (n = 1; n <= 10; n++)
//	{
//		ret = ret * n;
//		num = num + ret;
//	}
//	printf("%d", num);
//	return 0;
//}

查找数据

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	scanf("%d", &k);
//	for (i = 0; i < sz; i++)
//	{
//		if (arr[i] == k)
//			printf("找到了下表是%d", i);
//		break;
//	}
//	if (i = sz)
//	{
//		printf("找不到");
//	}
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	int left = 0;
//	int right = sz - 1;
//	while (left<=right)
//	{
//
//	
//		int mid = (left + right) / 2;
//		for (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了下表是%d", mid);
//			break;
//		}
//		if (left > right)
//		{
//			printf("找不到了");
//
//		}
//	}
//	return 0;
//}

笔记

###2023/7/12日笔记 P31
for 语句 
for (表达式1;表达式2;表达式3)
{
	printf("%d",i)
	printf("hehe")	
}
break 跳出循环
continue 跳过本次循环

do while 循环
break 跳出循环
continue 跳过本次循环
循环最多的为for while dowhile

2023年7月13日

做题练习

#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,6,7,8,9,10 };
//	int k = 7;
//	scanf("%d", &k);
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了,下表是%d",mid);
//			break;
//		}
//	}
//	if (left > right)
//	{
//		printf("找不到");
//	}
// 	return 0;
//}
//#include<Windows.h>
//int main()
//{
//	char arr1[] =  "Welcome to bit!!!!" ;
//	char arr2[] =  "##################" ;
//	int left = 0;
//	int right = sizeof(arr1)-1;//int right = sizeif(arr1)/sizeif(arr1[0])-2;
//	while (left <= right )
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);
//		// 清空屏幕
//		system("cls");//库函数,可以执行系统命令
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);
//	return 0;
//}
//int main()
//{
//	int i = 0;
//	char password[20] = { 0 };
//	for (i = 0;i<3;i++)
//	{ 
//		printf("请输入密码");
//		scanf("%s", password);
//		if (strcmp(password,"abcdef") ==0)// 比较两个字符串是否相等不能使用 == 而是使用库函数 strcmp 如果返回值为0表示两个字符串相等
//		{
//			printf("密码正确\n");
//			break;
//		}
//		else
//		{
//			printf("密码错误");
//		}
//	}
//	if (i == 3)
//	{
//		printf("密码错误超过三次");
//	}
//	return 0;
//}

笔记

Sleep(1000); 延迟一千毫秒
system("cls"); cmd系统命令执行 库函数,可以执行系统命令
比较两个字符串是否相等不能使用 == 而是使用库函数 strcmp
rand();//生成随机数
srand((unsigned int)time(NULL));//时间戳生成随机数

//goto 语句
//关机程序
//电脑运行起来后一分钟关机 开始shutdown -s -t  60  取消shutdown -a
//如果输入 取消关机 ,则取消
#include<Windows.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("注意你的电脑将在60s内关机输入取消关机取消");
	scanf("%s", &input);
	if (strcmp(input, "取消关机") == 0)
	{
		system("shutdown -a");
		printf("取消关机了");
	}
	else
	{
		goto again;
	}
	return 0;
}

2023年7月14日

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//get_max(int x, int y)
//{
//	return (x > y ? x: y);
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d,%d", &a, &b);
//	int m = get_max(a, b);
//	printf("%d\n", m);
//	return 0;
//}

函数交换

// 交换
//void Swap1(int x, int y)
//{
//	int z = 0;
//	z = x;
//	x = y;
//	y = z;
//}
// 
//void Swap2(int *px ,int *py)
//{
//	int z = 0; 
//	z = *px; // z =a 
//	*px = *py;// a = b 
//	*py = z; // b = a
//
//}
//
//Add(int x, int y)
//{
//	int z = 0;
//	z = x + y;
//	return z;
//}
////当实参传递给形参的时候,形参是实参的一份临时拷贝 
////对形参的修改不能改变实参
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//
//	//int c = Add(a+3, b);
//	printf("%d\n", c);
//
//	printf("交换前a=%d b=%d\n", a, b);
//	Swap1(a, b);
//	Swap2(&a, &b);
//	printf("交换后a=%d b=%d\n", a,b);
//	return 0;
//}

写一个函数判断一个数是不是素数

// 写一个函数判断一个数是不是素数
//素数只能被1和被他本身所除的数

//#include<math.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 101; i < 200; i++)
//	{
//		//判断i是否为素数
//		//是素数就打印
//		//拿2到i-1之间的数字去试除i
//		int flag = 1;//是1表示是素数
//		int j = 0;
//		for (j = 2; j <= i - 1; j++)
//		{
//			if (i % j == 0)
//			{
//				flag = 0;
//				break;
//			}
//		}
//			if (flag == 1)
//			{
//				count++;
//				printf("%d ", i);
//			}
//		
//	}	
//	printf("\n总数为%d", count);
//	return 0;
//}


//#include<math.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 101; i < 200; i += 2)
//	{
//		//判断i是否为素数
//		//是素数就打印
//		//拿2到i-1之间的数字去试除i
//		int flag = 1;//是1表示是素数
//		int j = 0;
//		for (j = 2; j <= sqrt(i) - 1; j++)
//		{
//			if (i % j == 0)
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			count++;
//			printf("%d ", i);
//		}
//
//	}
//	printf("\n总数为%d", count);
//	return 0;
//}


//是素数返回1
//不是返回0
#include <math.h>
int is_prime(int n)
{
		int j = 0;
		for (j = 2; j <= sqrt(n) - 1; j++)
		{
			if (n % j == 0)
			{
				return 0;
			}
		}
		return 1;
}

#include<math.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i < 200; i += 2)
	{
		//判断i是否为素数
		//是素数就打印
		//拿2到i-1之间的数字去试除i
		if (is_prime(i))
		{
			printf("%d ", i);
			count++;
		}

	}
	printf("\n总数为%d", count);
	return 0;
}

笔记

sqrt 开平方 头文件#include<math.h>

//函数的定义
void Swap2(int *px ,int *py)
{
	int z = 0;
	z = *px;
	*px = *py;
	*py = z;
}
//当实参传递给形参的时候,形参是实参的一份临时拷贝 
//对形参的修改不能改变实参

2023年7月17日

打印1000~2000年的闰年

#include <stdio.h>
int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		//判断year是不是闰年
		if (year % 4 == 0)
		{
			if (year % 100 != 0)
			{
			printf("%d ", year);
			}
		}
		if (year % 400 == 0)
		{
			printf("%d ", year);
		}
	}
	return 0;
}

优化后

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			printf("%d ", year);
		}
	}
	return 0;
}

使用函数定义后

int is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return 1;
	else
		return 0;
}

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (is_leap_year(year))
		{
			printf("%d ", year);
		}
	}
	return 0;
}

写一个函数 实现一个整形有序数组的二分查找

int binary_search(int arr[], int k, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int mid = left + (right = left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k);
		{
			right = mid - 1;
		}
		else
		{
			return mid;//找到了返回
		}
	}
	return -1;//找不到返回
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//找到了返回下标
	//找不到返回找不到
	int ret =binary_search(arr, k,sz);
	if (ret == -1)
	{
		printf("找不到");
	}
	else
	{
		printf("找到了,下标是%d\n", ret);
	}
	return 0;
}

布尔类型

bool is_prime(int n)
{
	int j = 0;
	for (j = 2; j<= sqrt(n); j++)
	{
		if (n$j == 0)
		{
			return false;
		}
	}
	return true;
}

int main()
{
	//int i = 0;
	//for (i = 100; i < 200; i++)
	//{
	//	if (is_prime(i))
	//	{
	//		printf("%d ", i);
	//	}
	//}

	printf("%d\n", sizeof(bool));
	return 0;
}

写一个函数每调用一次 就将会num函数加1

//void Add(int *p)
//{
//	(*p)++;
//}
//int main()
//{
//	int num = 0;
//	Add(&num);
//	printf("%d ", num);//1
//	Add(&num);
//	printf("%d ", num);//2
//	Add(&num);
//	printf("%d ", num);//3
//	return 0;
//}

//int Add(int n)
//{
//	return ++n;
//}
//int main()
//{
//	int num = 0;
//	num = Add(num);
//	printf("%d ", num);//1
//	num = Add(num);
//	printf("%d ", num);//2
//	num = Add(num);
//	printf("%d ", num);//3
//	return 0;
//}

函数嵌套

void new_line()
{
	printf("hehe\n");
}

void there_line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		new_line();
	}
}

int mian()
{
	there_line();
	return 0;
}

链式访问

void test()
{
	printf("hehe\n")
}

int main()
{
	//int len = strlen("abcdef");
	//printf("%d\n", len);
	////链式访问
	//printf("%d\n", strlen("abcdef"));

	/*printf("%d", printf("%d", printf("%d", 43)));*/
	int n = test;
	return 0;
}

函数不写返回值 默认是int

Add(int x ,int y)//不推荐
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d", c);
	return 0;
}

不推荐写法

Add(int x ,int y)//不推荐
{
	printf("hehe\n");
}
//上面的代码在一些编译器上返回的事函数中执行过程中最后一条指令的结果

int main()
{
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d", c);
	return 0;
}

明确说明 main函数不需要参数

int main(void)
{
	return 0;
}

main函数有三个参数

int main(int argc, char* argv[], char* envp)
{
	return 0;
}

笔记

函数练习
//润年1 非0
int is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return 1;
	else
		return 0;
}

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (is_leap_year(year))
		{
			printf("%d ", year);
		}
	}
	return 0;
}

/写一个函数 实现一个整形有序数组的二分查找
//int binary_search(int arr[], int k, int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//	while (left < right)
//	{
//		int mid = left + (right = left) / 2;
//		if (arr[mid] < k)
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k);
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			return mid;//找到了返回
//		}
//	}
//	return -1;//找不到返回
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 7;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//找到了返回下标
//	//找不到返回找不到
//	int ret =binary_search(arr, k,sz);
//	if (ret == -1)
//	{
//		printf("找不到");
//	}
//	else
//	{
//		printf("找到了,下标是%d\n", ret);
//	}
//	return 0;
//}

布尔类型 理想情况 表示真假使用

//函数嵌套 但是不能嵌套定义
void new_line()
{
	printf("hehe\n");
}

void there_line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		new_line();
	}
}

int mian()
{
	there_line();
	return 0;
}

//链式访问

int main()
{
	//int len = strlen("abcdef");
	//printf("%d\n", len);
	////链式访问
	//printf("%d\n", strlen("abcdef"));

	printf("%d", printf("%d", printf("%d", 43))); 打印为4321
	Each of these functions returns the number of characters printed, or a negative value if an error occurs.
	每次返回这个函数的数字值 43 为2数字 返回2 打印2位一数字 返回1 打印1

	return 0;
}

2023年7月18日(摸鱼一天)

函数声明和定义

可以分为两个文件一个源文件一个头文件

头文件命名如 Add.h 源文件命名如Add.c

使用需要在Add.c文件中包含头文件 #include“add.h” 可在另一个源文件test.c中运行

Add.h

#define  _CRT_SECURE_NO_WARNINGS


//函数的声明定义
int Add(int x, int y);

Add.c

#define  _CRT_SECURE_NO_WARNINGS

//函数的定义
int Add(int x, int y)
{
	return x + y;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

#include"add.h"

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//加法
	int sum = Add(a, b);
	printf("%d", sum);
	return 0;
}
图片[1]-C语言学习笔记 从零开始 - 随思南游 - Peace - 生活可期,万物可爱-随思南游 - Peace - 生活可期,万物可爱

笔记

函数声明:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么.但是具体是不是存在,函数
声明决定不了.
2.函数的声明一般出现在函数的使用之前.要满足<b>先声明后使用</b>
3.函数的声明一般要放在头文件中的

需要包含头文件 如add.h

静态库导入 #pragma comment(lib,"add.lib")

2023年7月19日(摸鱼二天)

函数递归

#include<stdio.h>
//函数递归

//接收一个整形值 按照顺序打印他的第一位
//%d 打印有符号的数(有正负数)
//%u 打印无符号的整数
//int main()
//{
//	unsigned int num = 0;
//	scanf("%u", &num);
//	while (num)
//	{
//		printf("%d", num % 10);
//		num = num / 10;
//	}
//	return 0;
//}

//void print(unsigned int n)
//{
//	if (n > 9)
//	{
//		print(n / 10);
//	}
//	printf("%d ", n % 10);
//}
//
//int main()
//{
//	unsigned int num = 0;
//	scanf("%u", &num);
//	print(num);
//	return 0;
//}

函数递归习题

编写函数不允许创建临时变量 求字符串长度

//int my_strlen(char * str)
//{
// int count = 0;
// while (*str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}
//
//int main()
//{
// char arr[] = "abc";
// int len = my_strlen(arr);
// printf("%d\n", len);
// return 0;
//}

//int my_strlen(char * str)
//{
// if (*str != '\0')
// return 1 + my_strlen(str + 1);
// else
// return 0;
//}
//
//int main()
//{
// char arr[] = "abc";
// int len = my_strlen(arr);
// printf("%d", len);
// return 0;
//}

//int fac(int n)
//{
// if (n < 1)
// return 1;
// else
// return n * fac(n - 1);
//
//}

//int fac(int n)
//{
// int i = 0;
// int ret = 1;
// for (i = 1; i <= n; i++)
// {
// ret* n;
// }
// return ret;
//}
//
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int ret = fac(n);
// printf("%d", fac);
// return 0;
//}

求第n个斐波纳楔数

// 1 1 2 3 5 8 13 21 34
//int count = 0;
//int Fib(int n)
//{
//	if (n == 3)
//		count++;
//
//	if (n <= 2)
//		return 1;
//	else
//		return Fib(n - 1) + Fib(n - 2);
//}


//int Fib(int n)
//{
//	int a = 1;
//	int b = 1;
//	int c = 0;
//
//	while ( n >= 3)
//	{
//		c = a + b;
//		a = b;
//		b = c;
//		n--;
//	}
//
//	return c;
//}
//
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = Fib(n);
//	printf("%d ", ret);
//
//	printf("%d ", count);
//	return 0;
//}

递归会炸

//void test(int n )
//{
//	if (n > 10000)
//		test(n + 1);
//}
//int main()
//{
//	test(1);
//	return 0;
//}

笔记

//%d 打印有符号的数(有正负数)
//%u 打印无符号的整数

存在限制条件 档案不至于这个限制条件的时候,递归便不再进行

2023年7月20日

练习

//int main()
//{
//	int i = 0;
//	for (i == 0; i < 10; i++)
//	{
//		if (i = 5)//这里是赋值,不是判断 i=5表达式的结果是5
//			printf("%d", i);
//	}
//	return 0;
//}


//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	switch (n)
//	{
//		default:
//			printf("hehe\n");
//			break;
//		case 1:
//			printf("1\n");
//			break;
//		case 2:
//			printf("2\n");
//			break;
//	}
//	return 0;
//}





//// B = 0
//int func(int a)
//{
//	int b;
//	switch (a)
//	{
//	case 1:b = 30;
//	case 2:b = 20;
//	case 3:b = 10;
//	default:b = 0;
//	}
//	return 0;
//}

大小顺序输出

//void Swap(int* py, int* px)
//{
//	int tmp = *py;
//	*py = *px;
//	tmp = *px;
//}
//
//
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	scanf("%d %d %d", &a, &b, &c);
//	int tmp = 0;
//	if (a < b)
//	{
//		Swap(&a, &b);
//	}
//	if (a < c)
//	{
//		Swap(&a, &c);
//	}
//	if (b < c)
//	{
//		Swap(&b, &c);
//	}
//	return 0;
//}

打印1-100之间的三的倍数

//int main()
//{
//	//int i = 0;
//	//for (i == 0; i < 100; i++)
//	//{
//	//	if (i % 3 == 0)
//	//	{
//	//		printf("%d ", i);
//	//	}
//	//}
//	int i = 0;
//	for (i = 3; i <= 100; i += 3)
//	{
//		printf("%d ", i);
//	}
//	return 0;
//}

给两个数 求这两个最大的公约数

//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	scanf("%d %d ", &a, &b);//24 18
//	//求最大公约数
//	while (c=a%b)
//	{
//		a = b;
//		b = c;
//	}
//	printf("%d\n", b);
//	return 0;
//}

编写程序数一下1 到100 的所有整数中出现多少个9

//int main()
//{
//	int a = 0, b = 0;
//	for (a = 1; b = 1; a <= 100; a++)
//	{
//		if (b >= 20)break;
//		if (b % 3 == 1)
//		{
//			b = b + 3;
//			continue;
//		}
//		b = b - 5;
//	}
//	return 0;
//}

计算1/1-1/2+1/3-1/4+1/5-1/99-1/100的值,打印出结果

求10个整数中最大值

////分子总是1
////分母是1~100
//
//int main()
//{
//	int i = 0;
//	double sum = 0;
//	int flag = 1;
//	for (i = 1; i <= 100; i++)
//	{
//		sum = sum + flag*(1 / i);
//		flag = -flag;
//	}
//	printf("%lf", sum);
//	return 0;
//}

在屏幕上输出9 * 9乘法口诀表

//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		//打印一行
//		int j = 0;
//		for(j = 1; j<= i ;j++)
//		{
//			printf("%d*%d=%2d ", i,j,i*j);
//		}
//		printf("\n");
//	}
//	return 0;
//}

猜数字

//int main()
//{
//	int a = 0;
//	int i = 0;
//	printf("输入1开始数字游戏\n");
//	scanf("%d", &i);
//	srand((unsigned int)time(NULL));
//	int ret = rand()%100;
//	while (i = 1)
//	{
//		printf("猜数字 0-100之间\n");
//		scanf("%d", &a);
//		if (ret > a)
//		{
//			printf("猜小了\n");
//		}
//		else if (ret < a)
//		{
//			printf("猜大了\n");
//		}
//		else
//		{
//			printf("猜对了\n");
//			break;
//		}
//	}
//	return 0;
//}

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

//void print_table(int n)
//{
//	int i = 0;
//	for (i = 1; i <= n; i++)
//	{
//		//打印一行
//		int j = 0;
//		for (j = 1; j <= i; j++)
//		{
//			printf("%d*%d=%2d ", i, j, i * j);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	print_table(n);
//	return 0;
//}

闰年判断

//int main()
//{
//	int year = 0;
//	for (year = 1000; year <= 2000; year++)
//	{
//		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//		{
//			printf("%d ", year);
//		}
//	}
//	return 0;
//}

数组

//数组
//int main()
//{
//	int arr[10];
//	char ch[5];
//	double data1[20];
//	double data2[15 + 5];
//
//	//下面代码只能在支持C99标准下编译
//	int n = 10;
//	scanf("%d", &n);
//	int arr2[n];
//	//在c99标准之前数组的大小必须是常量或常量表达式
//	//在c99之后数组大小可以是变量,为了支持边长数组
//	return 0;
//}

//数组初始化
//int main()
//{
//	//不完全初始化 剩余元素默认为0
//	int arr[10] = { 1,2,3 };
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[] = { 1,3,2 };
//
//	char ch1[10] = { 'a','b','c' };
//	char ch2[10] = "abc";
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	int sz = sizeof(arr)/sizeof(arr[0]);
//	//for (i = 0; i < sz; i++)
//	//{
//	//	printf("%d", arr[i]);
//	//}
//	//for (i = sz-1; i >= 1; i--)
//	//{
//	//	printf("%d", arr[i]);
//	//}
//	//打印数组每个元素的地址
//	for (i = 0; i < sz; i++)
//	{
//		printf("&arr[%d] = %p\n", i, &arr[i]);
//	}
//	return 0;
//}

笔记

数组 是一种相同类型的集合
type_t   arr_name [const_n]
元素类型          常量表达式 指定大小
//在c99标准之前数组的大小必须是常量或常量表达式
//在c99之后数组大小可以是变量,为了支持边长数组

2023年7月24日

数组名

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//int main()
//{
//	int arr[20] = {0};
//	printf("%p\n", arr);//arr就是首元素的地址
//	printf("%p\n", arr+1);
//	printf("----------------------\n");
//	printf("%p\n", &arr[0]);//首元素地址
//	printf("%p\n", &arr[0]+1);
//	printf("----------------------\n");
//	printf("%p\n", &arr);//数组的地址
//	printf("%p\n", &arr+1);
//
//	//int n = sizeof(arr);
//	//printf("%d\n", n);
//
//	return 0;
//}


//二维数组的数组名理解
int main()
{
	int arr[3][4] = { 0 };

	printf("%d\n",sizeof(arr) / sizeof(arr[0]));
	printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));

	//int sz = sizeof(arr);
	//printf("%d\n", sz);


	//printf("%p", arr);//二维数组的数组名也表示数组首元素地址
	//printf("%p", arr + 1);

	return 0;
}

笔记

//数组名确实能表示首元素的地址

//但是有2个例外:

//1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

//2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

2023年7月25日(三子棋)

笔记

利用数组实现三子棋

test.c测试游戏的逻辑
game.c游戏代码的实现
game.h游戏代码的声明

test.c

#define  _CRT_SECURE_NO_WARNINGS

#include"game.h"

void menu()
{
	printf("*******************************\n");
	printf("***********1.play**************\n");
	printf("***********0.exlt**************\n");
	printf("*******************************\n");

}

void game()
{
	char ret = 0;
	char board[ROW][COL] = { 0 };
	//初始化棋盘的函数
	InitBoard(board,ROW,COL);
	DispalyBoard(board, ROW, COL);
	//开始下棋
	while (1)
	{
		PalyerMove(board,ROW,COL);
		//判断输赢
		ret = WinningBoard(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		DispalyBoard(board, ROW, COL);
		ComputerMove(board,ROW,COL);
		//判断输赢
		ret = WinningBoard(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		DispalyBoard(board, ROW, COL);
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
	DispalyBoard(board, ROW, COL);
}



int main()
{
	srand((unsigned int )time(NULL));//设置随机数的生成
	int input = 0;
	do
	{
		menu();//打印菜单
		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盘
void DispalyBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void PalyerMove(char board[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char WinningBoard(char board[ROW][COL], int row, int col);

game.c

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}



////第一个版本
//void DispalyBoard(char board[ROW][COL], int row, int col)
//{
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		//打印数据
//		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
//		//打印分割线
//		if(i<row-1)
//		printf("---|---|---\n");
//	}
//}



//第二个版本
void DispalyBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印数据
		/*printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);*/
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//打印分割线
		/*printf("---|---|---\n");*/
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
			
		}
	}
}




void PalyerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");

	while (1)
	{
		printf("坐标行范围%d,坐标列范围%d,注意XY数值之间添加一个空格\n", ROW, COL);
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		//坐标范围合法判断
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用请选择其他位置\n");
			}
		}
		else
		{
			printf("坐标输入非法请重新输入\n");
		}
	}

}


void ComputerMove(char board[ROW][COL], int row, int col)
//{
//	printf("电脑下棋\n");
//
//	int x = 0;
//	int y = 0;
//
//
//	while (1)
//	{
//		x = rand() % row;
//		y = rand() % col;
//		if (board[x][y] == ' ')
//		{
//			board[x][y] = '#';
//			break;
//		}
//	}
//}
{
	int x = 0;
	int y = 0;
	int z = 0;
	printf("电脑下棋:\n\n");
	z = check_computer(board, row, col);//电脑下棋(能赢就赢,玩家要赢就拦截玩家)

	//第一次落子
	while (0 == z)
	{
		x = rand() %row;
		y = rand() %col;
		if (board[1][1] == ' ')
		{
			//如果中心位置玩家没有下则优先下到中心位置
			board[1][1] = '#';
			z = 1;
			break;
		}
		if (board[x][y] == ' ')
		{
			//没有的话就随机下一个位置
			board[x][y] = '#';
			z = 1;
			break;
		}
	}
}
char judge_player(char board[ROW][COL], int row, int col, int k)//电脑优化算法,堵截玩家 
{
	int i = 0;
	int j = 0;
	while (0 == k)
	{
		for (i = 0; i < row; i++)  //判断玩家在横行上是否会赢,
		{
			if ((board[i][0] == board[i][1])
				&& (board[i][1] == '*')
				&& (board[i][2] == ' '))
			{
				board[i][2] = '#';
				k = 1;
				break;
			}

			if ((board[i][0] == board[i][2])
				&& (board[i][0] == '*')
				&& (board[i][1] == ' '))
			{
				board[i][1] = '#';
				k = 1;
				break;
			}

			if ((board[i][1] == board[i][2])
				&& (board[i][1] == '*')
				&& (board[i][0] == ' '))
			{
				board[i][0] = '#';
				k = 1;
				break;
			}
		}
		if (k != 0)
			break;

		for (j = 0; j < col; j++)  //判断玩家在竖列上是否会赢
		{
			if ((board[0][j] == board[1][j])
				&& (board[1][j] == '*')
				&& (board[2][j] == ' '))
			{
				board[2][j] = '#';
				k = 1;
				break;
			}

			if ((board[0][j] == board[2][j])
				&& (board[2][j] == '*')
				&& (board[1][j] == ' '))
			{
				board[1][j] = '#';
				k = 1;
				break;
			}

			if ((board[1][j] == board[2][j])
				&& (board[2][j] == '*')
				&& (board[0][j] == ' '))
			{
				board[0][j] = '#';
				k = 1;
				break;
			}
		}
		break;
	}

	while (0 == k)  //判断玩家在对角线上是否会赢
	{
		if ((board[0][0] == board[1][1])
			&& (board[1][1] == '*')
			&& (board[2][2] == ' '))
		{
			board[2][2] = '#';
			k = 1;
			break;
		}

		if ((board[0][0] == board[2][2])
			&& (board[2][2] == '*')
			&& (board[1][1] == ' '))
		{
			board[1][1] = '#';
			k = 1;
			break;
		}

		if ((board[1][1] == board[2][2])
			&& (board[1][1] == '*')
			&& (board[0][0] == ' '))
		{
			board[0][0] = '#';
			k = 1;
			break;
		}

		if ((board[0][2] == board[1][1])
			&& (board[0][2] == '*')
			&& (board[2][0] == ' '))
		{
			board[2][0] = '#';
			k = 1;
			break;
		}

		if ((board[0][2] == board[2][0])
			&& (board[2][0] == '*')
			&& (board[1][1] == ' '))
		{
			board[1][1] = '#';
			k = 1;
			break;
		}

		if ((board[1][1] == board[2][0])
			&& (board[2][0] == '*')
			&& (board[0][2] == ' '))
		{
			board[0][2] = '#';
			k = 1;
			break;
		}
		break;
	}
	return k;
}
int check_computer(char board[ROW][COL], int row, int col) //电脑判断自己是否会赢
{
	int i = 0;
	int j = 0;
	int k = 0;
	//判断电脑自己在横行、纵行、对角线上是否能赢(3颗棋子能否连成一条线),能赢就落子
	while (0 == k)
	{
		for (i = 0; i < row; i++)//判断电脑横行上是否会赢
		{
			if ((board[i][0] == board[i][1])
				&& (board[i][1] == '#')
				&& (board[i][2] == ' '))
			{
				board[i][2] = '#';
				k = 1;
				break;
			}
			if ((board[i][0] == board[i][2])
				&& (board[i][0] == '#')
				&& (board[i][1] == ' '))
			{
				board[i][1] = '#';
				k = 1;
				break;
			}

			if ((board[i][1] == board[i][2])
				&& (board[i][1] == '#')
				&& (board[i][0] == ' '))
			{
				board[i][0] = '#';
				k = 1;
				break;
			}
		}
		if (k != 0)
		{
			break;
		}
		for (j = 0; j < col; j++)//判断电脑列上是否会赢
		{
			if ((board[0][j] == board[1][j])
				&& (board[1][j] == '#')
				&& (board[2][j] == ' '))
			{
				board[2][j] = '#';
				k = 1;
				break;
			}

			if ((board[0][j] == board[2][j])
				&& (board[2][j] == '#')
				&& (board[1][j] == ' '))
			{
				board[1][j] = '#';
				k = 1;
				break;
			}
			if ((board[1][j] == board[2][j])
				&& (board[2][j] == '#')
				&& (board[0][j] == ' '))
			{
				board[0][j] = '#';
				k = 1;
				break;
			}
		}

		break;

	}

	while (0 == k)
	{
		if ((board[0][0] == board[1][1])//判断对角线上是否会赢
			&& (board[1][1] == '#')
			&& (board[2][2] == ' '))
		{
			board[2][2] = '#';
			k = 1;
			break;
		}
		if ((board[0][0] == board[2][2])
			&& (board[2][2] == '#')
			&& (board[1][1] == ' '))
		{
			board[1][1] = '#';
			k = 1;
			break;
		}

		if ((board[1][1] == board[2][2])
			&& (board[1][1] == '#')
			&& (board[0][0] == ' '))
		{
			board[0][0] = '#';
			k = 1;
			break;
		}
		if ((board[0][2] == board[1][1])
			&& (board[0][2] == '#')
			&& (board[2][0] == ' '))
		{
			board[2][0] = '#';
			k = 1;
			break;
		}

		if ((board[0][2] == board[2][0])
			&& (board[2][0] == '#')
			&& (board[1][1] == ' '))
		{
			board[1][1] = '#';
			k = 1;
			break;
		}
		if ((board[1][1] == board[2][0])
			&& (board[2][0] == '#')
			&& (board[0][2] == ' '))
		{
			board[0][2] = '#';
			k = 1;
			break;
		}
		break;
	}
	k = judge_player(board, row, col, k);
	return k;
}



//如果满了返回1 不满返回0
int isFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char WinningBoard(char board[ROW][COL], int row, int col )
{
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == board[i][j - 1] && board[i][j - 1] == board[i][j + 1] && board[i][j - 1] != ' ')
			{
				return board[i][j - 1];
			}
		}
		
		/*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}*/
	}
	//列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		int i = 0;
		for (i = 0; i < row; i++)
		{
			if (board[i][j] == board[i - 1][j] && board[i - 1][j] == board[i + 1][j] && board[i - 1][j] != ' ')
			{
				return board[i - 1][j];
			}
		}
		/*if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}*/
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	// 平局
	if (isFull(board, row, col))
	{
		return 'Q';
	}

	//游戏继续
	return 'C';
}

2023年7月31日(练习没有笔记)

根据下面递归函数: 调用函数Fun(2),返回值是多少()

//int Fun(int n)
//{
//	if (n == 5)
//		return 2;
//	else
//		return 2 * Fun(n + 1);
//}
//
//int main()
//{
//	int ret = Fun(2);
//	printf("%d", ret);
//	return 0;
//}

逆序字符串(递归实现)

//int my_strlen(char* str)
//{
//	int count = 0;
//	while (*str !='\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//
//
////void reverse(char* str)
////{
////	char tmp = *str;
////	int len = my_strlen(str);
////	*str = *(str + len - 1);
////	*(str + len - 1)= '\0';
////	if (my_strlen(str + 1) >= 2)
////	reverse(str +1);
////	*(str + len - 1) = tmp;
////}
//
//
//
//void reverse(char arr[],int left,int right)
//{
//	char tmp = arr[left];
//	arr[left] = arr[right];
//	arr[left] = tmp;
//	if(left<right)
//		reverse(arr, left + 1, right - 1);
//
//}
//
//
//int main()
//{
//	char arr[] = "abcdefg";
//	int left = 0;
//	int right = my_strlen(arr)-1;
//	reverse(arr,left,right);
//
//	//int sz = sizeof(arr) / sizeof(arr[0]);
//	//int left = 0;
//	//int right = sz-2;
//	//int right = strlen(arr) - 1;
//	//while (left < right)
//	//{
//	//	char tmp = arr[left];
//	//	arr[left] = arr[right];
//	//	arr[right] = tmp;
//
//	//	left++;
//	//	right--;
//	//}
//	printf("%s\n",arr);
//	return 0;
//}

计算 一个数的每位之和

//int DigitSum(unsigned int n)
//{
//	if (n < 9)
//		return DigitSum(n/10) + n % 10;
//	else
//		return n;
//}
//
//
//int main()
//{
//	unsigned int n = 0;
//	scanf("%d", &n);
//	int sum = DigitSum(n);
//	printf("%d", sum);
//	return 0;
//}

实现N的K次方

////Pow(n * k) -> n*Pow(n, k-1)
////k=0,1
//// k>0,Pow(n * k) -> n*Pow(n, k-1)
////K<0,1/(Pow(n,-k));
//double Pow(int n, int k)
//{
//	if (k < 0)
//		return n * Pow(n, k - 1);
//	else if (k == 0)
//		return 1;
//	else
//		return 1.0 / Pow(n, -k);
//
//}
//
//
//int mian()
//{
//	int n = 0;
//	int k = 0;
//	scanf("%d%d", &n, &k);
//	double ret = Pow();
//
//	printf("%d", ret);
//	return 0;
//}

2023年8月1日

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//int main()
//{
//	//逗号表达式
//	int arr[] = { 1,2,(3,4),5 };
//	printf("%d", sizeof(arr);
//	return 0;
//}

//int main()
//{
//	int num = 10;
//	int arr[10] = { 0 };
//	printf("%d", sizeof(arr));
//	printf("%d", sizeof(int [10]));
//
//	return 0;
//}


//sizeof
// 是一个操作符
// 是用来计算(类型)变量所占内存空间的大小,不关注内存中 存放的具体内容
// 单位是字节
//strlen
//是一个库函数,是专门求字符串长度,只能针对字符串
//从参数给定的地址向后一直找\0统记\0之前的字符个数

//int main()
//{
//	char str[] = "hello bit";
//	printf("%d %d\n", sizeof(str), strlen(str));
//	return 0;
//}

//int main()
//{
//	int arr1[] = { 1,3,5,7,9 };
//	int arr2[] = { 2,4,6,8,0 };
//
//	int i = 0;
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	for (i = 0; i < sz; i++)
//	{
//		int tmp = arr1[i];
//		arr1[i] = arr2[i];
//		arr2[i] = tmp;
//	}
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr1[i]);
//
//	}
//	printf("\n");
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr2[i]);
//
//	}
//	printf("\n");
//	return 0;
//}


//创建一个整形数组,完成对数组的操作
//实现函数init() 初始化数组为全0
//实现print() 打印数组的每个元素函数
//实现reverse()数完成数组元素的逆置。
void init(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = 0;
	}
}

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void reverse(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}


int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	reverse(arr, sz);
	print(arr, sz);
	init(arr, sz);
	print(arr,sz);
	return 0;
}

2023年8月2日

扫雷(功能不完善)

game.h

#pragma once

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


#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10



void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DispalyBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//void MarkMine(char show[ROWS][COLS],char mark[ROWS][COLS], int row, int col);

game.c

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"


void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}


void DispalyBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;	
	printf("-----------------扫雷游戏---------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----------------扫雷游戏---------------\n");
}


void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}

}


int get_mine_count(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y] +
		board[x - 1][y - 1] +
		board[x][y - 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] +
		board[x][y + 1] +
		board[x - 1][y + 1] - 8 * '0');
}


void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0; int y = 0;
	int win = 0;//找到非雷的个数
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入坐标: ");
		scanf("%d%d",&x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
					if (show[x][y] != '*')
					{
						printf("改坐标已经被排查过");
					}
					else
					{
						//如果是雷
						if (mine[x][y] == '1')
						{
							printf("很遗憾你被炸死了\n");
							DispalyBoard(mine, ROW, COL);
							break;
						}
						//如果不是雷
						else
						{
							win++;
							//统记mine数组中x,y坐标周围有几个雷
							int count = get_mine_count(mine, x, y);
							show[x][y] = count + '0';//转换成字符数字
							DispalyBoard(show, ROW, COL);
						}
					}
			

		}
		else
		{
			printf("输入非法请重新输入");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你成功排雷\n");
		DispalyBoard(mine, ROW, COL);
	}
}

test.c

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"


void menu()
{
	printf("***********************\n");
	printf("********1.paly*********\n");
	printf("********0.exit*********\n");
	printf("***********************\n");

}

void game()
{
	char mine[ROWS][COLS] = { 0 };//存放布置好的雷
	char show[ROWS][COLS] = { 0 };//存放排查出的雷的
	char mark[ROWS][COLS] = { 0 };
	//初始化数组的内容
	//mine没有布置雷的时候都是‘0‘
	InitBoard(mine,ROWS,COLS,'0');
	//show数组没有排查雷的时候都是’*‘
	InitBoard(show, ROWS, COLS,'*');

	//DispalyBoard(mine, ROW, COL);
	//设置雷
	SetMine(mine,ROW,COL);

	DispalyBoard(show, ROW, COL);
	//标记雷
	//MarkMine(show,mark, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}


int main()
{
	int input = 0;
	//设置随机数的生成
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误");
			break;
		}
	} while (input);
	return 0;
}

2023年8月3日

左移操作符<<

//左移操作符
//int main()
//{
//	int a = 7 % 2;
//	int b = 7 / 2;
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}


//int main()
//{
//	int a = 7;
//	//左移操作符
//	//移动的是二进制位
//	int b = a << 1;
//	printf("a=%d\n", a);
//	printf("b=%d\n", b);
//	return 0;
//}


//int main()
//{
//	/*float f = 3.14f;
//	float f2 = f << 1;*/ //不支持移动float 浮点函数
//	
//	return 0;
//}

右移操作符>>

//右移操作符
//int main()
//{
//	int a = -7;
//	int b = a >> 1;
//	printf("a=%d\n", a);
//	printf("b=%d\n", b);
//	return 0;
//}

笔记

整数的二进制有三种
源码
补码
反码

正的整数的源码。反码,补码相同
负的整数的源码,反码,补码需要计算

7
0000000000000000000111 - 源码
0000000000000000000111 - 补码
0000000000000000000111 - 反码

-7
1000000000000000000111 - 源码
1111111111111111111001 - 补码 源码的符号位不变 反码加1
1111111111111111111000 - 反码 符号位不变其他位取反就是反码

整数在存储的时候是他的补码


/右移操作符
算数移位 右边丢弃 左边补上原符号
逻辑移位 右边丢弃 左边补0
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 共1条
匿名的头像-随思南游 - Peace - 生活可期,万物可爱
瞧一瞧看一看啦,快来评论啦
提交
匿名的头像-随思南游 - Peace - 生活可期,万物可爱

昵称

取消
昵称表情代码图片