C基础语法之基础1

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

int main02(void) {
	// 数组的定义和使用
	int scores[10];  // 定义数组
	scores[0] = 100;
	scores[1] = 99;
	scores[2] = 98;
	scores[3] = 97;
	scores[4] = 90;
	scores[5] = 88;
	scores[6] = 70;
	scores[7] = 62;
	scores[8] = 60;
	scores[9] = 10;
	
	int sum = 0;
	int len = sizeof(scores)/ sizeof(int);//数组长度
	for (int i = 0;i<len; i++) {
		printf("第%d名学生,成绩:%d\n", i+1, scores[i]);
		sum += scores[i];
	}	
	//求出班级平均成绩
	printf("班级的平均成绩为:%.2f\n",(float)sum/len);
	
	printf("%p\n", &scores[0]); //
	
	// 十只小猪称体重
	int max = 0;
	int fits[10] = {2,5,12,8,12,6,21,7,11,4};
	int lenn = sizeof(fits) / sizeof(fits[0]);
	for (int i = 0; i < lenn; i++) {
		printf("%d,",fits[i]);
		if (fits[max] <= fits[i]) {
			max = i;
		}
	}
	printf("\n最重的小猪下标为:%d,数值为:%d\n",max,fits[max]);

	// 一维数组 冒泡排序  从小到大排序  大的往后移
	int temp = 0; 
	for (int i = 0;i<lenn;i++) {  //外层循环 每循环一次 确定一个最大值
		for (int j = 0; j < lenn-i-1; j++) {  // 内存循环 每循环一次 确定相邻数值中较大值
			if (fits[j]>=fits[j+1]) {
				//fits[j], fits[j + 1] = fits[j + 1], fits[j]; 数组中相邻的位置互换
				temp = fits[j+1];
				fits[j+1] = fits[j];
				fits[j] = temp;
			}
		}
	}
	// 查看排序后的数组
	for (int i = 0;i<lenn; i++) {
		printf("%d,",fits[i]);
	}

	// 二维数据初始化
	int arr2[2][3] = { {1,2,2},{6,8,9} };
	int arr3[][3] = { {1,2,2},{6,8,9}, {12,9,6} };  //三列
	int arr4[4][3] = { {1},{1},{1} };  // 至赋值3个 其余为0
	int arr5[][2] = {1,2,2,3,1,4};  //每两个自动分为一组
	//int arr6[2][] = { 1,2};  // 二维数组必须写明 列数 

	// 字符数组 
	char arr6[] = {'H','e','l','l','o'};  //长度为5
	char arr7[] = "Hello"; // 长度为 6  字符串都有结束标识 '\0'
	char arr8[10] = { 'H','e','l','l','o' };  //长度为10  
	printf("\n字符数组长度为:%d\n",sizeof(arr6)); // 5
	printf("\n字符数组长度为:%d\n", sizeof(arr7)); // 6
	printf("%p\n",arr6); 
	printf("%p\n", &arr6[0]); 
	// %s 会接收字符串结束标志【'\0'】之前的所有字符, 在ASCII中就是字符0 //%s 输入地址-->输出内容以字符串的形式打印 
	printf("arr6:%s\n", arr6);  //Hello烫烫烫烫烫?  没有结束标识符 '\0'
	printf("arr6:%c\n", arr6);  //Hello烫烫烫烫烫?  没有结束标识符 '\0'
	printf("arr7:%s\n", arr7);  //Hello
	printf("arr8:%s\n", arr8);  //Hello_____   长度为10 自动补空字符 0  不会像arr6乱码
	//遍历arr6
	for (int i = 0; i < sizeof(arr6) / sizeof(arr6[0]);i++) {
		printf("%c",arr6[i]);
	}
	printf("***");
	//遍历arr7
	for (int i = 0; i < sizeof(arr7) / sizeof(arr7[0]); i++) {
		printf("%c", arr7[i]);
	}
	printf("***");
	//遍历arr8
	for (int i = 0; i < sizeof(arr8) / sizeof(arr8[0]); i++) {
		printf("%c", arr8[i]);
	}
	printf("***");
	// 注意:打印结果---->  Hello***Hello ***Hello     ***

	//字符
	char c1[100] = {0};
	//scanf("%[^\n]",c1); // hello world    接收非换行内容等  空格等
	printf("%s\n",c1);  // ---> hello world 

	/* 
	1、添加头文件 time.h stdlib.h
	2、添加随机数种子 srand((unsigned int)time(NULL)) 否则随机数是一样的
	3、生成随机数 rand()   范围随机数%
	*/
	// 随机数
	printf("%d\n",time(NULL));//1589878223  
	srand((unsigned int)time(NULL));//1589878223 标准时间 1970.1.1 0:00 
	for (int i = 0; i<100; i++) {
		printf("%d\n", rand()%11+50);// 取值范围:[50,60]
	}

	// 双色球 两种颜色 红色[1,33] + 蓝色[1,16] (6红+1蓝) 红色不能重复
	// 红色 [1,33] 不重复
	int double_ball[7];
	for (int i = 0;i<6;i++) {
		double_ball[i] = rand() % 33 + 1;
		// 去重
		for (int j = 0;j<i;j++) {
			if (double_ball[j] == double_ball[i]) {
				i--;
				//continue; 不写也可以
			}
		}
	}
	// 蓝色 [1,16] 
	int blue_ball = rand() % 16 + 1;
	double_ball[6] = blue_ball;
	for (int i = 0; i <= 6; i++) {
		printf("%d\t", double_ball[i]);
	}

	printf("\n程序结束~");
	return 0;
}

