C程序设计
2024-04-01 14:28:30 0 举报
AI智能生成
C语言是一种广泛使用的程序设计语言,它具有简洁的语法和丰富的函数库,适合编写各种类型的程序,如系统程序、应用程序和图形用户界面程序。C语言程序通常由一个或多个函数组成,每个函数实现特定的功能。函数可以嵌套调用,也可以调用库函数。C语言的数据类型丰富,包括整数、浮点数、字符和数组等。通过指针,C语言可以方便地操作内存和动态分配内存。C语言还支持宏定义和条件编译,可以方便地编写跨平台的程序。C语言程序通过编译后生成可执行文件,可以在各种操作系统上运行。
作者其他创作
大纲/内容
循环结构
概述:<br>反复执行某段程序,知道某种条件不满足才结束
while语句
一般形式:<br>while(表达式)<br>语句;
注意
在循环体中,应有使循环趋于结束的语句
程序陷入死循环,用<font color="#ff0000"><b>Ctrl+break</b></font>结束
循环体中如果包含一个以上的语句,需要用<font color="#ff0000"><b>{}</b></font>括起来
例题:<br>求sum=1+2+……+100<br><b><font color="#1976d2">思路:<br></font></b>令sum表示被加数(初始值为0)令i表示教书(初始值为1)<br>进行100次加法后结束,或者单加数大于100时结束<br>sum中存放计算结果
void main()<br>{<br> int sum=0,i=1;<br> printf("%d\n",sum);<br> while(i<=100)<br> {<br> sum=sum+i;<br> i++;<br> } <br> printf("sum=%d\n",sum);<br>}
do……while语句
一般形式:<br>do <br> 语句;<br>while(表达式)
例题:<br>求sum=1+2+……+100<br>用do……while实现
void main()<br>{<br> int sum=0,i=1;<br> do{<br> sum=sum+i;<br> i++;<br>} while(i<=100);<br>}
while与do……while的区别
do……while的循环体至少要执行一次,<br>而while中的循环体可能一次也不执行
for语句
一般形式:<br>for(表达式1;表达式2;表达式3)<br> 语句;<br>表达式1是初始条件<br>表达式2是循环条件<br>语句是循环体
先执行表达式1,表达式2判定条件,如果条件为真,执行语句,然后执行表达3<br>再判定条件,如果为真,在执行语句,在判定条件,直到为假,退出循环
for(表达式1;表达式2;表达式3)<br>1.如果省略了“表达式1”(初始条件)表示不对循环控制变量赋初值<br>2.如果省略了“表达式2”(循环条件)不做其他处理时,便成为死循环<br>3.如果省略了“表达式3”(循环变量增加量)则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句<br>4.可以省略表达式1和表达式3<br>5.表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式<br>6.表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式<br>7.表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非0,就执行循环体
例:<br>求sum=1+2+……+100<br>用for循环改写
int i,sum=0;<br>for(i=1;i<=100;i++)<br> sum=sum+i;
goto语句
一般形式:<br>goto 语句标号;<br>语句标号由字母、数字和下划线组成,不能使用整数
四种循环结构的区别
它们都可以用来处理同一个问题,一般可以相互代替,不提倡用goto型循环
while和do……while循环,循环体应当包括使循环趋于结束的语句,for语句功能更强,用while完成的,用for都能实现
用while和do……while循环时,循环变量初始化的操作在while和do……while语句之前完成,而for语句可以在表达式1实现循环变量的初始化
while、do……while、for循环,都可以用break语句跳出循环,用continue语句结束本次循环
break语句和continue语句
break语句提前<font color="#ff0000"><b>终止循环</b></font>
例题:<br>在全校1000名学生中进行捐款,当总数达到10万元时结束,<br>统计捐款人数以及平均每人捐款
#include<stdio.h><br>#define SUM 100000<br>int main()<br>{<br> float amount,aver,total;<br> int i;<br> for(i=1,total=0;i<=1000;i++)<br> {<br> printf("输入捐款\n");<br> scanf("%f",&amount);<br> total=total+amount:<br> if (total>=sum) break;<br> }<br> aver=total/i;<br> printf("num=%d\n,aver=%10.2f\n",i,aver);<br> return 0;<br>}
用continue语句<b><font color="#ff0000">提前</font></b>结束本次循环<br>有时并不想<b><font color="#ff0000">终止整个循环</font></b>,而只是<font color="#ff0000"><b>提前结束本次循环</b></font>,<br>而接着执行下一次循环,这是可以用<font color="#ff0000"><b>continue</b></font>语句。<br>
例题:<br>输出100-200之间不能被3整除的数
void main()<br>{<br> int i;<br> for(i=100;i<=200;i++)<br> {<br> if(i%3==0)<br> continue;<br> printf("%d\t",i);<br> }<br>}
break语句和continue语句的区别
<b><font color="#ff0000">continue语句</font></b>只<b><font color="#ff0000">结束本次循环</font></b>,而不是终止整个循环的执行<br><b><font color="#ff0000">break语句结束整个循环过程,</font></b>不在判断循环的条件是否成立
循环嵌套
一个循环体内又包含一个完整的循环结构,称为循环嵌套
内嵌的循环中还可以嵌套循环,这就是多层循环
例题:<br>输出下面的图形<br> *****<br> *****<br> *****<br> *****<br> *****
void main()<br>{<br> int i,j;<br> for(i=1;i<=5;i++)<br> {<br> for(j=1;j<=5;j++)<br> printf("*");<br> printf(""\n);<br> }<br>}
例题:<br>输出下面图形<br> *<br> ** <br> ***<br> ****<br> *****
void main()<br>{<br> int i,j;<br> for(i=1;i<=5;i++)<br> {<br> for(j=1;j<=i;j++)<br> printf("*");<br> printf("\n");<br> }<br>}
例题:<br>输出下面图形<br> *<br> **<br> ***<br> ****<br> *****
void main()<br>{<br> int i,j;<br> for(i=1;i<=5;i++)<br> {<br> for(j=1;j<=5-i;j++)<br> printf(" ");<br> for(j=1;j<=i;j++);<br> printf("*");<br> printf("\n");<br> }<br>}
例题:<br>输出下面图形<br> *<br> ***<br> *****<br>*******<br> *****<br> ***<br> *
void main()<br>{<br> int i,j;<br> for(i=1;i<=4;i++)<br> {<br> for(j=1;j<=4-i;j++)<br> printf(" ");<br> for(j=1;j<=2*i-1;j++);<br> printf("*");<br> printf("\n");<br> }<br> for(i=1;i<=3;i++)<br> {<br> for(j=1;j<=i;j++)<br> printf(" ");<br> for(j=1;j<=x*(4-i)-1;j++)<br> printf("*");<br> printf("\n");<br>}<br>}
循环常用算法分析
累加
例:求1+2+3+......+n<br>分析:求多项式之和,首先得设置一个累加器sum存放结果<br>sum=0 sum=sum+1 sum=sum+i<br>整个过程一直在重复执行sum=sum+i,一共重复n次
累乘
例:求10!
int main()<br>{<br> int i,j;<br> long jc=1;<br> for(i=1.i<=10,i++)|<br> jc=jc*i;<br> printf("jc=%id\n",jc);<br> return 0;<br>}<br><br>
例:求1!+2!+3!+4!+5!
#include <stdio.h><br>void main()<br>{<br> int i,j,sum=0,jec=1;<br> for(i=1,i<=5,i++)<br> jec=jec*i;<br> sum=sum+jec;}<br> printf("%d\n",sum)<br>}
求最值
迭代法
例:求斐波那契数列的前40个数。这个数列的特点<br>第1,2个数为1,1.从第三个数 开始,该数是前两个数之和<br>F1=1 (n=1)<br>F2=2 (n=2)<br>Fn=Fn-1+Fn-2 (n>=3)
void main()<br>{<br> int i,F1=1,F2=2,F3=0;<br> printf("%d\t,%d\t",F1,F2);<br> for(i=1,i<=38,i++)<br> {<br> F3=F1+F2;<br> printf("%d\t",f3);<br> F1=F2;<br> F2=F3;<br> }<br>}
素素问题
素素就是质数,一个大于1且只能被1和它本身整除的整数<br>例:输入一个大于3的整数n,判断它是否是素数<br>思路:<br>让n被i整除(i的值从2变到n-1)<br> 如果n能被2~(n-1)之中任何一个数整除,则表示n肯定不是素数,<br>不必再进行后面的操作,可以用break提前结束循环
void main()<br>{<br> int,i,n;<br> scanf("%d",&n);<br> for(i=2;i<=n-1;i++)<br> if(n%i==0)<br> {<br> printf("%d不是素数",n);<br> break;<br> }<br> if(i==n)<br> printf("%d是素数\n",n);<br>}
求100~200间的全部素数
void main()<br>{<br> int,i,n;<br> for(i=100;i<=200;i++)<br> {<br> for(n=100;n<=i-1;n++)<br> if(i%n==0)<br> break;<br> if(i==n)<br> printf("%d\n",n);<br> }<br>}
穷举法
水仙花数<br>设一个三位数可以表示为abc,若其能满足条件a^3+b^3+c^3=abc,<br>则称其为水仙花数,例如153。 153=1^3+5^3+3^3<br>例:编程求出所有得到水仙花数
void main()<br>{<br> int i,a,b,c;<br> for(i=100;i<=999;i++)<br> {<br> a=i%100;<br> b=i/10%10;<br> c=i%10;<br> if(a*a*a+b*b*b+c*c*c=i)<br> printf("%d\n",i);<br> }<br>}
例:百元买百鸡<br>公鸡五元一个,母鸡三元一个,小鸡一元三个
void main()<br>{<br> int ,i,j,k,a;<br> for (i=1,i<=20;i++)<br> for(j=0;j<=34:j++)<br> for (k=0,k<=100;k++)<br> if(i+k+j==100&&i*5+i*3+k/3==100&&k%3==0)<br> printf("%\t,%d\t,%d\t\n",i,j,k);<br>}
字符统计
例:输入一个字符,分别统计出其中的英文字母、空格<br>数字和其他字符的个数
void main()<br>{<br> int z=0,s=0,k=0,q=0;<br> char ch;<br> ch=getchar();<br> while (ch!='\n')<br> {<br> if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')<br> z++;<br> else if(ch==' ')<br> k++;<br> else if (ch>='0'&&ch<='q")<br> s++;<br> else<br> q++;<br> ch=getchar();<br> }<br> printf("%d\t,%d\t,%d\t,%d\t\n",z,k,s,q);<br>}
译密码
例:输入一行字符,输出相应的密码
void main()<br>{<br> char ch;<br> ch=getchar();<br> while (ch!='\n')<br> {<br> if(ch>='w'&&ch<='z'||ch>='W'&&ch<='Z')<br> ch=ch+4-26;<br> else<br> ch=ch+4;<br> printf("%c",ch);<br> ch=getchar();<br> }<br>}
数组
一维数组
怎么定义一维数组
数组是一组有序数据的集合,数据中各组数据的排列是有一定规律的,<br>下表代表数据在数据中的型号<br>
数组中的每一个元素都属于同一个数据类型
<font color="#ff0000"><b>数组必须先定义后使用</b></font>
定义一维数组的一般形式为:<br><font color="#ff0000"><b>类型符 数组名[常量表达式]</b></font>
数组名的命名规范和变量名相同<br>如: int a[10]<br>int 每个元素的数据类型<br>a 数组名<br>10 数组长度<br>10个元素 a[0],a[1],a[2],........,a[9]
怎么引用一维数组元素
引用数组元素的表达式为<br><font color="#ff0000"><b>数组名 [下标]<br></b></font>
<font color="#ff0000"><b>注意:<br></b></font>只能引用数组元素而不能一次整体调用整个数组全部元素的值
实现数组的复制<br>void main()<br>{<br> int a[10]={1,2,3,4,5,6,7,8,9,10},b[10];<br> for (i=0;i<10;i++)<br> {<br> b[i]=a[i];<br> printf("%d",b[i]);<br>}<br>}
一维数组的赋值
给数组赋值的方法
用赋值语句对数组元素逐个赋值
采用初始化赋值
动态辅助(scanf())
一维数组的初始化
数组初始化赋值是指:<br> 在数组<font color="#ff0000"><b>定义时给数组元素赋予初值</b></font>,数组初始化是在<font color="#ff0000"><b>编译阶段进行的</b></font>。这样减少运行时间,提高效率
一般形式<br><font color="#ff0000"><b>类型说明符 数组名[常量表达式]={值,值,值,........,值}</b></font><br>其中<b><font color="#9c27b0">{}</font></b>中的各数据值即为各元素的初值,各值之间用<font color="#9c27b0"><b>,</b></font>隔开<br>如 int a[10]={0,1,2,3,4,5,6,7,8,9};
说明
可以对全部数组元素赋值<br>如 int a[10]={0,1,2,3,4,5,6,7,8,9};<br>
可以只给一部分元素赋值<br>如 int a[10]={0,1,2,3,4};<br>只给前面5个元素赋值,后5个元素为0<br>
如果想使一个数组中全部元素为0,可以写成<br>如 int a[10]={0,0,0,0,0,0,0,0,0,0};或如 int a[10]={0};<br>不能写成a[10]=0
在对全部数组元素赋值时,可以不指定数组长度<br>如 int a[10]={0,1,2,3,4,5,6,7,8,9};<br>可以写成如 int a[]={0,1,2,3,4,5,6,7,8,9};
一维数组的动态赋值
可以在程序执行过程中,对数组做动态赋值。<br>这时可以用循环语句配合scanf函数逐个对数组赋值<br>for (i=0;i<10;i++)<br> scanf("%d",&a[i]);
一位数组程序举例
例1:对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9<br>要求按逆序输出
void main()<br>{<br> int i,a[10];<br> for(i=0;i<=9;i++)<br> a[i]=i;<br> for(i=9;i>=0;i--)<br> printf("%d",a[i]);<br> printf("\n");<br> return 0;<br>}
例2:将数组中的第一个元素与最后一个交换,<br>第二个元素与倒数第二个交换,依次类推
void main()<br>{<br> int ,i,t,a[10];<br> for (i=0;i<=9;i++)<br> a[i]=i;<br> for(i=0;i<10/2;i++)<br> {<br> t=a[i];<br> a[i]=a[9-i];<br> a[9-i]=t;<br> }<br> for(i=0;i<=9;i++)<br> printf("%d",a[i]);<br>}
例3:求一维数组中最大元素及其下标
#define N<br>void main()<br>{<br> int score[N],i,max,m;<br> for(i=0;i<n;i++)<br> {<br> scanf("%d",&score[i]);<br> printf("%4d",score[i]);<br> }<br> max=score[0];<br> m=0;<br> for(i=0;i<N;i++)<br> {<br> if (score[i]>max)<br> {<br> max=score[i];<br> m=i;<br> }<br> }<br> printf("最大值是%d\n,最大值下标是%4d\n",max,m);<br>}
例4:用数组处理斐波那契数列问题
#define N 40<br>void main()<br>{<br> int f[N],i;<br> f[0]=f[1]=1;<br> printf("%d\n,%d\n",f[0],f[1]);<br> for (i=2;i<N;i++)<br> {<br> f[i]=f[i-1]+f[i-2];<br> printf("%d\n",f[i]);<br> }<br>}
二维数组
二维数组的定义
类型说明符 数组名[常量表达式] [常量表达式]<br>int a[3] [4];<br>说明了一个三行四列的数组,数组名为a,类型是整型<br>
我们可以把二维数组看做是一种特殊的一维数组:他的元素又是一维数组
二维数组在内存中的存放
二维数组在概念上是二维的,但是实际的硬件存储确实连续偏址的,<br>也就是说<font color="#ff0000"><b>存储器单元是接受按一维线性排列的</b></font>。二维数组是按行排列,<br>放完一行之后顺序放第二行
二维数组的引用
一般形式<br>数组名 [下标] [下标]<br><b><font color="#ff0000">下标可以是整数表达式,</font></b>a[2] [3],a[2-1] [2*2-1]<br><b><font color="#ff0000">下标值应该在已定义的数组大小的范围内</font></b><br><br>
二维数组的初始化
分行给二维数组赋初值<br>int a[3] [4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
将所有数据写在一个华括弧内,按数组排列的顺序对各元素赋初值<br>int a[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12}<br>
可对部分元素赋初值<br>int a[3] [4]={{1},{2},{3}}<br>是对每一行的第一列元素赋值,未赋值的元素取0,<br>各元素的值为<br>1 0 0 0<br>2 0 0 0<br>3 0 0 0<br>
二维数组程序举例
例1:<br>有一个3*4的矩阵,求出最大值以及他的行号和列号
void main()<br>{<br> int i,j,row,colum,max;<br> int a[3] [4]={{1,2,3,4},{9,8,7,6},{-10,-10,5,2}};<br> max=a[0] [0];<br> row=0;<br> colum=0;<br> for (i=0;i<=2;i++)<br> for(j=0;j<=3;i++)<br> if(a[i] [j]>max)<br> {<br> max=a[i] [j];<br> row=i;<br> colum=j;<br> }<br> printf("max=%d,row=%d,colum=%d\n",max,row,colum);<br>}
例2:<br>将一个二维数组行和列的元素互换,存到另一个二维数组中<br>a=1 2 3 b=1 4 <br> 4 5 6 2 5<br> 3 6
int main()<br>{<br> int a[2] [3]={{1,2,3},{4,5,6}};<br> int b[3] [2],i,j;<br> printf("矩阵a是:\n");<br> for (i=0;i<=1;i++);<br> {<br> for (j=0;j<=2;j++)<br> {<br> printf("%5d",a[i] [j]);<br> b[i] [j]=a[i] [j];<br> }<br> printf("\n");<br> }<br> printf("矩阵b是\n");<br> for (i=0;i<=2;i++)<br> {<br> for (j=0;j<=1;j++)<br> printf("%5d",b[i] [j]);<br> printf("\n");<br> }<br> return 0;<br>}
例3:<br>有一个3*4的矩阵,要求将矩阵第一行与第三行对应元素减缓位置
void main()<br>{<br> int a[3] [4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};<br> int i,j,t;<br> printf("矩阵a是\n");<br> for(i=0;i<=2;i++)<br> {<br> for(j=0;j<=3;j++)<br> printf("%5d",a[i] [j]);<br> printf("\n");<br> }<br> for(i=0;i<=3;i++)<br> {<br> t=a[0] [j];<br> a[0] [j];<br> a[2] [i]=t;<br> }<br> printf("交换后::\n");<br> for(i=0;i<=2;i++)<br> {<br> for(j=0;j<=2;j++)<br> printf("%5d",a[i] [j]);<br> printf("\n");<br> }
例4:<br>求两个矩阵之和
void main()<br>{<br> int i,j,c[4] [4];<br> int a[4] [4]={{1},{2},{3},{4}};<br> for (i=0;i<4;i++)<br> {<br> for (j=0;j<4;j++)<br> c[i] [j]=(a[i] [j]+b[i] [j]);<br> }<br> for(i=0;i<4;i++)<br> {<br> for (j=0;j<4;j++)<br> printf("%5d",c[i] [j]);<br> printf("\n")<br> }<br>}
字符数组
字符数组的定义<br>
用来存放字符数据的数组。<br>字符数组中一个元素存放一个字符
定义形式<br>char c[10];<br><br>
字符数组也可以是二维或多维数组
字符数组的初始化
逐个字符赋给数组中的各元素<br>char c[10]={'a',' ','c','d','e','f','g','b','q','r'};
如果花括号中提供的初值个数大于数组长度,则语法错误;<br>如果初值个数小于数组长度,只将这些字符赋给数组中前面那些元素,<font color="#ff0000"><b>其余为'\0'<br></b></font>
例如:<br>char c[10]={'a',' ','b','c','d','e','f','g','h'}<br>则c[0]='a',c[1]=' ',c[2]='b',c[3]='c',c[4]='d',c[5]='e'<br>c[6]='f',c[7]='g',c[8]='h',c[9]='\0'<br>
如果提供的初值个数与预定的数组长度相同,在定义时可以省略各数组长度,系统会自动<br>根据初值个数确实数组长度 char c[ ]={'a','b','c','e'}
可以定义二维数组
例:输出一个字符串<br>void main()<br>{<br> char c[5]={'b',' ','o',' ','y'};<br> int i;<br> for (i=0;i<10;i++)<br> printf("%c",c[i]);<br> printf("\n");<br>}
字符串和字符串结束标志
在c语言中<font color="#ff0000"><b>没有专门的字符串变量</b></font>,通常用一个<font color="#ff0000"><b>字符数组</b></font>来存放一个字符串,有时,人们关心的是<font color="#ff0000"><b>有效字符串的长度</b></font>而不是<font color="#ff0000" style="font-weight: bold;">字符数组的长度</font><br><font color="#ffffff">例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定可一个</font><font color="#ff0000"><b>字符串结束标志</b></font><font color="#ffffff">,以字符'</font><font color="#ff0000"><b>\0</b></font><font color="#ffffff">'代表</font>
可以把<b><font color="#ff0000">一个字符串</font></b>直接赋给一个字符数组所表示的变量,<font color="#ff0000"><b>已初始化字符数组</b></font><br>如 charc[]={"I am happy"}; 或者 char c[]="I am happy";<br><b><font color="#ff0000">注意:<br></font></b>这里不用单个字符作为初值,而是用一个字符串作为初值。数组c的长度不是10,而是11,<font color="#ff0000"><b>字符串常量的最后由系统加上一个'\0'</b></font>
用字符串赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'<br>
例:分析 char c[10]={"china"};在内存中的存储<br>c h i n a \0 \0 \0 \0 \0
字符数组的输入输出
逐个字符输入输出。用格式符"%c"输入或输出一个字符
将整个字符串一次输入或输出。用"%s"格式符,意思是对字符串的输入输出<br>char c[]={"china"};<br>printf("%s",c);只输出"china"5个字符
说明
用"%s"格式符输出字符串时,<font color="#ff0000"><b>printf函数中的输出项是字符数组名</b></font>,而不是数组元素名或&
如果数组长度大于字符串实际长度,也只遇到'\0'结束
输出字符不包括结束符'\0'
如果一个字符数组中包含一个以上的'\0',则遇到第一个'\0'输出就结束
可以用scanf函数输入一个字符串<br>char c[20];<br>scanf("%s",<font color="#ff0000"><b>c</b></font>);<br>如果利用scanf输入多个字符串,则以空格分隔<br>char a[5],b[5],c[5];<br>scanf("%s%s%s",a,b,c);<br>输入数据: How are you ?
数组首地址<br><b><font color="#ff0000">数组名</font></b>代表了<font color="#ff0000"><b>该数组的首地址</b></font>。整个数组是以首地址开头一块的内存单元
字符串处理函数
用于输入输出的字符串函数,在使用之前应包含头文件"stdio.h",使用其他字符串函数则应包含头文件"string.h"。
puts(str)
作用:<br>将一个字符串(以'\0'结束的字符序列)输出列到终端<br>char str[]={"china\nbeijing"};<br>puts(str);<br>输出 china<br> beijing
puts函数可以使用转义字符<br>puts函数可以由printf函数取代,<br>当需要按一定格式输入时,通常用printf
gets(str)<br>
作用:<br>从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址<br>如 gets(str)<br>从键盘输入 computer(回车)
<b><font color="#ff0000">注意:<br></font></b>用gets和puts函数只能输入或输出一个字符串<br>不能写成<br>puts(str1,str2)或gets(str1,str2)
当输入的字符串含有空格时,输出仍为全部字符串。<br>说明<b><font color="#ff0000">函数并不以空格作为字符串输入结束的标志</font></b>,而只以<font color="#ff0000"><b>回车作为输入结束</b></font><br>这是与scanf函数不同的。
strcat()
格式:<br>strcat(字符数组名1,字符数组名2)
功能:把<b><font color="#ff0000">字符数组2</font></b>中的字符串<font color="#ff0000"><b>连接到字符数组1中字符串的后面</b></font>,<br>并<b><font color="#ff0000">删除</font></b>字符串1后的标志位'<b><font color="#ff0000">\0</font></b>',结果<b><font color="#ff0000">放在字符数组1中</font></b>。
字符数组1应定义足够的长度,否则不能全部装入被连接的字符串
gets() puts() strcat()的使用<br>
#include<string.h><br>int main()<br>{<br> char st1[30]="my name is";<br> char st2[10];<br> printf("输入你的名字:\n");<br> gets(st2)<br> strcat(st1);<br>}
strcpy
格式:<br>strcpy(字符数组名1,字符数组名2)<br>
功能:<br>把字符数组2中的字符串拷贝到字符数组1中。穿结束标志"\0"也一同拷贝。<br>字符数组2也可以是一个字符串常量
例:<br>#include<stdio/h><br>main()<br>{<br> char st1[15],str2[]="c language";<br> strcpy(st1,st2);<br> puts(st1);<br> printf("\n");<br>}<br><b><font color="#ff0000">字符数组1应该有足够的长度</font></b>
说明:<br>可以用strcpy()函数将字符串2中前面若干个字符复制到字符数组1中去
strupr()
格式:<br>strupr(字符串)
功能:<br>将字符串中小写字母转换成大写字母
数组注意问题
引用数组应该用<font color="#ff0000"><b>[]</b></font>
数组元素可以使用最大下标<br>int i,a[10]={1};<br>for(i=1i<10;i++)<br> printf("%d",a[i]);
二维数组和多维数组的定义 和引用<br>int a[4][5]
用scanf函数向字符数组输入数组,<font color="#ff0000"><b>不能加&</b></font><br>char a[20];<br>scanf("%s",a)<br>用scanf函数向数值型数组输入数据,<font color="#ff0000"><b>要加&</b></font>
误以为数组名代表数组全部元素<br>int a[4]={1,3,5,7},b[4];<br>b=a; 这是错误的
字符数组的初始化和赋值<br>char str[10]="china" 这是正确的<br>char str[4];str="china" 这是错误的
混淆字符和字符串的表现形式<br>char sex;<br>sex="m";<br>这是错误的,m是字符串,后面还有\0
数组的应用
数组的排序
选择法排序
冒泡法
数组中元素的插入和删除
查找
顺序查找
求二维数组的鞍点
按行求出各行最大的元素位置,某行最大元素与该元素所在列的所有元素比较,<br>判断是否是最小元素,是则是鞍点,否则不是
函数
函数
<b><font color="#ff0000">函数</font></b>就是<b><font color="#ff0000">功能</font></b><br>每一个函数用来实现一个特定的功能<br>函数的名字反映其代表的功能<br>int max(int x,int y) //求最大值
程序可由<font color="#ff0000"><b>一个主函数和若干个其他函数构成</b></font>
同一个<b><font color="#ff0000">函数</font></b>调用<font color="#ff0000"><b>可以被一个或多个函数调用任意多次</b></font>(除了主函数)
例:<br>输出一下结果,用函数调用实现<br>****************<br>how do you do!<br>****************
#include<stdio.h><br>int main()<br>{<br> void print_star(); /*声明<br> void print_message(); 函数*/<br> print_star(); /*函数<br> print_message();<br> print_star(); 调用*/<br> return 0;<br>}<br> void print_starc() //函数定义<br>{<br> printf("****************\n";) //输出16个*<br>}<br> void_message()<br>{<br> printf("how do you do!\n";) //输出 how do you do!<br>}
说明
一个<font color="#ff0000"><b>c程序由一个或多个程序模块</b></font>组成,<b><font color="#ff0000">每一个程序模块作为一个源程序文件</font></b><br>若干个源程序文件组成一个c程序<br>一个源程序文件可以为多个c程序共用
一个源程序文件由一个或多个函数以及其他有关内容组成<br>一个源程序文件是一个编译单位,在程序编译时<b><font color="#ff0000">以源程序文件为单位</font></b>,进行编译的,不是以函数为单位
c程序的执行是从main函数开始,到main函数结束
所有函数都是平行的,即在定义时是分别进行的,是互相独立的<br><b><font color="#ff0000">函数不能嵌套定义<br></font></b><b><font color="#ff0000">函数间可以相互调用,</font></b>但是不能调用main函数<br><b><font color="#ff0000">main函数</font></b>是被<font color="#ff0000"><b>操作系统调用的</b></font><br>
从声明角度看,函数有两种:<br>1.库函数<br>2.用户自己定义的函数<br>从函数的形式看,分两类:<br>1.无参函数<br>2.有参函数
函数的定义
无参函数的定义
类型标识符 函数名() //函数头<br>{ //函数体<br> 声明部分<br> 语句<br>}
void printsar()<br>{<br> printf("******\n";)<br>}
有参函数的定义
类型标识符符 函数名(形式参数列表)<br>{<br> 声明部分<br> 语句<br>}
int max(int x,int y)<br>{<br> int z;<br> z=x>y?x:y;<br> return (z);<br>}
定义空函数
类型名 函数名()<br>{}
例:<br>编写一个求阶乘的函数,求5!+6!+7!
#include<stdio.h><br>int main()<br>{<br> int fac(int n); // 函数的原型声明<br> int i,a,b,c;<br> a=fac(5):<br> b=fac(6);<br> c=fac(7);<br> printf("5!+6!+7!=%d\n",a+b+c);<br>}<br> int fac (int n) //函数的定义<br>{<br> int i,f=1;<br> for(i=1;i<n;i++)<br> f=f*i;<br> return f;<br>}
例:<br>求两个整数中的较大者
#include<stdio.h><br>int main()<br>{<br> int max(int x,int y); //函数的原型声明<br> int a,b;<br> scanf("%d,%d",&a,&b);<br> printf("%d是最大值i\n",max(a,b); //函数的调用<br>}<br> int max(int x,int y) //函数的定义<br>{<br> int m;<br> if(x>y)<br> m=x;<br> else<br> m=y;<br> return m;<br>}
函数的调用
函数调用的形式<br><b><font color="#ff0000">函数名(实参表列)</font><br></b>
如果调用无参函数,则“实参表列”可以没有,但是括号不能省略<br>如果实参表列包含多个实参,则各参数之间用逗号隔开。c=max(a,b)
三种函数调用形式
函数调用语句
把函数调用单独作为一个语句 如:print_star()<br>这是不能要求函数带回值,只要求函数完成一定的操作
函数表达式
函数调用出现在另一个表达式中,如c=max(a,b);<br>这是要求函数带回一个确定的值以参加表达式的运算
函数参数
函数调用作为另一个函数调用时的实参,如m=max(a,max(b,c));<br>其中max(b,c)是一次函数调用,他的值作为max另一次调用的实参
函数调用时的数据传递
在调用有参函数时,主调函数和被调函数之间有<font color="#ff0000"><b>数据传递关系</b></font><br>定义函数时函数 名后面的变量名称为“<font color="#ff0000"><b>形式参数</b></font>”<br>主调函数调用一个函数时,<font color="#ff0000"><b>函数名后面函数称为实际参数</b></font><br>实际参数可以是常量、变量或表达式
函数调用的过程
在定义函数中指定的形参,在<font color="#ff0000"><b>未出现函数调用时,他们并不占内存中的存储单元</b></font>。<br>在发生函数调用时,函数max的形参被临时分配内存单元
实参与形参的<font color="#ff0000"><b>类型应相同或赋值兼容</b></font>
C语言规定,实参变量对形参变量的数据传递是<font color="#ff0000"><b>值传递(即单向传递)</b></font>,只由实参传给形参,<br>不能由形参传回实参。在内存中,<b><font color="#ff0000">实参单元与形参单元是不同的单元</font></b>
调用结束,形参单元被释放<br>实参单元维持原值,没有改变<br>如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值<br>
函数的返回值
通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数返回值)
函数的返回值是通过函数中的<b><font color="#ff0000">return语句</font></b>获得的<br>一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个就起作用<br>return 表达式 ;或return (表达式);<br>return后面的值可以是一个表达式 return(x>y?x:y);<br>如果被调用函数中<b><font color="#ff0000">没有return语句</font></b>,说明<b><font color="#ff0000">没有希望得到函数值</font></b>。<br>为了明确表示“不常回值”,可以用<b><font color="#ff0000">void</font></b>定义函数<font color="#ff0000"><b>无类型</b></font>,此时函数中<font color="#ff0000"><b>不能有return语句</b></font><br><b><font color="#ff0000">函数值的类型</font></b>和函数<b><font color="#ff0000">定义中函数的类型应保持一致</font></b>。如果函数值的类型和return语句中表达式的值不一致,以<b><font color="#ff0000">函数类型为准</font></b><br>不加类型说明的函数,自动按整型处理
被调用函数的声明和函数原型声明
一个函数调用另一个函数应具备以下条件:<br>1.被调研函数必须是已经定义的函数<br>2.如果用库函数,应该在本文件开头加上#include指令<br>3.如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明
函数的嵌套与递归
函数的嵌套与递归
C语言的函数定义是相互平行的,独立的<br>即函数不能嵌套定义,但可以嵌套定义函数<br><b><font color="#ff0000">即调用一个函数的过程中,可以调用另一个函数</font></b>
函数的递归调用
在调用一个函数的过程中,又出现直接或间接地调用该<font color="#ff0000"><b>函数本身</b></font>,称为函数的递归调用
数组作为函数参数
数组元素作为函数参数
数组元素就是变量,他与普通变量并无区别。<br>因此它作为<b><font color="#ff0000">函数实参使用</font></b>与<font color="#ff0000"><b>普通变量时完全相同</b></font>的,在发生函数<font color="#ff0000"><b>调用</b></font>时,<br>把作为<b><font color="#ff0000">实参的数组元素的值传递给形参</font></b>,实现<font color="#ff0000"><b>单向的值</b></font>传送
数组名做函数参数
用数组名做函数实参时,向形参传递的是数组<font color="#ff0000"><b>首元素</b></font>的地址
说明:<br>用数组名与数组元素做函数参数不同点
1.用数组元素作为实参时,对数组元素的处理是按普通元素对待的。<br><b><font color="#ff0000">用数组名做函数参数时,这要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组声明</font></b>
2.在函数调用时发生的值传递是把实参变量的值赋予形参变量。<br>在用数组名作函数参数时,不是进行值得传送,<font color="#ff0000"><b>而是把实参数组的首地址回赋予形参数组</b></font>
用多维数组名作函数参数
多维数组元素与一维数组一样,可以看做一个变量,所以在调用函数时可以作为实参,进行值得传递
用<b><font color="#ff0000">多维数组</font></b>作为函数参数传递的是数组<b><font color="#ff0000">首元素的地址</font></b>,要求形参是<b><font color="#ff0000">相同类型的同维数组</font></b>。<br>这里,形参是二维数组时,<font color="#ff0000"><b>第二维的大小(长度)必须指明,而第一维的大小(长度)随便</b></font><br>int array[3][10] 或 int array[][10]
字符数组名做函数参数
用字符数组名做函数参数传递得到是数组首元素的地址
变量的作用域
变量的作用域
在程序中能对变量进行<font color="#ff0000"><b>存取操作的范围</b></font>称为<font color="#ff0000"><b>变量的作用域</b></font><br>变量分为局部变量和全局变量
<b>C语言</b>
C语言的特点
语言简洁,紧凑,使用方便灵活。32个关键字,9种控制语句,程序形式自由。
丰富的运算符和数据类型,具有现代语言的各种数据结构。
具有结构化的控制语句,是完全模块化和结构化的语言。
能直接访问物理地址进行位操作,可以直接对硬件进行操作。
程序可移植性好(与汇编语言相比)。
C语言允许使用的两种注释方式
// :单行注释
/* ......*/:多行注释
C语言程序的结构特点
一个源程序文件包括
预处理指令:#include<stdio.h>
函数定义:每个函数用来实现一定的功能
<font color="#f44336"><b>函数</b></font>是C程序的主要组成部分
一个c程序是由<font color="#f44336"><b>一个或多个</b></font>函数组成的
必须包含一个main函数(只能有一个)
程序总是从<font color="#f44336"><b>main函数开始执行</b></font>,<font color="#f44336"><b>到main函数结束</b></font>
C语言规定,在一个源程序中,<b><font color="#f44336">main</font></b>函数的位置可以任意
一个函数包括两个部分
函数首部
函数体
c程序对计算机的操作由C语句完成
c程序书写格式是比较自由的。
为清晰可见,习惯上每行只写一个语句。
数据声明和语句最后必须有<b>分号</b>。
<b><font color="#f44336">C语言本身不提供输入输出语句。</font></b>
程序应当包含注释,增加可读性。
C语言一行写不下时可以跨行写,但要分两种情况
预处理一行写不下时
把一个预处理指示写成多行时要用“\”换行,因为根据定义,一条预处理指示只能由一个逻辑代码组成
正常程序一行写不下时
把c代码写成多行则不必使用续航符(在任意空白处换行)
<b>算法</b>
一个程序主要包括:<font color="#f44336"><b>对数据的描述(数据结构),对操作的描述(要求计算机进行操作的步骤,也是算法)</b></font>两方面的信息
什么是算法:算法是为了解决问题而执行的一系列步骤
计算机算法分为两大类
数值运算法:求数值解
非数值运算法:用于事务管理
算法的特性
<b><font color="#f44336">有穷性:</font></b>一个算法应该包括有限的操作步骤,而不能无线
<b><font color="#f44336">确定性:</font></b>算法中的每一个步骤都是确定的
<font color="#f44336"><b>有零个或多个输入:</b></font>所谓输入是指在执行算法时需要从外界取得必要的信息
<font color="#f44336"><b>有一个或多个输出:</b></font>算法的目的数为了求解,“解”就是输出,没有输出的算法是无意义的
<b><font color="#f44336">有效性:</font></b>算法中的每一个步骤都应该有效执行,并得到确定结果
<b>常量,变量</b>
C语言的数据类型
基本类型
整型
实型(浮点型)
单精度型
双精度型
枚举型
构造类型
结构体类型
数组类型
共用体构造
空类型(void函数)
常量和符号常量
定义:在执行过程中,其值不发生改变的量称为常量,其值可改变的量称为变量
在程序中,常量是可以不经说明而直接引用的,而变量必须先定义后使用
直接常量(直面常量):可以直接从字面值看出来
整型常量:12/0、-3
实型常量:4.6、-1.23
字符常量'a'、'b'、'2'
符号常量:用标识符代表一个常量,称之为符号常量
符号常量一般格式为:<br>#define 标识符 常量<br>例如:#define PI 3.1415
<b><font color="#f44336">符号常量在使用之前必须先定义</font></b>
符号常量后面不能用<b><font color="#f44336">分号;</font></b>
变量
定义:代表内存中具有特定属性的一个存储单位,用来存放数据,也就是该变量的值
程序编译连接执行时由系统给每个变量各分配内存地址
<b><font color="#f44336">变量必须先定义后使用</font></b>
标识符
定义:在C语言中用来对变量,符号常量,函数,数组等数据对象命名的有效符号序列统称为标识符
标识符命名规范
只能由<font color="#f44336"><b>字母、下划线、数字</b></font>三种字符组成
第一个字符必须为字母下划线
不能使用C语言关键字
<div>1、数据类型关键字(12个):<br>(1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数<br>(3) enum :声明枚举类型 (4) float:声明浮点型变量或函数<br>(5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数<br>(7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数<br>(9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型<br>(11) unsigned:声明无符号类型变量或函数<br>(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)<br><br></div>
2、控制语句关键字(12个):<br> (1) for:一种循环语句 (2) do :循环语句的循环体<br>(3) while :循环语句的循环条件 (4) break:跳出当前循环<br>(5) continue:结束当前循环,开始下一轮循环<br>(6)if: 条件语句<br>(7)else :条件语句否定分支(与 if 连用)<br>(8)goto:无条件跳转语句 (9)switch :用于开关语句<br>(10)case:开关语句分支<br>(11)default:开关语句中的“其他”分支<br>(12)return :子程序返回语句(可以带参数,也看不带参数)<br>
3、存储类型关键字(4个)<br>(1)auto :声明自动变量 一般不使用<br>(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)<br>(3)register:声明寄存器变量 (4)static :声明静态变量<br>
4、其它关键字(4个):<br>(1)const :声明只读变量 (2)sizeof:计算数据类型长度<br>(3)typedef:用以给数据类型取别名(当然还有其他作用<br>(4)volatile:说明变量在程序执行中可被隐含地改变
整型数据
整型常量的表示方法
十进制整数:123、0、-456
八进制整数:以<0>开头,0123<br><b><font color="#f44336">八进制不能有8</font></b>
十六进制整数:以<0x>开头,0x123
整型变量
类型说明符 变量名标识符,变量名标识符,……<br>例如: int a,b,c;(a,b,c为整型变量)<br>long a,b,c;(a.b.c为长整型变量)<br>unsigned p,q;(p,q为无符号整型变量)
<font color="#f44336"><b>注意:</b></font><br>1.允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用<font color="#f44336"><b>逗号</b></font>间隔。类型说明符与变量名之间至少用<font color="#f44336"><b>一个空格</b></font>间隔。<br>2.最后一个变量名之后必须以“<b><font color="#f44336">;</font></b>”结尾。<br>3.<font color="#f44336">变量定义必须放在变量使用之前。</font>一般放在函数体的开头部分。
浮点型数据
实型常量的表示方法
实数,又称浮点数,十进制小数形式,如0..123.、123.、123.0、0.0
浮点型变量的分类
单精度float<br>有效数字:6<br>字节数:4<br>数的范围:0以及1.2*10的-38次方~3.4*10的38次方<br>
双精度double<br>有效数字:15<br>字节数:8<br>数的范围:0以及2..3*10的-308次方~1.7*10的308次方
长双精度型long double<br>有效数字:19<br>字节数:16<br>数的范围:0以及3.4*10的-4932次方~1.1*10的4932次方
指数形式:数字+e(E)+整数<br>如123e3=123*10^3
<b><font color="#f44336">字母e(E)之前必须有数字,且e后面的指数必须是整数</font></b>
字符型数据
字符常量
定义:用<b><font color="#f44336">单引号''</font></b>括起来的一个字符是字符型常量
只能包含<font color="#f44336"><b>一个字符</b></font><br>如'a','A','#','?','6'
<b><font color="#f44336">说明:<br></font></b>'A','a'是不同的字符常量<br>字符常量只能用<font color="#f44336"><b>单引号</b></font>括起来,不能用双引号或其他括号<br>字符常量只能是<b><font color="#f44336">单个字符</font></b>,不能是字符串。
字符常量转义字符:以“\”开头的特殊字符<br>(<b><font color="#f44336">转义字符只能使用小写字母,每个转义字符只能看做一个字符</font></b>)<br>\n 换行,将当前位置移到下一行开头<br>\t 水平制表,跳到下一个tab位置,8位为一个tab位置<br>\b 退格,将当前位置移到前一列<br>\r 回车,将当前位置移到本行开头<br>\f 换页,将当前位置移到下一页开头<br>\\ 反斜杠字符"\",输出单个\<br>\' 单撇号字符,输出单个'<br>\" 双撇号字符,输出单个"<br>\ddd 1-3位八进制所代表的的字符<br>\xhh 1-2位十六进制所代表的的字符<br>\a 响铃<br>\v 垂直制表vt<br>\? 问号字符<br>\0 空字符<br><font color="#f44336"><b>除了\r,其余转义字符的跳格,会取代原来屏幕上该位置显示的字符</b></font>
字符串常量
字符串常量是一对“双引号”括起来的字符序列<br>"how are you?" "china"A
C规定:在每个字符串的结尾加一个“字符串结束标志\0”,以便系统据此判断字符串是否结束
在内存中字符串存储为:字符串+'\0'<br>书写时不必加'\0',系统会自动加上'\0'
字符变量
字符变量用来存放字符常量,但只能存放一个字符。<br>字符变量的定义形式如下<br>char c1,c2;<br>它表示c1和c2为字符型变量,各可以放一个字符<br>c1='a',c2='b';
字符数据在内中的存储形式及其使用方法
将一个字符放到一个字符变量中,<br>在内存单元中,是将该字符的相应的ASCII代码放到存储单元中
函数strlen:计算给定字符串的长度,不包括“\0”在内
例如:表达式strlen("\x69\082\n")的值是1
运算符与表达式
变量赋初值
一般形式<br>类型说明符 变量1=值1,变量2=值2,……
int a=3; <font color="#f44336">/* 指定a为整型变量,初始值为3 */</font><br>float f=3.14; <font color="#f44336">/* 指定f为实型变量,初值为3.14*/</font><br><b>也可以使被定义的变量的一部分赋初值</b><br>int a,b,c=5;<br><b>如果对几个变量赋予初值为3,应写成</b><br>int a=3,b=3,c=3;
各类数值型数据间的混合运算
整数、实数、字符型数据可以混合运算<br>10+'a'+15-8768.123*'b'<br>
若参加运算的类型不同,则先转换成同一类型在进行计算
转换按数据长度增加的方向进行,以保证精度不降低
所有的浮点运算都是以双精度(double)进行的
char型和short型参与运算时,必须先转换为int型
<font color="#f44336"><b>在赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型转换为左边量的类型</b></font><br>int a=3.2 a=3
<font color="#f44336"><b>只要有double类型,运算结果也为double类型</b></font>
算数运算符和算数表达式
C语言运算符简介<br>
算数运算符 + - * / %<br>关系运算符 > < == >= <= !=<br>逻辑运算符 ! && ||<br>位运算符 << >> ~ | ^ &<br>赋值运算符 =及其扩展运算符<br>条件运算符 ? :<br>逗号运算符 ,<br>指针运算符 * &<br>长度运算符 sizeof<br>强制类型转换运算符 (类型)<br>分量运算符 . -><br>下标运算符 [ ]<br>其他 如函数调用运算符( )
算数运算符和表达式
基本的算数运算符<br>+ - * /
<b><font color="#f44336">两个整数相除的结果为整数<br></font></b>5/3结果为1,舍去小数部分
<b><font color="#f44336">如果两个数有一个小数,结果为小数</font></b><br>5.0/2=2.5
除数或被除数中有一个为负值,舍入方向不固定
%运算符:称为求余运算符
<font color="#f44336"><b>%两侧均为整型数据</b></font><br>7%4的值为3
<font color="#f44336"><b>对于求余运算,运算结果与第一个数的符号相同</b></font>
一个变量a能被3整除,则写成a%3==0
算数表达式和运算符的优先级与结合性
强制类型转换运算符
含义:用来将一个算数表达式的值转换成所需类型
定义格式<br>(类型名)(表达式)<br>
int i;<br>float j;<br>j=10.01;<br>i=(int)j;<br>把j强制转换成整型赋给i
<font color="#f44336" style="">注意:</font><br>无论是强制转换或是自动转换,都只是为了本次运算的需要而改变量的值<br>进行临时转换,<b><font color="#f44336">而不改变数据说明时对该变量定义的类型</font></b>
自增自减运算
定义格式<br>++a,--a<br>a++,a--<br>含义 a=a+1<br> a=a-1
++a,--a <b><font color="#f44336">在使用之前,先使a的值加1/减1(先加后用</font></b>)<br>a++,a-- <font color="#f44336"><b>在使用之后,使a的值加1/减1(先用后加)</b></font>
<b><font color="#f44336">a++与++a的区别</font></b><br><font color="#9c27b0">a++在使用a之后,使a的值加1,因此执行完a++之后,整个表达式的值为a,而a的值变为a++</font><br>++a在使用a之前,使a的值加1,因此执行完++a后,整个表达式的和a的值均变为a+1
<b><font color="#f44336">注意事项:</font></b><br>自增自减运算只能用于<font color="#ffeb3b">变量</font>,不能用于常量和表达式。如5++,(a+b)++都不合法<br>++和--的结合方向是自右向左<br>
赋值运算符和赋值表达式
赋值运算符 “=”<br>a=3
类型转换
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换
int a;<br>a=6.3<br>a的值为6
将<font color="#00ffff">实型(浮点型)</font>数据赋给<font color="#00ffff">整型变量</font>时,舍弃小数部分
将<font color="#00ffff">整型数据</font>赋给<font color="#00ffff">单双精度变量</font>时,数字不变,但以实数形式存储到变量中
将一个<font color="#00ffff">double型数据</font>赋给一个<font color="#00ffff">float型</font>变量时,截取前面的<font color="#f44336">7位</font>有效数字,存放到float变量的存储单元中
<font color="#00ffff">字符型数据</font>赋给<font color="#00ffff">整型变量</font>时,由于字符只能占一个字节,而整型变量为四个字节,因此将字符数据(8位)放到整型变量低8位中
将一个<font color="#00ffff">int,short,long</font>型数据赋给<font color="#00ffff">char</font>型变量时,只将其低八位原封不动的送到char型变量(即截断)
复合的赋值运算符
在赋值运算符“=”之前加上其他运算符
一般形式为:变量 双目运算符=表达式<br>它等效于 变量=变量 运算符 表达式<br>
a+=3等价于a=a+3<br>x*=y+8等价于 x=x*(x+8)<br>x%=3等价于 x=x%3
赋值表达式
定义:由赋值运算符将一个变量和一个表达式连接起来的式子
一般形式:<br><变量> <赋值运算符> <表达式>
<font color="#ff0000"><b>注意:不能把一个表达式赋给另一个表达式,只能赋给一个变量</b></font>
逗号运算符和逗号表达式
C语言提供一种特殊的运算符——<font color="#ff0000">逗号运算符</font><br>用它将两个表达式连接起来
一般形式:<br>表达式1<font color="#ff0000">,</font>表达式2<br>扩展:表达式1<font color="#ff0000">,</font>表达式2,……<font color="#ff0000">,</font>表达式n
求解过程:根据左结合性,分别求n个表达式的值,并以<font color="#ff0000">表达式n</font>的值作为整个逗号表达式的值<br><b><font color="#ff0000">最右边的值是整个表达式的值</font></b>
a=3*5,a*4 表达式的值为60<br>(a=3*5,a*4),a+5 表达式的值是20
C语言常用的数学函数
abs
功能:求整数x的绝对值
说明:计算|x|,当x不为负时返回x,否则返回-x
fabs
功能:求浮点数x的绝对值
说明:计算|x|,当x不为负时返回x,否则返回-x
ceil
功能:求不小于x 的最小整数
说明:返回x的上限<br>如74.12的上限是75<br>-74..12的上限为-74,返回值为float类型
floor
求不大于x 的最大整数
说明:返回x的下限<br>如74.12的下限是74<br>-74..12的下限为-75,返回值为float类型
pow
功能:计算x 的y次幂
说明:x应大于0,返回幂指数的结果
sqrt
功能:计算x的平方根
说明:x应该大于0
sin
计算x(弧度表示)的正弦值
说明:x的值域为[-1.0,1.0]
格式输出输入
C语句的分类
表达式语句
一般形式:表达式;
例:x=y+z;i++
函数调用语句
一般形式:函数名(实际参数表)
例:printf("C Program");
复合语句
把多个语句用{}括起来组成一个语句
例:{<br>x=y+z;a=b+c;<br>print("%d%d",x,a);<br> }
控制语句
条件判断语句:if switch
循环执行语句:do while,while,for
转向语句:break,goto,continue,return
空语句
只有分号";"组成的语句,什么也不执行,在程序中可做空循环体
赋值语句
一般形式:变量=表达式<br>例 int a;<br> a=5;<br>
说明
在变量说明中给<font color="#1976d2">变量赋初值</font><font color="#ffffff">和</font><font color="#1976d2">赋值语句</font>的区别
1. int a=6,b=6,c=6; /*变量赋初值*/<br>2. int a,b,c; /*变量的定义*/<br> a=6,b=6,c=6; /*赋值语句*/<br>3. int a,b,c; /*变量的定义*/<br> a=b=c=6; /*赋值语句的嵌套*/<br>1.2.3之间等价
<font color="#1976d2">赋值表达式</font>和<font color="#1976d2">赋值语句</font>的区别
赋值表达式可以包括在其他表达式之中,赋值语句不能
if((x>y;)>0) z=x; 错<br>if((x>y)>0) z=x; 对<br>
数据输入输出的概念及实现
<font color="#ff0000"><b>c语句本身不提供输入输出语句</b></font>
输入输出操作是由<font color="#ff0000"><b>C标准函数库的函数</b></font>来实现的
printf();<br>scanf();<br>getchar();<br>putchar();
在使用输入输出函数时,要在程序文件的开头用<b><font color="#ff0000">预编译指令</font></b>
#include<stdio.h>
字符数据的输入输出
putchar函数(字符输出函数)
向终端输出一个字符
一般形式:<br>putchar(字符变量)
getchar函数(字符输入函数)
从键盘上输入一个字符,当输入多个字符时,只取第一个
一般形式:<br>getchar()
格式输出——printf函数
printf函数
作用:按照指定的输出格式,向终端输出若干个任意类型的数据<br>
一般格式:<br>printf(格式控制,输出表列)<br>如printf("%d,%c\n",i,c);
格式控制
用双引号括起来的字符串,它包括两种信息
格式说明,由"%"和格式字符组成,<br>如%d,%f。
格式字符
整数的格式输出
d格式符:输出十进制整数
%d: 按整型数据的实际长度输出
%md: m为指定字段的输出宽度<br>如果数据的位数小于m,则左端补空格<br>如果数据的位数大于m,则按实际位数输出<br>如 printf("%4d",a);
%ld: 输出长整型数据<br>long int a=135790;<br>printf("%ld",a);
%o格式符: 以八进制输出无符号整数
%x格式符:以十六进制输出无符号整数
%u格式符: 输出十进制无符号(unsigned)整数<br>
字符的格式输出
c格式符:用来输出一个字符
s格式符:用来输出一个字符串
%s:按字符串的实际长度输出
%ms:m为指定输出字段的宽度<br>如果字符串长度小于m,左边补空格<br>如果字符串长度大于m,按实际长度输出<br>
%m.ns:输出占m列,只取字符串左端n个字符,<br>输出在右侧,左补空格
%-m..ns:输出在左侧,右补空格。<br>如果n>m,则m自动取n值,输出n个字符
实数的格式输出
<font color="#ff0000"><b>单精度floal有效位:6位<br>双精度double有效位:15位</b></font>
f格式符:用来输出实数,以小数形式输出
%f:系统自动指定宽度,整数部分全部输出,小数部分输出<font color="#ff0000"><b>6位</b></font>
%m.nf:输出占m列,n为小数位,输出在右侧,左端补空格
%-m.nf:输出在左侧,右端补空格<br>如果m小于(整数位数+n),则正常输出,小数部分输出n位
e格式符:以指数形式输出实数
%e:系统自动指定宽度,共13位,小数部分占6位,指数占5位
%m.ne输出占m列,n为小数位,输出在右侧,左补空格
%-m.nf:输出在左侧,右端补空格<br>如果m小于(整数位数+n),则正常输出,小数部分输出n位
%me:没有指定小数位,则小数位6位
g格式符:<br>用来输出实数,输出格式为f格式或e格式,<br>系统会根据数据占宽度m大小,自动选择<br>占宽度较小的某种格式输出,g格式不输出小数点后无意义的0
格式字符归纳
<br>
普通字符,需要原样输出的字符<br>(一般都是说明性文字和逗号,空格等)
输出列表
需要输出的一些数据,可以使变量,也可以是表达式<br><br>
格式输入——scanf函数
scanf函数
一般形式<br>scanf(格式控制,地址列表)<br>地址列表可以是变量的地址(加&)或字符串的首地址
格式声明
以%开始,以一个格式字符结束,中间可以插入<br>附加的字符(如“,”)
格式字符归纳
&a声明
&是一个<font color="#ff0000"><b>取地址</b></font>运算符,&a是<font color="#ff0000"><b>一个表达式</b></font>,其功能是求<font color="#ff0000"><b>变量的地址</b>。</font><br>这个地址是<font color="#ff0000"><b>编译系统</b></font>在内存中给<font color="#ff0000"><b>a变量分配的存储空间地址</b></font>
<font color="#ff0000"><b>变量的值</b></font>和<b><font color="#ff0000">变量的地址</font></b>是两个不同的概念<br>变量的地址是C编译系统分配的<br>变量的地址和变量值关系如下<br>如a=567;a为变量名,567是变量的值<br>&a是变量a的起始地址1001。
使用scanf函数应注意的问题
scanf函数没有精度控制
scanf函数中要求给出变量地址,而不是变量名
若格式控制中没有非格式字符做输入数据之间的间隔,则可以<font color="#ff0000"><b>空格,tab,回车</b></font>做间隔<br>如果有非格式字符,则在输入时,在对应位置上要输入这些字符
在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符
例:scanf("%c%c%c",&c1,&c2,&c3);<br>输入a_b_c<br>输出a_b_ <br>因为把'a'赋给c1,把_赋给c2,'b'赋给c3,因为空格是有效字符
如果%后面有一个“*”附加说明符,表示跳过他指定数列
例:scanf("%2d_%*3d_%d",&a,&b);<br>输入12_345_67<br>系统将12赋给a,<font color="#1976d2">%*3d表示读入3位整数,但不会赋给任何变量</font>,跳过345,将67赋给b
关系运算符和关系表达式
关系运算符
C语言提供6中关系运算符<br>1. < 小于<br>2. > 大于<br>3. <= 小于等于<br>4.>= 大于等于<br>5.== 等于<br>6.!= 不等于<br>1、2、3优先级相同(高)<br>4、5、6优先级相同(低)
算数运算符(+ - * / %)、关系运算符(> < >= <= == !=)、<br>赋值运算符(=)的优先级比较
算数运算符 高<br>关系运算符 ↓<br>赋值运算符 低
关系表达式(左结合性)
定义:用关系运算符将两个表达式连接起来的式子
一般形式:<br>表达式 关系运算符 表达式<br>表达式可以是<br>算数表达式 a+b>c-d <br>逻辑表达式 、关系表达式 (a>b)>(c-d)<br>赋值表达式 (a=3)>(b=5)<br>字符表达式 'a'+1>c
关系表达式的值是一个<font color="#ff0000"><b>逻辑值</b></font>,即<b><font color="#ff0000">真</font></b>或<b style="color: rgb(255, 0, 0);">假</b><br>
C语言编译系统在表示逻辑运算结果时,<font color="#ff0000"><b>1</b></font>代表真,<font color="#ff0000"><b>0</b></font>代表假<br>但是在判断一个量是否为“<b><font color="#ff0000">真</font></b>”时,以“<font color="#ff0000"><b>0代表假</b></font>”,<b><font color="#ff0000">以非零的数值代表真</font></b>
逻辑运算符和逻辑表达式
逻辑运算符
1. && 逻辑与<br>2. || 逻辑或<br>3 ! 逻辑非<br>1、2是双目运算符,3是单目运算符<br>优先级: !→&& →||
a&&b 只有a,b都为真,则a&&b都为真<br>a||b 只要a,b有一个为真a||b为真<br>!a 若a为真,则!a为假
如a=7,b=8,c=9,a1=-7,求下列的值<br>a>b&&b>c 0 <br>a+a1||b+a1 1<br>a>b||c>b 1<br>!a &&! b 0<br>! a|| b 1
逻辑运算符、算数运算符、关系运算符优先级<br>! 非 高<br>算数运算符 ↓<br>关系运算符 ↓ <br>&&和|| ↓<br>赋值运算符 低
逻辑表达式
一般形式:<br>表达式 逻辑运算符 表达式
运算规则:<br>只有在必须执行下一个表达式才能求解时,才求解该表达式<br>(并不是所有的表达式都被求解)<br>
对于<b><font color="#ff0000">逻辑与(&&)</font></b>运算,如果<b><font color="#ff0000">第一个</font></b>操作数被判定为<font color="#ff0000"><b>假</b></font>,<br>系统<b><font color="#ff0000">不再</font></b>判定或求解<b><font color="#ff0000">第二个</font></b>操作数
对于<b><font color="#ff0000">逻辑或(||)</font></b>运算,如果<b><font color="#ff0000">第一个</font></b>操作数被判定为为<font color="#ff0000"><b>真</b></font>,<br>系统<b><font color="#ff0000">不再</font></b>判定或求解<b><font color="#ff0000">第二个</font></b>操作数
选择结构(if、switch)
if语句
if语句的作用:<br>
用来判定所给的条件是否满足<br>并且判定的结果(真或假)决定执行给出的两种操作之一
if语句有三种基本形式
if
例题:输入两个数a,b判断并输出其中较大的数<br>main()<br>{<br> int a,b,max;<br> printf("输入两个数\n");<br> scanf("%d%d",&a,&b);<br> max=a;<br> if(max<b) max=b:<br> printf("max=%d",max);<br>}
if-else
例题:输入两个数a,b判断并输出其中较大的数<br>main()<br>{<br> int a,b,max;<br> printf("输入两个数\n");<br> scanf("%d%d",&a,&b);<br> if(a>b)<br> printf("max=%d\n",a);<br> else<br> printf("max=%d\n",b);<br>}
if-else-if
if(表达式1) 如果表达式1为真,执行语句1;<br> 语句1; 如果表达式2为真,执行语句2;<br>if(表达式2) . <br> 语句2; .<br> . . <br> . .<br> . .<br>if(表达式n) 如果表达式n为真,执行语句n;<br> 语句n; 否则执行语句m。<br>else<br> 语句m;
例题:已知百分之成绩mark,显示对应等级成绩<br>90-100优秀 80-89良好 70-79中等<br>60-69及格 <60不及格
void main()<br>{<br> int mark:<br> scanf("%d",&mark);<br> if(mark)<60<br> printf("不及格\n");<br> if(mark)<69<br> printf("及格\n");<br> if(mark)<79<br> printf("中等\n");<br> if(mark)<89<br> printf("良好\n");<br> if(mark)<100<br> printf("优秀\n");<br> else<br> printf("输入错误\n");<br>}<br><font color="#ff0000"><b>注意:<br>写这种多分支语句时,应该从小于小的,<br>大于打大的开始写</b></font>
if语句中应该注意的问题
该表达式通常是逻辑表达式或关系表达式,但也可以是其他表达式,甚至也可以是一个变量<br>if(a=5) if(b)
在if语句中,条件判断表达式,必须用括号括起来,在语句之后必须加分号 <br>if(a>b) <br> max=a;
在if语句的三种形式中,所有的语句应为单个语句,如果现在满足条件时执行一组(多个)语句,<br>则必须把这一组语句用<b><font color="#ff0000">{}</font></b>括起来组成一个复合语句。但要注意在}后不能再加分号。<br>if(a>b) {a++,b++}<br> else {a=0,b=0;}
例题:输入两个实数,按代数值从小到大的顺序输出这两个数<br><font color="#1976d2"><b>解题思路:如果a>b,交换a,b如果a<b,不用交换</b></font><br>int main()<br>{<br> float a,b,t;<br> scanf("%a,%b",&a&b);<br> if(a>b)<br> {<br> t=a;<br> a=b;<br> b=t; <br> }<br> printf("%52f,%5.2f\n",a,b)<br> return 0;<br>}
if语句的嵌套
在if语句中又包含一个或多个if语句,称为if语句的嵌套
if()<br> if()<br> 语句1;<br> else<br> 语句2;<br>else<br> if()<br> 语句3;<br> else<br> 语句4;<br><font color="#ff0000"><b>else总是与它前面最近的没有配对的if配对</b></font>
例题:比较两个数的大小关系<br>main ()<br>{<br> int a,b;<br> printf("输入两个数:\n");<br> scanf("%d,%d",&a&b);<br> if(a!=b)<br> if(a>b)<br> printf("a>b\n");<br> else<br> printf("a<b\n");<br> else<br> printf("a=b\n");<br>}
条件运算符
?
格式:<br>表达式1<font color="#ff0000"><b>?</b></font>表达式2<font color="#ff0000"><b>:</b></font>表达式3<br>如果表达式1为真,执行表达式2;否则执行表达式3
例:<br>if(a>b) 等价于 max=(a>b)?a:b;<br> max=a;<br>else<br> max=b;
结合性:<br>自右向左
switch语句——实现多分支选择结构
一般形式:<br>
switch(表达式) <font color="#ff0000"><b>表达式可以使整数类型(包括字符型</b></font>)<br>{ <br> case 常量表达式1:语句1;break;<br> case 常量表达式2:语句2;break;<br> case 常量表达式3:语句3;break;<br> ……<br> case 常量表达式n:语句n;break;<br> default:语句n+1;<br>}
说明
在<b><font color="#ff0000">case</font></b>后的常量表达式值<font color="#ff0000"><b>不能相同</b></font>,否则会出现错误
在case后,允许有多个语句,可以不用{}括起来,<font color="#ff0000"><b>没有语句时,什么也不做,直到遇到后面的break。</b></font>
<b><font color="#ff0000">case</font></b>和<b><font color="#ff0000">default</font></b>子句的<font color="#ff0000"><b>先后顺序可以变动</b></font>,而不会影响程序执行的结果
default子句可以省略不用
case后不能出现多个变量,不能出现变量及有关运算符
例题:按考试成绩等级输出百分制分数段,<br>A等85分以上,B等70-84分,C等60-69分,D等60分以下<br>由键盘输入成绩等级
void main()<br>{<br> char mark;<br> scanf("%c",&mark);<br> switch(mark)<br>{ <br> case A:printf("85分以上\n");break;<br> case B:printf("70-74分\n");break;<br> case C:printf("60-69分\n");break;<br> case D:printf("60分以下\n");break;<br> default:printf("输入错误\n");break;<br>}<br>}
选择结构综合举例
写一个程序,判断是否是闰年<br>用变量leap代表是否是闰年的信息<br>若是闰年,令leap=1,非闰年,leap=0<br>最后判断leap是否为1(真),若是输出闰年信息
#include<stdio.h><br>void main()<br>{<br> int year leap;<br> printf("请输入一个年份\n");<br> scanf("%d",&year);<br> if(year%4==0)<br> if(year%100==0)<br> if(year%400==0)<br> else leap=0;<br> else leap=1;<br> else <br> leap=0;<br> if(leap)<br> printf("%d是闰年",year);<br> else<br> printf("%d不是闰年",year);<br> printf("a leap year \n"); <br>}
0 条评论
下一页