zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言 基础系列篇

C语言基础 系列
2023-09-14 09:13:55 时间

喜欢记得点个赞哟,我是王睿,很高兴认识大家!

1、知识总结

1.1、关键字

在这里插入图片描述

1.2、ASCLL码表

在这里插入图片描述

1.3、冒泡排序法

#include<stdio.h>
#define n 7
int main()
{
	int i,j;
	int x[n];
	printf("请输入7个数字:\n");
	for(i=0;i<n;i++)
		scanf("%d",&x[i]);	
	for(i=0;i<n-1;i++)			//控制趟次,7个数就需要交换6趟(两两交换),∴ :i<n-1
	{	
		for(j=0;j<n-i-1;j++)	
		{
		/*控制交换次数,每执行完一趟后,就可以保证最后一个数一定是最大或者最小的数,
		下一轮就无需再管这个数,继续排前面的数就好,那么两趟后就确定了两个最大或者
		最小的数,那么就在继续排列前面的数,∴ :j<n-i-1	*/
			if(x[j]>x[j+1])
			{
				int temp = x[j];		//	temp是两个数交换值的中间变量
				x[j]=x[j+1];			
				x[j+1]=temp;
			}
		}
	}
	printf("按从小到大排序为:\n");
	for(i=0;i<n;i++)
		printf("%d\t",x[i]);
	printf("\n");
	return 0;
}

1.4、选择排序法

#include<stdio.h>
#define N 7
int main(int argc,char* argv[])
{
	int i,j,x[N],min,temp;
	//i,j→用于循环和数组下标、min→标记最小值,temp→交换两数的中间变量
	printf("请输入7个数字:\n");
	for(i=0;i<N;i++)
		scanf("%d",&x[i]);
	for(i=0;i<N-1;i++)		//控制趟次
	{
		min=i;		/*假设初始下标i就为最小值,那么下面一层的循环应从下一个数与它就行比较,而不应该再是自己比自己
					  那样是毫无意义的,∴ j=i+1	*/
		for(j=i+1;j<N;j++)	
		{
		/*放入到全部数据里面去比大小,当比完第一趟以后第一个数
		就一定是这个数组中的最大或者最小值,此时就无需再关顾第一个数
		而应该是继续排序剩下来的所有数字,∴ j<N	*/

			//如果有比min这个下标数组的值还要小的数,就标记住这个数,继续参与比较,这么下来,min标记的一定是最小值
			if(x[min]>x[j])	
				min=j;
		}
		if(min!=i)	/*说不定这个数从一开始就是一个有序的数,所以,判断如果min的下标从未发生过改变,那么说明这个数
					  排序后就肯定还是在原来的位置,那么此时无需再交换两数,保持这个位置就好		*/

		{
			temp=x[min];
			x[min]=x[i];
			x[i]=temp;
		}
	}
	printf("按从小到大排序为:\n");
	for(i=0;i<N;i++)
		printf("%d ",x[i]);
	printf("\n");
	return 0;
}


1.5、插入排序法

#include<stdio.h>
#define N 7
int main()
{
	int i;
	int index1,index2;
	int x[N];
	printf("请输入7个数字:");
	for(i=0;i<N;i++)
		scanf("%d",&x[i]);
	for(i=1;i<N;i++)
	{	
		index1=i-1;		//因为开始是先拿两个最前面的值进行,比较,所以第一个值就应该是x[1-1]来与x[1]比较,以此类推
		index2=x[i];	//取出这个数赋值给index2
		while(index1>=0 && x[index1]>index2)//进入循环,与index2之前有序的数列进行比较,到index2时,它前面的数一定都是有序的
		{											
			x[index1+1]=x[index1];
			index1--;	//每遍历完依次循环就往前面移一位
		}
		x[index1+1]=index2;		//将取出来的这个数,赋值给对应的位置
	}
	printf("按从小到大排列为:\n");
	for(i=0;i<N;i++)
		printf("%d\t",x[i]);
	printf("\n");
	return 0;
}

1.6、结构体快排

