C语言课堂笔记.docx
《C语言课堂笔记.docx》由会员分享,可在线阅读,更多相关《C语言课堂笔记.docx(27页珍藏版)》请在冰豆网上搜索。
C语言课堂笔记
第三讲.语言的控制结构
三.循环结构
1.while循环====>先判断,再循环
while(条件)
{语句系列;}
2.do-while循环====>先循环,再判断
格式:
do
{语句系列;}while(条件);
例:
求1+2+3+4+.....100=?
s+=数
求2+4+6+8+....100=?
求10!
=?
例:
输入n个数,统计其中能被3整除的数的个数,
输入-1时,终止输入
cnt++
例:
输入n个数,统计其中正数的个数,当输入0时
终止输入
例:
输入一行字符串,统计其中小写字母的个数
3.用goto语句实现循环
格式:
标号:
----------;
----------;
----------;
goto标号;
例:
求1+2+3+4+........100=?
求1+3+5+7+9+......99=?
4.for循环
格式:
for(变量=初值;终值(条件);增量)
{语句系列;}
如:
for(i=1;i<=30;i++)
for(b=300;b>=20;b-=7)
例:
求1+2+3+.......100=?
求2+4+6+8+.....100=?
10!
=?
题型:
分子分母法
例:
求1/2+2/3+3/4+4/5+.......99/100=?
分子循环:
for(i=1;i<=99;i++)
s+=i/(i+1);
分母循环
for(i=2;i<=100;i++)
s+=(i-1)/i;
例:
求8+1/3+3/5+5/7+7/9+.......97/99=?
例:
有一数列.....求该数列的前20项之和
1*22*33*44*55*6
3*44*55*66*77*8
例:
求1!
+2!
+3!
+4!
+.....10!
=?
题型:
s----sss=1ss=0
分析:
for(i=1;i<=10;i++)
{s*=i;
ss+=s;
}
例:
求1+(1+2)+(1+2+3)+(1+2+3+4)+....+(1+2+3+..n)=?
假设n=10
编循环题:
a.循环次数
b.循环规律
例:
求5+55+555+5555+55555=?
1+12+123+1234+12345=?
1+121+12321+1234321=?
题型:
循环中加条件
例:
找出1---100能被3整除的偶数
找出1----500能被5或7但不能同时被5和7
整除的数,每行输出6个数
例:
输出100-----999的水仙花数
分析:
for(i=100;i<=999;i++)
{a=
b=
c=
if(i==a*a*a+b*b*b+c*c*c)
输出i
}
注:
如何取出千/百/十/个?
永远是%10
千=数/1000%108563====>88563/1000%10
百=数/100%108563====>58563/100%10
十=数/10%10
个=数%10
例:
输出2000----5000的所有回文数,每行输出8个数
回文数:
8888666612213553
习题:
1.输出100------999中满足
百+个被10除所得余数恰是十位的数
每行输出5个数
329
例:
输入任意一个>=10的数,要求
6543====>54323===>398124===>8124
376====>76
提示:
用取余k=196543
while(m>10)
{3+40+500+6000
t+=m%10*k
m/=10;
k*=10;
}
习题:
输入任意一个正整数,求它的逆序数
345===>5431==>112===>21
7851===>1587
5.短路循环/跳出循环
continuebreak
例:
将一个串输出5次
例:
输出1---100能被5整除的数
例:
求1+4+7+10+13+.....i=s
当s不大于5000的最大i值
题型:
素数(>=2的正整数)
flag原理:
====>反向
flag=1;
for(i=2;i<=数-1;i++)
if(数%i==0){flag=0;break;}
elseflag=1;
if(flag==1)是素数;
else不是素数
例:
输入任意一个正整数,判断是否为素数
例:
输入任意一个正整数,判断是否为完数
6=1+2+3
28=1+2+4+7+14
15=1+3+5
例:
求1-3+5-7+9-11+13-15+17....99=?
题型:
异号类
解1:
1591317=====>s1
371115=====>s2
s=s1-s2
例:
求8-1/3+3/5-5/7+7/9-9/11+......97/99=?
题型:
同步循环
for(i=1;i<=100;i++)
for(a=1,b=5;a<=100;a++,b+=3)
for(i=1,j=3,k=5;i<=10;i+=2,j+=3,k+=4)
例:
求1-3+5-7+9-11+13........99=?
for(a=1,b=3;a<=99;a+=4,b+=4)
s+=a-b;
s=0+1-3+5-7+9-11+13-15
例:
判断一个字符串是否为回文串?
"abcdcba"
flag原理:
flag=1;
for(a=0,b=6;a
if(k[a]!
=k[b]){flag=0;break;}
elseflag=1;
if(flag==1)是回文串
6.多重循环:
for(a=1;a<=100;a++)
for(b=1;b<=100;b++)
for(c=1;c<=100;c++)
例:
百钱买百鸡:
数量
1只公鸡:
5元a
1只母鸡:
3元b
3只小鸡:
1元c
分析:
for(a=0;a<=20;a++)
for(b=0;b<=33;b++)
for(c=0;c<=300;c++)
if(5*a+3*b+c/3==100&&a+b+c==100)
输出a,b,c
10/3=39/2
例:
输出100----999的水仙花数
153=1*1*1+5*5*5+3*3*3
例:
输出100-----999的完全平方数
121400256169
变例:
求100---999中的完全平方数且满足
任意两位数字相同的数144400225121
统计满足的个数并求和
例:
输出10----100的所有素数
习题:
输出1-----1000的所有完数
习题:
输入任意一个正整数,求它的逆序数
345===>5431==>112===>21
7851===>158795634====>43659
95634
95634/10000%10===>9
pow(10,4)
95634/1000%10===>5
pow(10,3
while(m>10)
{3+40+500+6000
t+=m%10*k
m/=10;
k*=10;
}
例:
输出满足条件的三位数及四位数
要求six+six+six=nine+nine
如:
940+940+940=1410+1410
分析:
1)3a=2b
2)三位数的十位=四位数的百位
四位数的千位=四位数的十位
for(a=100;a<=999;a++)
for(b=1000;b<=9999;b++)
例:
求500----800的所有素数和
要求:
第1个素数-第2个素数+第3个素数-第4个素数
依此类推
例:
输入两个数a,b输出比a大的b个素数
第四讲.数组
chark[]="windows";
一.一维数组
1.定义:
类型名数组名[下标];
如:
inta[5];floatb[7];chark[100];
注:
下标必为正整型常量
inta[-3];intb[5.6];
inta=3;intb[a];
2.赋值:
inta[5]={10,20,55,800,76};
chark[8]="windows";chark[8]={"windows"}
注:
1)数组的下标从0计算
intk[5];k[5]=9000;
2)若赋了全值,则可省略下标
chark[]="windows";intb[]={10,20,30}
若没有赋全值,则自动补零00.0'\0'
inta[5]={10,33};
floatb[7]={5,1.28,3.14}
chark[100]="windows"
chark[100]={'a','b','c','d','e'};
3)数组名本身就表示数组的首地址
题型:
数列类
例:
有一数列01123581321345589......
求该数列的第15个数
分析:
k[i]=k[i-2]+k[i-1](固定前2,i=2)
例:
有一数列12510172637506582.....
0123
求该数列的第15个数
规律1:
k[i]=k[i-1]+?
规律2:
k[i]=i*i+1(无需固定i=0)
习题:
例:
有一数列01123581321345589.....
求数列中不大于1000的最大的那个数
例:
找出给定一维数组中最大的数max(起泡法)
HHHHHHH
max
max
max
max
intk[7]={34,128,-30,17,999,56,400}
例:
找出给定一维数组中的最大数max及最小数min
例:
有一歌手的分数保存在一个一维数组中
floatk[10]={9.7,9.8,10,8.0,9.5,8.0,
10,8.5,9.9,9.3}
求该歌手的最后得分,并将结果保留2位小数
分析:
找最大及最小
把10个求和
fs=(sum-max-min)/8
k*=1000;
k=(long)((k+5)/10);
k/=100;
题型:
图形类(双重循环)
*i=14空1*
***i=23空3*
*****i=32空5*
*******i=41空7*
*********i=50空9*
for(i=0;i<行;i++)
{空格循环
*号循环
\n
}
******i=60
*****i=51
****
***
**
*
习题:
*****A
*****BBB
*****CCCCC
*****DDDDDDD
*****EEEEEEEEE
1
121
12321
1234321
123454321i=5空格1--ii-1---1
题型:
找数存储m[cnt++]=找到的数
例:
将给定一维数组中能被5整除的数存放至另一数组中
intk[7]={12,17,500,-3,-15,24,75}
cnt=0m[cnt++]=500m[0]=500cnt=1
m[cnt++]=-15m[1]=-15cnt=2
m[cnt++]=75m[2]=75cnt=3
例:
将给定一维数组中满足千+个=百+十的数
存放至另一数组中
intk[7]={2568,9632,5471,2356,1569,8742,3657}
例:
将给定一维数组中的素数存放至另一数组中
intk[7]={12,5,7,13,37,24,88}
题型:
排序类(双重循环)
例:
将给定一维数组中的数升序排序
intk[7]={128,34,-5,500,89,-12,71}
解1:
for(i=0;i<7;i++)
for(j=0;j<7;j++)
if(k[i]升序
t交换
解2:
for(i=0;i<7;i++)
for(j=i+1;j<7;j++)
if(k[i]>k[j])=========>升序
t交换
注:
对奇数排序
对奇数位置的数排序
对下标为奇数的数排序
for
for
if(条件)
if<
t交换
例:
有一歌手的分数保存在一个一维数组中
floatk[10]={9.7,9.8,10,8.0,9.5,8.0,
10,8.5,9.9,9.3}
求该歌手的最后得分,
分析:
先排序
再累加sum:
1----8
fs=sum/8
例:
找出给定一维数组中的次最大数cmax
intk[10]={200,800,100,900,100,500,
900,800,300,100};
900900900800800700600300200100100
二.二维数组
1.定义:
类型名数组名[下标1][下标2];
如:
inta[3][4];floatb[4][5];
chark[5][80];
2.赋值:
a.分行赋值:
inta[][4]={{3,5,7,8},chark[3][80]={"abc",
{2,6,9,4},"desk",
{6,7,2,9}}"app"}
b.线性赋值:
inta[][6]={3,5,7,8,2,6,9,4,6,7,2,9};
注:
1)数组下标从0计算
inta[3][4];a[3][4]=800;
2)若赋了全值,则能省略一维下标,但不能省略
二维下标
3)若没有赋全值,则自动补零00.0'\0'
inta[3][4]={1,2,3};
inta[3][4]={{1},{2},{3}};
12301000
00002000
00003000
for(i=0;i<行;i++)
for(j=0;j<列;j++)
例:
输出一个3*4的矩阵
例:
求给定的3*4矩阵所有元素之和
例:
求给定的5*5矩阵中右上半角元素之和
右上半角:
if(i<=j)
右下半角:
if(i+j>=4)
左下半角:
if(i>=j)
左上半角:
if(i+j<=4)
周边元素之和:
if(i==0||i==4||j==0||j==4)
非周边元素之和:
if(i!
=0&&i!
=4&&j!
=0&&j!
=4)
181112
两条对角线:
if(i==j||i+j==4)
例:
将一个3*4矩阵行列互换
1235136
3478====>242
6251375
581
for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[j][i]=a[i][j];
例:
杨晖三角(以7*7为例)
1000000
1100000
1210000
1331
14641
15101051
1615201561
分析:
1)每行的第0个为1
2)k[i][j]=k[i-1][j-1]+k[i-1][j];
3)输出左下半角
习题:
找出3*5矩阵中每行的最大值(起泡法)
列
三.字符串数组
chark[]="windows";
1.字符串函数:
必须用到#include"string.h"
strlen():
表示求字符串的长度(不含'\0')
a:
"windows"
n=strlen(a);====>n=7注:
for(i=0;i最后一个元素的下标=总长-1
strcat():
表示字符串连接函数
strcat(串1,串2):
a:
"windows"b:
"abcde"
strcat(a,b);====>a:
"windowsabcde"b:
不变
注:
应保证串1足够长
memset():
清零
memset(串,0,长度);
如chara[100];memset(a,0,100);
for(i=0;i<100;i++)
a[i]='\0';
strcpy()/strncpy():
字符串复制函数
strcpy(串1,串2):
永远拷到结束
a:
"windows"b:
"abcde"
strcpy(a,b);=====>a:
"abcde"b:
不变
变例:
strcpy(串1,&串2[?
])
strcpy(a,&b[2]);====>a:
"cde"b:
不变
strncpy(串1,串2,n):
a:
"windows"b:
"appledesk"
strncpy(a,b,5);=====>a:
"applews"b:
不变
变例:
strncpy(串1,&串2[?
],n);
strncpy(a,&b[3],4);====>a:
"ledeows"
注:
为避免出现'\0'错误,凡定义一个新串最好用
memset()清零
strcmp():
字符串比较函数
strcmp(串1,串2):
不是比较长度,而是逐字符的比较其ASCII值
正值:
串1>串2"z""windows"
0:
两串相等"windzws""windows"
负值:
串1<串2"windowsa""windowsb"
注:
若a,b是数if(a>b)if(a==b)if(a
若a,b是串if(a>b)if(a==b)if(a
if(strcmp(a,b)>0)if(strcmp(a,b)==0)
strcpy(a,b);
itoa():
表示把数转成串atoi():
表示把串转成数
itoa(数,串,10)k=atoi(串)
chara[]="1234";intk;
k=atoi(a);
例:
输入任意一个正整数,输出它的逆序数
m3456===>654318==81
strrev():
把串逆转"abcde"===>"edcba"
分析:
itoa(m,k,10);strrev(k);m=atoi(k)
2.字符函数:
必须用到#include"ctype.h"
isalpha():
判断是否为字母
if(k[i]>='a'&&k[i]<='z'||k[i]>='A'&&k[i]<='Z')
if(isalpha(k[i]))
islower()/isupper():
判断是否为小写字母/大写字母
if(k[i]>='a'&&k[i]<='z')
if(!
islower(k[i]))
例:
将给定字符串中的第一个字母绕至最后
"windows"====>
"indowsw"
解2:
例:
将给定的字符串逆序存储
"windows"====>"swodniw"
"swodniw"
题型:
删除类
例:
删除给定字符串中所有的'*'
"****win**do***ws!
!
!
******"
if(k[i]!
='*')
m[cnt++]=k[i];
例:
删除给定字符串前端的'*'
例:
删除给定字符串后端的'*'
例:
删除给定字符串头尾的'*'
*indow*
15
例:
删除给定字符串中间的'*'
***window**
38
习题:
输入一个数n,要求删除尾部的n个*
n>*个数,则原串不动
例:
将给定字符串中所有的大写字母改成它的下
一个字母,如果是'Z',则改成'A'
小写及其它字符不动
"aabbyyzzAABBYYZZ!
!
!
***"
"aabbyyzzBBCCZZAA!
!
!
***"
分析:
if(k[i]>='A'&&k[i]<='Y')
k[i]+=1;
elseif(k[i]=='Z')
k[i]='A';
例:
将................小写.........上一个
如果是'a'======>'z',大写及其它字符不动
变例:
将给定字符串中所有的字母改成它的下一个字母
'z'====>'a''Z'======>'A',其它字符不动
例:
统计给定字符串中每个小写字母出现的次数
并分别存入yy[0]-----yy[25]中
"aaaaaaabbbcc"
yy[0]=7yy[1]=3yy[2]=2
第五讲.函数
一.概述
1.C程序的构成单位是函数,一个C程序有且必须只有
一个主函数main,且不管主函数位置如何,永远从
主函数开始执行
2.主函数可以调用其它函数,其它函数也可以
相互调用,但永远不能调用主函数
例:
求1!
+5!
+8!
+9!
+13!
+20!
=?
3.分类:
1)库函数:
#include"_____.h"
#include"math.h"数学函数
sqrt()abs()pow()
#include"stdio.h"输入输出函数
puts()printf()scanf()
#include"string.h"字符串函数
strlen()strcat()strcpy()
#include"ctype.h"字符函数
islower()i
2)空函数:
void函数名()
{}
3)用户自定义函数
二.用户自定义函数:
1.无参函数
如:
voidzdy()
{函数体;}
2.有参函数:
格式:
类型名函数名(参数列表)
{函数体;}
如:
编写函数pfh(),功能为求两数的平方和
注:
关于函数的返回值
a.若函数名前是void,则函数体内一定没有
return语句
b.若函数名前是int/float/char/double等
则函数体内一定有return语句
c.若函数名前什么都没有,则函数体内可能有
return,也可能没有return语句(具体看
题目要求)
三.函数的参数与调用
1.函数的参数
a.形参必须一一定义
b.若形参是普通变量,则是单向传递
实变形变,但形变实不变
例:
编写函数swap(),功能为实现两元素的互换
若形参是数组或指针,则是双向传递
实变形变,形变实也变
2.函数的调用
1)调用方式:
a.作为语句调用:
printf("........");
b.作为表达式调用:
如a=sqrt(b)+6
c.函数