C语言基本笔记 未全

1.程序设计

1.概念

1.所谓程序,就是一组计算机能识别和执行的指令。

2.这种计算机能直接识别和接受的二进制代码称为机器指令。机器指令的集合就是机器语言。

3.符号语言又称为汇编语言。

2.结构

1.一个程序由一个或多个源程序文件组成

源程序文件组成

1.预处理指令(#include<stdio.h>)

2.全局声明(int main)

3.函数定义

2.函数是C程序的主要组成部分

3.一个函数包括两个部分

1.函数首部

2.函数体

4.程序总是从main函数开始执行的

5.程序中要求计算机完成的操作是由函数中的C语句完成的

6.在每个数据声明和语句的最后必须有一个分号

7.C语言本身不提供输入输出语句

8.程序应当包含注释

3.运行

1.上机输入和编辑源程序

2.对源程序进行编译

编译程序自动把源程序转换为二进制形式的目标程序(后缀为.obj)

3.进行连接处理

生成一个可供计算机执行的目标程序,称为可执行程序,后缀为.exe

4.运行程序

2.算法

1.程序(算法+数据结构=程序)

程序应包含两方面信息

1.对数据的描述

2.对操作的描述

2.三种结构

1.顺序结构

2.选择结构

3.循环结构

1.类型

1.当型循环(while)

2.直到型循环(until)

2.特点

1.只有一个入口

2.只有一个出口

3.结构内的每一部分都有机会被执行到

4.结构内不存在“死循环”

3.程序设计

1.数据形式

1.常量

在程序运行过程中,其值不能被改变的量称为常量

1.整型常量

2.实型常量

3.字符常量

字符常量存储在计算机存储单元中,以其代码(一般为ASCII代码)存储的

特殊:允许用一种特殊形式的字符常量,以" \ "开头的字符序列 P40

4.字符串常量

5.符号常量

2.变量

变量必须先定义,后使用

变量名实际上是以一个名字代表的一个存储地址

3.常变量

4.标识符

对变量、符号常量名、函数、数组、类型命名的有效字符序列称为标识符

C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线

2.数据类型

基本类型

1.整型类型

基本整型(int)

短整型(short int)

长整型(long int)

字符型(char)

2.浮点类型

单精度浮点型(float)

双精度浮点型(double)

3.整型数据

1.基本整型(int)

在存储单元中的存储方式是:用整数的补码形式存放

2.短整型(short int)

3.长整型(long int)

4.双长整型(long long int)

4.运算符种类

算术运算符 + - ***** / % ++ --

关系运算符 > < == >= <= !=

逻辑运算符 !(非) &&(与) ||(或)

条件运算符 ? :

5.自增自减

++i,--i 在使用i之前,先使i的值加/减1

i++,i-- 在使用i之后,使i的值加/减1

例:

int i=3;
printf(“%d”,i++);	//输出3
int i=3;
printf(“%d”,++i);	//输出4

6.不同类型数据间混合计算

#include <stdio.h>
int main()
{
	char c1,c2;
	c1='A'; 			//将字符′A′的ASCII代码放到c1变量中
	c2=c1+32;			//得到字符′a′的ASCII代码,放在c2变量中 
	printf("%c\n",c2);	//输出c2的值,是一个字符
	printf("%d\n",c2);	//输出c2的值,是字符′a′的ASCII代码
	return 0;
}
a
97

7.赋值语句

复合的赋值运算符

a+=3 等价于a=a+3

x * =y+8 等价于x=x * (y+8)

x%=3 等价于x=x%3

8.printf函数

1.一般格式

(1) “格式控制”是用双引号括起来的一个字符串,称为格式控制字符串,简称格式字符串。包括:

格式声明。格式声明由“%”和格式字符组成。作用是将输出的数据转换为指定的格式后输出。

普通字符。普通字符即需要在输出时原样输出的字符。

(2) 输出表列是程序需要输出的一些数据,可以是常量、变量或表达式。

image-20191227101930882

2.格式字符

d,i 以带符号的十进制形式输出整数(正数不输出符号) “%5d”指定输出数据占5列
c 以字符形式输出,只输出一个字符
f 以小数形式输出单、双精度数,隐含输出6位小数()
s 输出字符串

9.scanf函数

1.一般格式

(1) “格式控制”是用双引号括起来的一个字符串,含义同printf函数。包括:

格式声明。以%开始,以一个格式字符结束,中间可以插入附加的字符。

普通字符

(2) 地址表****列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

image-20191227102109489

2.格式字符

d,i 输入有符号的十进制整数
c 输入单个字符
s 输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志′\0′作为其最后一个字符
f 输入实数,可以用小数形式或指数形式输入

4.选择结构程序设计

1.IF语句

1.形式

image-20191227105759086

image-20191227105823307

image-20191227105830821

2.例子(按小到大顺序输出)

#include <stdio.h>
int main()
{
	float a,b,c,t;
	scanf("%f,%f,%f",&a,&b,&c);
	if(a>b)
	{	t=a;		//借助变量t,实现变量a和变量b互换值
		a=b;
		b=t;
	}			//互换后,a小于或等于b     
	if(a>c)
	{	t=a;		//借助变量t,实现变量a和变量c互换值
		a=c;
		c=t;
	}			//互换后,a小于或等于c       
	if(b>c)		//还要
	{	t=b;		//借助变量t,实现变量b和变量c互换值
		b=c;
		c=t;
	}			//互换后,b小于或等于c                       
	printf("%5.2f,%5.2f,%5.2f\n",a,b,c); 		//顺序输出a,b,c的值
	return 0;
}

2.运算符

1.关系运算符及优先级

微信图片_20191227111136

c>a+b 等效于c>(a+b)(关系运算符的优先级低于算术运算符)

a>bc等效于(a>b)c(大于运算符>的优先级高于相等运算符==)

ab<c等效于a(b<c)(小于运算符<的优先级高于相等运算符==)

a=b>c等效于a=(b>c)(关系运算符的优先级高于赋值运算符)

2.逻辑运算符及优先级

运算符 含义 举例 说明
! 逻辑非(NOT) !a 如果a为假,则!a为真;如果a为真,则!a为假
&& 逻辑与(AND) a && b 如果a和b都为真,则结果为真,否则为假
|| 逻辑或(OR) a || b 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假

image-20191227111907818

3.条件运算符

if (a>b)
	max=a;         》    max=(a>b) ? a : b;
else 
	max=b;

3.选择结构的嵌套

image-20191227200938135

image-20191227201004220

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

4.Switch语句

switch(表达式)
{
case	常量1 : 语句1
case	常量2 : 语句2
    ⋮	    ⋮		⋮
case	常量n : 语句n
default :	    语句n+1
}

1.成绩分段

#include <stdio.h>
int main()
{
	char grade;
	scanf("%c",&grade);
	printf("Your score:");
	switch(grade)
	{
	case 'A': printf("85~100\n");break;
	case 'B': printf("70~84\n");break;
	case 'C': printf("60~69\n");break;
	case 'D': printf("<60\n");break;    
	default:  printf("enter data error!\n");
	}
	return 0;
}

2.判断闰年

if((year%4==0 && year%100!=0) || (year%400==0))
	  leap=1;
	else
	  leap=0;

5.循环结构设计

1.break语句(捐款问题)

break语句提前终止循环

#include <stdio.h>
#define SUM 100000	//指定符号常量SUM代表10万
int main()
{
	float amount,aver,total; 
	int i;
	for (i=1,total=0;i<=1000;i++)
	{
		printf("please enter amount:");
		scanf("%f",&amount);
		total=total+amount; 
		if(total>=SUM) break; 
	}
	aver=total/i;
	printf("num=%d\naver=%10.2f\n",i,aver); 
	return 0;
}

image-20191227211211561

image-20191227211221590

2.continue语句

continue提前结束本次循环

3.矩阵问题

#include <stdio.h>
int main()
{
	int i,j,n=0;
	for(i=1;i<=4;i++)
		for(j=1;j<=5;j++,n++)		//n用来累计输出数据的个数
		{	if(n%5==0) printf("\n");	//控制在输出5个数据后换行
			printf("%d\t",i*j);
		}  
	printf("\n");    
	return 0;
}

image-20191227215944074

4.斐波那契问题

image-20191228015222741

#include <stdio.h>
int main()
{ 
	int f1=1,f2=1,f3;
	int i;
	printf("%12d\n%12d\n",f1,f2);
	for(i=1; i<=38; i++)
	{
		f3=f1+f2;
		printf("%12d\n",f3);
		f1=f2;
		f2=f3;
	}
	return 0;
}

5.素数问题

1.判断素数

输入一个大于3的整数n,判定它是否为素数

#include <stdio.h>
int main()
{	int n,i;
	printf("please enter a integer number,n=?");
	scanf("%d",&n);
	for (i=2;i<n;i++)
		if(n%i==0) break;
	if(i<n) printf("%d is not a prime number.\n",n);
	else printf("%d is a prime number.\n",n);
	return 0;
}

2.求素数

求100~200间的全部素数。

#include<stdio.h>
#include<math.h>
int main()
{	int n,k,i,m=0;
	for(n=101;n<=200;n=n+2)		//n从100变化到200,对每个奇数n进行判定
	{	k=sqrt(n);
		for(i=2;i<=k;i++)
		if(n%i==0) break;			//如果n被i整除,终止内循环,此时i<k+1
		if(i>=k+1)				//若i>=k+1,表示n未曾被整除
		{	printf("%d ",n);			//应确定n是素数
			m=m+1;				//m用来控制换行,一行内输出10个素数
		}
		if(m%10==0) printf("\n");	 //m累计到10的倍数,换行
	}
	printf ("\n");
	return 0;
}

6.公约数和公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数

#include <stdio.h>
int main()
{
    int a,b,c,m,t;
    printf("请输入两个数:\n");
    scanf("%d%d",&a,&b);
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    m=a*b;
    c=a%b;
    while(c!=0)
    {
        a=b;
        b=c;
        c=a%b;
    }
    printf("最大公约数是:\n%d\n",b);
    printf("最小公倍数是:\n%d\n",m/b);
}

6.数组

1.一维数组的初始化

image-20191228112553804

2.起泡法

有10个地区的面积,要求对它们按由小到大的顺序排列。

#include <stdio.h>
int main()
{
	int a[10];
	int i,j,t;
	printf("input 10 numbers :\n");
	for (i=0;i<10;i++)
		scanf("%d",&a[i]);
	printf("\n");
	for(j=0;j<9;j++)			//进行9次循环,实现9趟比较
		for(i=0;i<9-j;i++)		//在每一趟中进行9-j次比较
			if(a[i]>a[i+1])		//相邻两个数比较 
				{t=a[i];a[i]=a[i+1];a[i+1]=t;}
	printf("the sorted numbers :\n");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

3.二维数组的初始化

image-20191228112907288

4.元素(行列)互换

将一个二维数组行和列的元素互换,存到另一个二维数组中。

image-20191228114157480

#include <stdio.h>
int main()
{
	int a[2][3]={{1,2,3},{4,5,6}};
	int b[3][2],i,j;
	printf("array a:\n");
	for(i=0;i<=1;i++)			//处理a数组中的一行中各元素
	{
		for (j=0;j<=2;j++)		//处理a数组中某一列中各元素
		{
			printf("%5d",a[i][j]);	//输出a数组的一个元素
			b[j][i]=a[i][j];	//将a数组元素的值赋给b数组相应元素
		}
printf("\n");
	}
	printf("array b:\n");				//输出b数组各元素
	for(i=0;i<=2;i++)				//处理b数组中一行中各元素
	{
		for(j=0;j<=1;j++)			//处理b数组中一列中各元素
			printf("%5d",b[i][j]);		//输出b数组的一个元素
		printf("\n");
	}
	return 0;
}

5.矩阵求最值(打擂台法)

有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

#include <stdio.h>
int main()
{	int i,j,row=0,colum=0,max;
	int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};		//定义数组并赋初值
	max=a[0][0];								//先认为a[0][0]最大
	for(i=0;i<=2;i++)
		for(j=0;j<=3;j++)
		if(a[i][j]>max)					//如果某元素大于max,就取代max的原值
		{	max=a[i][j];
			row=i;					//记下此元素的行号
			colum=j;					//记下此元素的列号
		}
	printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
	return 0;
}

6.字符数组

字符型数据是以整数形式(ASCII代码)存放的

1.puts函数——输出字符串的函数

2.gets函数——输入字符串的函数

3.strcat函数——字符串连接函数

4.strcpy和strncpy函数——字符串的复制函数

5.strcmp函数——字符串比较函数

6.strlen函数——测字符串长度的函数

7.字符串找最值

有3个字符串,要求找出其中“最大”者。

#include<stdio.h>
#include<string.h>
int main()
{
	char str[3][20];	//定义二维字符数组
	char string[20];	
	//定义一维字符数组,作为交换字符串时的临时字符数组
	int i;
	for(i=0;i<3;i++)
		gets(str[i]);	//读入3个字符串,分别给str[0],str[1],str[2]
if(strcmp(str[0],str[1])>0)	//若str[0]大于str[1]
		strcpy(string,str[0]);	//把str[0]的字符串赋给字符数组string
	else						//若str[0]小于等于str[1]
		strcpy(string,str[1]);	//把str[1]的字符串赋给字符数组string 
	if(strcmp(str[2],string)>0)	//若str[2]大于string
		strcpy(string,str[2]);	//把str[2]的字符串赋给字符数组string
	printf("\nthe largest string is:\n%s\n",string);		//输出string
	return 0;
}

7.函数模块化设计

1.说明

1.C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。

2.一个函数并不从属于另一个函数,即函数不能嵌套定义。

3.函数之间可以互相调用,但不能调用main函数。

4.main函数是被操作系统调用的。

2.函数的返回值

1.函数的返回值是通过函数中的return语句获得的

2.函数值的类型

int max(float x,float y) //函数值为整型

char letter(char c1,char c2) //函数值为字符型

double min(int x,int y) //函数值为双精度型

3.在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致

4.对于不带回值的函数,应当用定义函数为"void类型"

3.用递归方法求n!

#include <stdio.h>
int main()
{	int fac(int n);		//fac函数声明
	int n;
	int y;
	printf("input an integer number:");
	scanf("%d",&n);	//输入要求阶乘的数
	y=fac(n);
	printf("%d!=%d\n",n,y);
	return 0;
}
int fac(int n) 				//定义fac函数
{
	int f;
	if(n<0)				//n不能小于0
		printf("n<0,data error!");
	else if(n==0||n==1)	//n=0或,1时n!=1
		f=1;				//递归终止条件
	else
		f=fac(n-1)*n;	 //n>1时,n!=n*(n-1)
	return(f);
}

4对数组中10个整数从小到大排序(选择排序法)

所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]~a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。