函数定义

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/* 函数分类 系统函数 (库函数),自定义函数
函数样式:1、有参 无返   2、有参 有返  3、无参 无返
*/

// 1 声明 声明函数的格式  函数在主函数后需要声明
extern int add(int a, int b);
extern int fun01(int a, int b);
void Bubble(int arr[], int len);
int Clac();

// 1-函数返回值 函数名 
// 2-函数参数列表
// 3-return 0/NULL 代表函数的结束; exit(0) 代表程序结束;
void Bubble(int arr[], int len) {
	int temp = 0;
	for (int i = 0; i < len -1; i++) {  // 行数
		for (int j = 0;j<len-i-1;j++) {  //列数
			if (arr[j] <= arr[j + 1]) {
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
	return;
}


int main04(void) {
	int arr[] = {3,4,5,6,7,8,9,2,1};
	int len = sizeof(arr)/sizeof(arr[0]);
	// 数组作为函数参数,可以退化为函数名,退化为指针
	Bubble(arr, len);
	// 排序后数据查看
	for (int i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n*******\n");

	// 3 调用 执行函数 需要完成某些功能  声明/定义 一次之后 可以多次调用
	int num1 = 22;
	int num2 = 9;
	int sum = add(num1, num2);
	printf("%d+%d=%d\n", num1, num2, sum);

	// 加1  
	printf("%d,%d\n", num1, num2);
	printf("%p,%p\n", &num1, &num2);
	fun01(num1, num2);
	printf("%d,%d\n", num1, num2);
	printf("%p,%p\n", &num1, &num2);

	// 计算器 T 停止退出
	Clac();
	return 0;
}

// 2 定义 函数的定义就是对函数功能的实现
int add(int a, int b) {
	return a + b;
}

// 实参会影响形参的值  形参不会影响实参的值
int fun01(int a, int b) {
	a++;
	b++;
	printf("函数内部:%d,%d\n", a, b);
	printf("函数内部:%p,%p\n", &a, &b);
	return 0;
}


int Clac() {
	int a;
	int b;
	char ch;
	while (1) {
		scanf("%d%c%d", &a, &ch, &b );
		printf("*******");
		printf("输入:%d,%d\n", a,b);
		switch(ch){
		case '+':
			printf("%d+%d=%d\n",a,b,a+b);
			break;
		case '-':
			printf("%d-%d=%d\n", a, b, a-b);
			break;
		case '*':
			printf("%d+%d=%d\n", a, b, a*b);
			break;
		case '/':
			if (!b) {
				printf("除数不能为0\n");
				continue;
			}
			printf("%d/%d=%d\n", a, b, a/b);
			break;
		case 'T':
			printf("即将退出...\n");
			return 0;
		}
	}
	return 0;
}

自实现:字符串比较

#define _CRT_SECURE_NO_WARNINGS  //键盘输入
#include <stdio.h>

#include "myhead.h"
//放入头文件中 myhead.h
//extern void clac();
//extern int my_strcmp(const char str1[], const char str2[]);

// int main(int argc,char * argv[])  接收传入参数 gcc -o a a.c
int main() {
	//clac(); // 计算器
	//字符串比较
	char str1[] = "hello";
	char str2[] = "hello";
	int flag = my_strcmp(str1, str2);
	if (flag ==0) 
	{
		printf("%s 等于 %s",str1, str2);
	}
	else if (flag>0) 
	{
		printf("%s 大于 %s", str1, str2);
	}
	else if (flag < 0)
	{
		printf("%s 小于 %s", str1, str2);
	}
	
	return 0;
}


//两个字符数组大小比较
int my_strcmp(const char str1[],const char str2[]) {
	
	int i = 0;
	//1 两个都非空
	while (str1[i]!='\0' && str2[i] != '\0')
	{
		if (str1[i] != str2[i])
		{
			return str1[i] - str2[i];
		}
		i++;
	}

	//2 其中一个为空 或 两个都为空
	while (str1[i] == '\0' || str2[i] == '\0') 
	{
		return str1[i] - str2[i];
	}

	return 0;
}

// 计算器
void clac() {
	int a;
	int b;
	char name[10];

	while (1) {
		scanf("%s %d %d", name, &a, &b);
		//printf("%s %d %d\n", name, a, b);
		switch (name[0]) {
		case 'a':
			printf("%d+%d=%d\n", a, b, a + b);
			break;
		case 's':
			printf("%d-%d=%d\n", a, b, a - b);
			break;
		case 'm':
			printf("%d*%d=%d\n", a, b, a * b);
			break;
		case 'd':
			if (b == 0) {
				printf("除数不能为0");
				continue;
			}
			printf("%d/%d=%d\n", a, b, a / b);
			break;
		}
	}

}

指针:空指针 野指针 万能指针


#include <stdio.h>

extern int pointnull();
extern int pointYE();
extern int  piontAny();

int main() {
	int a = 3;
	int * p = &a; // 指针类型变量 用来指向一个变量地址
	//0-255都是系统保留 不能读 也不能写
	//p = 1000; 野指针是指向一个位置的内存空间,可能在读写的 破坏正产运行 数据获取 修改等

	//p = 0xff00;
	printf("p的16进制:%X\n", p); // 10FF970
	printf("p的地址:%p\n", p);  // 010FF970
	*p = 10;
	printf("修改数值:%d\n", a);
	printf("修改数值:%d\n", *p);

	// 指针类型在内存中的大小 按照无符号unsignedint 2^32 -1   四个字节  
	printf("int指针大小:%d\n", sizeof(p));
	printf("int指针大小:%d\n", sizeof(int *));
	// 在32位x86操作系统中 指针大小都为4;  在64位x64操作系统中指针大小为8
 	printf("int指针大小:%d\n", sizeof(int*));//4
	printf("char指针大小:%d\n", sizeof(char*));//4
	printf("short指针大小:%d\n", sizeof(short*));//4
	printf("long指针大小:%d\n", sizeof(long*));//4
	printf("float指针大小:%d\n", sizeof(float*));//4
	printf("double指针大小:%d\n", sizeof(double*));//4

	// 野指针练习 应用场景:金山游侠 读取游戏内存 修改休息参数 游戏作弊等
	pointYE();

	// 空指针练习
	pointnull();

	// 万能指针练习
	piontAny();

	return 0;
}


int  piontAny() {
	//对数据类型不了解的时候
	// 整型指针
	int a = 8;
	void* p3 = &a;
	*(int*)p3 = 100; // 操作
	printf("%d\n", *(int*)p3);
	printf("%d\n", a);
	//字符指针
	char b = 'd';
	p3 = &b;  // int --> char 
	*(char*)p3 = 97;
	printf("%d\n", *(char*)p3);
	printf("%d\n", b);
	//数组指针
	int arr[10] = { 0 };
	p3 = arr;
	*(int*)p3 = 9;
	*((int*)p3 + 4) = 200;
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);//9 0 0 0 200 0 0 0 0 0
	}

	return 0;
}


int pointnull() {
	//空指针就是指向内存编号为0的空间,操作该内存空间(值)会报错,0-255系统保留,一般情况空指针留作条件判断
	int* p2 = NULL;
	printf("%d\n", p2);  //0
	//* p2 = 100; 错
	//printf("%d\n", p2); 
	
	return 0;
}

int pointYE() {
	// 指针指向内存编号为100的内存地址  
	int a = 10;
	int * p1 = &a;
	printf("%p\n", p1);//004FFBF4 a的地址
	// 野指针 指定指针地址 
	p1 = 0xff00;  
	// 0-255都是系统保留 指针地址可以读可以写 
	printf("%p\n", p1);//100->00000064  可以读 0xff00-> 0000FF00
	// 但是不可以写  指针指向内存值 不能读也不能写  
	//*p = 20; 不能对值进行操作
	//printf("%d\n", *p); 不可以写
	// 总结:野指针是指向一个未知的内存空间 可能在读写的时候出现错误

	return 0;
}

int main003() {
	int a = 7;
	//char b = 'm';  *(char *)p = 100;
	// 万能指针
	void* p = &a;
	*(int *)p = 100;
	printf("%d\n",*(int *)p);
	printf("%d\n", a);

	return 0;
}

int main004() {
	int arr[10] = {0};
	// 万能指针
	void* p = arr;  // 数组名就是首地址
	*(int*)p = 100;  //arr[0] arr[1]
	*((int*)p + 4) = 20;  // int* +4 代表移动4个位置  100 0 0 0 20 0 0 0 0 0
	*((int*)p + 4) = 20;  // 先强转 再加4
	for (int i = 0; i < 10;i++) {
		printf("%d ",arr[i]);
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值