在这里插入图片描述
代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Stu{
	char name[100];	//名字 
	char xue[100];	//学号 
	int c;			//成绩 
}stu[10010];
int comp(const void* a,const void* b)
{
	struct Stu *aa = (struct Stu *)a;
	struct Stu *bb = (struct Stu *)b;
	return ((aa->c)-(bb->c));		//aa->c为结构体的成员,bb->c也为结构体的成员 
}
int main()
{
	int n;
	int i,j;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		scanf("%s%s%d",&stu[i].name,&stu[i].xue,&stu[i].c);
	}
	printf("\n");
	qsort(stu,n,sizeof(stu[0]),comp);	//参数1:结构体数组名,个数,首地址的字符数,自定义比较函数名 
	for(i=0;i<n;i++)
	printf("%s %s %d\n",stu[i].name,stu[i].xue,stu[i].c);
	return 0;
	
}

1.7、转义字符

在这里插入图片描述

1.8、数据类型,基本整型所占字节数

C语言 — 数据类型,基本整型所占字节数
20/100
发布文章
qq_27494201
未选择任何文件
在这里插入图片描述

在这里插入图片描述
注意!基本整型所占的字节数除了跟操作系统位数有关外,还跟编译器有关,比如说:VC++ int 占据4个四节,但是在 tuborC下则是2个字节
在这里插入图片描述

注意!基本整型所占的字节数除了跟操作系统位数有关外,还跟编译器有关,比如说:VC++ int 占据4个四节,但是在 tuborC下则是2个字节

1.9、编程规范、标识符命名规范

C语言 — 编程规范、标识符命名规范
18/100
发布文章
qq_27494201
未选择任何文件
△ 编程规范:

一丶代码缩进:
在这里插入图片描述

二丶变量与常量的命名规范:

常量命名统一为大写格式。如果是成员变量,均以m_开始。如果是普通
变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的
首字母要大写。如果是指针,则为其标识符前添加p字符,并且名称首字母
要大写。例如:

#define AGE 20 /定义常量/
int m_iAge; /定义整型成员变量/
int iNumber; /定义普通整型变量/
int * pAge; /定义指针变量/

三丶函数命名规范:

在定义函数时,函数名的首字母要大写,其后的字母大小写混合。例如:
int AddTwoNum(int num1,int num2);

四丶注释:

尽量采用行注释。如果行注释与代码处于一行,则注释应位于代码右方
。如果连续出现多个行注释,并且代码较短,则应对齐注释。例如:

int iLong; /长度/
int iWidth; /宽度/
int iHieght /高度/

△ 标识符命名规范:

标识符是什么?

在C语言中为了在程序的运行过程中可以使用变量、常量、函数、数组等,
就要为这些形式设定一个名称,而设定的名称就是所谓的标识符。

C语言标识符应该遵守的一些命名规则:

所有标识符必须由字母或下划线开头,而不能使用数字或者符号作为开头

int !number; /错误,标识符第一个字符不能为符号/
int 2hao; /错误,标识符第一个字符不能为数字/
int number; /正确,标识符第一个字符为字母/
int _hao; /正确,标识符第一个字符为下划线/
△ 编程规范:

一丶代码缩进:
在这里插入图片描述

二丶变量与常量的命名规范:

常量命名统一为大写格式。如果是成员变量,均以m_开始。如果是普通
变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的
首字母要大写。如果是指针,则为其标识符前添加p字符,并且名称首字母
要大写。例如:

#define AGE 20 /定义常量/
int m_iAge; /定义整型成员变量/
int iNumber; /定义普通整型变量/
int * pAge; /定义指针变量/

三丶函数命名规范:

在定义函数时,函数名的首字母要大写,其后的字母大小写混合。例如:
int AddTwoNum(int num1,int num2);

四丶注释:

尽量采用行注释。如果行注释与代码处于一行,则注释应位于代码右方
。如果连续出现多个行注释,并且代码较短,则应对齐注释。例如:

int iLong; /长度/
int iWidth; /宽度/
int iHieght /高度/

△ 标识符命名规范:

标识符是什么?

在C语言中为了在程序的运行过程中可以使用变量、常量、函数、数组等,
就要为这些形式设定一个名称,而设定的名称就是所谓的标识符。

C语言标识符应该遵守的一些命名规则:

所有标识符必须由字母或下划线开头,而不能使用数字或者符号作为开头

int !number; /错误,标识符第一个字符不能为符号/
int 2hao; /错误,标识符第一个字符不能为数字/
int number; /正确,标识符第一个字符为字母/
int _hao; /正确,标识符第一个字符为下划线/

文章目录
暂无目录
文章内添加文章内添加@[TOC]自动根据文章标题生成目录

