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++); //输出3int 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) 输出表列是程序需要输出的一些数据,可以是常量、变量或表达式。
2.格式字符
| d,i | 以带符号的十进制形式输出整数(正数不输出符号) “%5d”指定输出数据占5列 |
|---|---|
| c | 以字符形式输出,只输出一个字符 |
| f | 以小数形式输出单、双精度数,隐含输出6位小数() |
| s | 输出字符串 |
9.scanf函数
1.一般格式
(1) “格式控制”是用双引号括起来的一个字符串,含义同printf函数。包括:
① 格式声明。以%开始,以一个格式字符结束,中间可以插入附加的字符。
② 普通字符。
(2) 地址表****列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
2.格式字符
| d,i | 输入有符号的十进制整数 |
|---|---|
| c | 输入单个字符 |
| s | 输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志′\0′作为其最后一个字符 |
| f | 输入实数,可以用小数形式或指数形式输入 |
4.选择结构程序设计
1.IF语句
1.形式



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.关系运算符及优先级
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有一个以上为真,则结果为真,二者都为假时,结果为假 |

3.条件运算符
if (a>b)
max=a; 》 max=(a>b) ? a : b;
else
max=b;
3.选择结构的嵌套


#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;
}


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;
}

4.斐波那契问题

#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.一维数组的初始化

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.二维数组的初始化

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

#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);
}



浙公网安备 33010602011771号