a[0] a[1] a[2] a[3] a[4]
3 6 1 9 4 未排序时的情况
1 6 3 9 4 将5个数中最小的数1与a[0]对换
1 3 6 9 4 将余下的后面4个数中最小的数3与a[1]对换
1 3 4 9 6 将余下的3个数中最小的数4与a[2]对换
1 3 4 6 9 将余下的2个数中最小的数6与a[3]对换,至此完成排序
#include <stdio.h>
int main()
{	void sort(int array[],int n);
	int a[10],i;
	printf("enter array:\n");
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	sort(a,10);	//调用sort函数,a为数组名,大小为10
	printf("The sorted array:\n");
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
} 
void sort(int array[],int n)
{	int i,j,k,t;
	for(i=0;i<n-1;i++)
	{	k=i;
		for(j=i+1;j<n;j++)
			if(array[j]<array[k])
				k=j;
		t=array[k]; array[k]=array[i]; array[i]=t;
	}
}

5.局部变量和全局变量

定义变量可能有3种情况:

(1) 在函数的开头定义;

(2) 在函数内的复合语句内定义;

(3) 在函数的外部定义。

1.在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的,称为“局部变量

2.在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。

1.调用函数(例子)

有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分

#include <stdio.h>
float Max=0,Min=0;	//定义全局变量Max,Min
int main()
{	float average(float array[],int n);
	float ave,score[10];
	int i;
	printf("Please enter 10 scores:");
	for(i=0;i<10;i++)
		scanf("%f",&score[i]);
	ave=average(score,10);
	printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
	return 0;
}
float average(float array[],int n)	//定义函数,有一形参是数组
{	int i;
	float aver,sum=array[0];
	Max=Min=array[0];
	for(i=1;i<n;i++)
	{	if(array[i]>Max) Max=array[i];
		else if(array[i]<Min) Min=array[i];
		sum=sum+array[i]; 
	}
	aver=sum/n;
	return(aver);
}
posted @ 2020-10-10 14:34  Hermitaria  阅读(134)  评论(0)    收藏  举报