Markdown 845 字数 47 行数 当前行 1, 当前列 0HTML 619 字数 30 段落

1.10、运算符的优先级与结合性

最高级

最低级

在这里插入图片描述

1.11、编程规范

遵循编程规范,可以改善软件的可读性,可以让开发人员尽快而彻底地理解新的代码,好的编码规范可以最大限度的提高团队开发的合作效率。

1、代码缩进
代码缩进统一为4个字符。不采用空格,而用Tab 键制表位
在这里插入图片描述

2、变量、常量命名规范
常量命名统一为大写格式

#define SUM 100      /*定义常量*/ 

成员变量,均以m开始

int m_iSum;        /*定义整型成员变量*/

普通变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的首字母要大写

int iNumber;      /*定义普通整型变量*/

指针,为其标识符前添加p字符,并且名称首字母要大写

int* pAge;        /*定义指针变量*/ 

3、函数的命名规范
在定义函数时,函数名的首字母要大写,其后的字母大小写混合。例如:

int AddTwoNum(int num1,int num2);

4、注释

  • 一种是以/开始、以/结束的块注释(block comment);
  • 另一种是以//开始、以换行符结束的单行注释(line comment)。

在这里插入图片描述

2、常见问题

2.1、两点间的距离公式

公式:
如果点A(x1,y1)、点B(x2,y2)则AB的距离为
∣AB∣=√[(x1-x2)2+(y1-y2)2]

代码:

#include<stdio.h>
#include<math.h>
int main()
{
	int x1,y1,x2,y2,x3,y3;			//任意三点坐标
	double lenght1,lenght2,lenght3;	//三角形的各三边长度
	int high;						//三角形的高
	scanf("%d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3);	//输入3个点的坐标
	lenght1 = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	lenght2 = sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
	lenght3 = sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
	//printf("%lf\n%lf\n%lf\n",lenght1,lenght2,lenght3);		调试用的,观察数据
	if( (lenght1+lenght2)>lenght3 && (lenght1+lenght3)>lenght2 && (lenght2+lenght3)>lenght1 && (lenght1-lenght2)<lenght3 && (lenght1-lenght3)<lenght2 && (lenght2-lenght3)<lenght1)
		//上面这个是判断是否构成三角形条件的决定性因素
	{
		printf("L = %.2lf",lenght1+lenght2+lenght3);	//	若构成三角形
	}
	else
	{
		printf("Impossible\n");		//	若不构成三角形,输出Impossible
	}
		
	return 0;
}

2.2、利用三条边求得三角形的面积公式(海伦公式)

C语言中利用三条边求得三角形的面积公式 —【海伦公式】
27/100
发布文章
qq_27494201
未选择任何文件
在这里插入图片描述

在这里插入图片描述

3、题库

1、int fun(int x){int p;if(x == 0 || x==1) return p=3;else p = x-fun(x-2);}void main(){printf(“%d\n“)}

1、题目

在这里插入图片描述

2、知识点

  • 函数调用

3、要做好的功课
这就是一个 完整的函数
在这里插入图片描述

随后,这块部分是函数体。当有地方调用(可以理解为使用)到 fun这个函数的时候,下面圈起来的这部分代码都会执行,范围在第一个左括号到最后一个右括号。
在这里插入图片描述
好,那么理解了这个过程后,我们就开始解题了!

4、开始解题
在这里插入图片描述
下图红线圈住的这行代码调用了 fun(7)这个函数。
在这里插入图片描述

第1次计算:
上图把7传入到了 fun函数中,此时x =7
X=7,经过 if else判断
会执行

else p = x-fun(x-2) = else p = 7 - fun(7-2)
在这里插入图片描述
经过上面的第一次计算fun(7-2)=fun(5),它调用了自身,此时x = 5

第2次计算:
else p = 5-fun(5-2) => p = 5-fun(3)
又调用自身的 fun函数,此时:x=3

第3次计算:
else p = 3-fun(3-2) => p =3-fun(1)
又调用自身的 fun函数,此时:x=1

第4次计算:
此时注意,if(x==0||x==1),|| 的意思是说,左边或者右边只要有一个条件是成立的就执行if代码,如果左右两边都不成立,就执行else代码
带入 x=1,此时 1==1,成立
执行: return p = 3。

在这里插入图片描述

2、void main(){char str[] = “\tab\n\014\\“;printf(“%d“,strlen(str))}

1、题目

在这里插入图片描述

2、知识点

  • strlen 函数
  • 转义字符

3、要做好的功课

  • 3.1、strlen 函数

strlen 是C语言里的内置函数,它的作用是计算长度。
可以看到 strlen(str)这句代码,意思是要计算出 str的字符串长度。
在这里插入图片描述

  • 3.2、转义字符
    \t,\n,\这些都是转义字符,他们都只代表一个字符
    在这里插入图片描述

4、开始解题
在这里插入图片描述

3、int fun(int n){switch(n){case 0: return 0;case 1: return 1;case 2: return 1;default:return fun(n-)}}

1、题目

在这里插入图片描述

2、知识点

  • 函数调用
  • 函数的递归
  • 其实这是一道:求斐波那契数列第n项的值

3、开始解题
在这里插入图片描述

好,那么 fun(7)传入的话,就可以得出以下公式:
fun(3)=fun(2)+fun(1)=2,看上图,根据f(1)=f(2)=1得出=>f(3) = 1+1,以此类推
fun(4)=fun(3)+fun(2)=3
fun(5)=fun(4)+fun(3)=5
fun(6)=fun(5)+fun(4)=8
fun(7)=fun(6)+fun(5)=13

4、以下程序运行后的输出结果是:int fun(int n){static int s=1;s*=n;return s;main(){int i,s=0;for(i=1;i<=4;i++){s+=f}}}

1、题目
在这里插入图片描述
在这里插入图片描述

2、知识点

  • static的作用
  • 函数调用
  • for 循环

3、要做好的功课
一般情况下

在这里插入图片描述
那么得到当这个函数执行完,s这个变量就销毁(不存在)了
在这里插入图片描述
但是有了 static 修饰后的变量,他就有了一个新作用,看下图
在这里插入图片描述

4、开始解题
在这里插入图片描述

调用了 fun()方法(也叫函数)。那我们就开始带值去计算
第一次循环,s=0,i=1
s+=fun(i) => s+=fun(1) 执行这条代码,进入fun函数
在这里插入图片描述
n=1,s=1
s*=n的意思相当于 s = sn
s = 1
1 = 1
return 1;

再来看这行代码
在这里插入图片描述
因为s += fun(i),右边的fun(i)经过第一次计算完后,返回了1
所以main函数中,s += fun(i) => s = 0+1=1,s=1

第二次循环,s=1,i=2
进入fun函数计算,n=2,s=1(用上一次计算后的值)
s*=n => s=sn=12=2
return 2(返回2)

因为s += fun(i),右边的fun(i)经过第一次计算完后,返回了2
所以main函数中,s += fun(i) => 1+2 = 3,s = 3

第三次循环,s=3,i=3
进入fun函数计算,n=3,s=2(用上一次计算后的值)
s*=n => s=sn=23=6
return 6(返回6)

因为s += fun(i),右边的fun(i)经过第一次计算完后,返回了6
所以main函数中,s += fun(i) =>s= 3+6= 9,s = 9

第四次循环,s=9,i=4
进入fun函数计算,n=4,s=6(用上一次计算后的值)
s*=n => s=sn=46=24
return 24(返回24)
因为s += fun(i),右边的fun(i)经过第一次计算完后,返回了24
所以main函数中,s += fun(i) =>s= 9+24= 33,s = 33

5、执行下面程序段后,y的结果是____。int x,y;x=y=2;x=x-2&&(y=y+1);printf(“%d“,y);A。3 B.2 C.1 D。0

1、题目
在这里插入图片描述

2、知识点

  • 基础运算
  • 运算符的优先级顺序
  • &&短路机制

3、要做好的功课
讲之前,先看下这张表
在这里插入图片描述

4、开始解题
在这里插入图片描述

根据运算符的优先级顺序
在这里插入图片描述
‘-’号要比‘&&’符号优先级更高,所以先执行
在这里插入图片描述
那么x-2等于0
&& 的意思是说:两边都为真,才会返回真,否则为假
为此, && 有个短路机制,就是当一方为假时,另一方不再执行,因为没有意义。
所以说,当 x-2=0,执行&&的时候,发现左边为假,右边的(y=y+1)就不执行了。
所以y = 2

喜欢记得点个赞哟,我是王睿,很高兴认识大家!