C语言学习提纲.docx
《C语言学习提纲.docx》由会员分享,可在线阅读,更多相关《C语言学习提纲.docx(20页珍藏版)》请在冰豆网上搜索。
![C语言学习提纲.docx](https://file1.bdocx.com/fileroot1/2023-1/23/26d33501-903d-496a-9a50-3abff1fe9508/26d33501-903d-496a-9a50-3abff1fe95081.gif)
C语言学习提纲
目录
第一章导言
第二章类型、运算符与表达式
第三章控制流
第四章函数与程序结构
第五章指针与数组
第六章结构
第七章输入输出
第八章UNIX系统接口
附录
1.无论学习的结果怎么样,是很好还是很差,总要弄点资料或东西出来。
现坚持一下、多学习、多借鉴、多练习、多啄磨,再怎么样的差,也还是有点东西的!
2.程序设计语言的学习,同实践是密不可分的,只有多练习,坚持尝试,多动手,才能整正有所进步。
光看书、在网上学习,没有上机演练来得踏实、彻底、有效。
**运算符的优先级,程序填空,基础知识填空
第一章导言
1、for循环示例
#include//将标准库文件stdio.h包含进来
intmain(intargc,char*argv[])
{
Intfahr;//定义一整型变量fahr,ANSIC约定以分号”;”作为语句的结束标记。
for(fahr=0;fahr<=300;fahr+=20)//以fahr为变量的for循环,从0开始,300时结束,每次循环步长20
printf("%3d%6.1f\n",fahr,(5.0/9.0)*(fahr-32));//输出3个字节长的十进制数;6位整数,1位小数的浮点数。
}
2、用while循环改写for循环:
#include
main()
{
intfahr,celsius;
intlower,upper,step;
lower=0;
upper=300;
step=20;
fahr=lower;
while(fahr<=upper)//测试表达式
{
celsius=5*(fahr-32)/9;
printf("%d\t%d\n",fahr,celsius);//花括号内语句,组成一个复合语句
fahr=fahr+step;//改变测试变量的值,以便下次循环时的测试比较。
}
#include
intmain(intargc,char*argv[])
{
intc;
c=getchar();
while(c!
=EOF){
putchar(c);
c=getchar();}
}
}
3、在屏幕输入输出:
#include
intmain(intargc,char*argv[])
{
intc;
while((c=getchar())!
=EOF)//如果没有遇到文件结束符,就一直循环。
{//每次循环获取从键盘录入的一个字符,并输出。
表现:
输入回车后将本行输入内容显现到屏幕。
putchar(c);
}
}
4、符号常量的程序编制时的运用:
#include
main()
#defineLOWER0//运用大写字符串代表一个具体的数值,能更好体现数据的意图
#defineUPPER300//宏替换,在后面遇到一样的大写字符串,以被替换数值或表达式取替。
#defineSTEP20
{
intfahr;
for(fahr=LOWER;fahr<=UPPER;fahr=fahr+STEP)//替换后for(fahr=0;fahr<=300;fahr=fahr+20)
printf("%3d\t%6.1f\n",fahr,(5.0/9.0)*(fahr-32));//\t中间插入一Ta间距
}
5、统计从键盘录入的信息包含有多少行,多少单词,多少字符:
#include
#defineIN1
#defineOUT0
main()
{
intc,nl,nw,nc,state;
state=OUT;
nl=nw=nc=0;
while((c=getchar())!
=EOF)
{
++nc;
if(c=='\n')++nl;
if(c==''||c=='\n'||c=='\t')state=OUT;
elseif(state==OUT)
{state=IN;++nw;}
}
printf("%d%d%d\n",nl,nw,nc);
}
6、统计录入的信息0-9各数字出现的次数,不可见字符的次数,其他的次数。
#include
intmain()
{
intc,i,nwhite,nother;
intndigit[10];
nwhite=nother=0;
for(i=0;i<10;++i)//对数组各元素赋初值0
ndigit[i]=0;
while((c=getchar())!
=EOF){
if(c>='0'&&c<='9')//获取的字符如果在0到9之间
++ndigit[c-'0'];//数组对应序列中的值加1
elseif(c==''||c=='\n'||c=='\t')//不可见字符的判断
++nwhite;
else
++nother;}
printf("数组中各元素对应值是:
\n");
for(i=0;i<10;++i)
printf("[%2d]",i);
printf("\n");
for(i=0;i<10;++i)//读出数组中各元素的值并输出
printf("%-4d",ndigit[i]);//每个值占4个宽,并左对齐
printf("\nwhitespace=%d,other=%d\n",nwhite,nother);
}
7、计算某个数的n次方;示例函数的定义与运用:
#include
intpower(intm,intn);//函数的原型声明。
C可对数据类型进行检查并强制转换
main()
{
inti;
for(i=0;i<10;++i)
printf("%d%d%d\n",i,power(2,i),power(-3,i));//函数调用
}
intpower(intbase,intn)//某个数自身相乘n次
{
inti,p;
p=1;
for(i=1;i<=n;++i)//控制自身相乘的次数
p=p*base;
returnp;//函数返回那个值
}
////节省一个变量的写法
{intp;
for(p=1;n>0;--n)
p=p*base;
returnp;
}
8、获取从键盘录入的各行信息中最长的那行并输出:
#include
#defineMAXLINE1000//定义定符常量,以实现宏替代
intgetline(charline[],intmaxline);//有返回值函数原型声明
voidcopy(charto[],charfrom[]);//无返回值函数原型声明
main()
{
intlen;
intmax=0;
charline[MAXLINE],longest[MAXLINE];
while((len=getline(line,MAXLINE))>0)//获取输入的各行及行长度以此作判断条件进行循环
if(len>max)//如果本行的长度比上一行的长度更长
{//则改变行长,并将行内容拷到目标数组中存放
max=len;
copy(longest,line);//无返回值的函数调用
}
if(max>0)
printf("%s",longest);//输出字符串
return0;
}
intgetline(chars[],intlim)
{
intc,i;//在数组长度内获取输入字符,通过for循环将其放入数组中
for(i=0;i=EOF&&c!
='\n';++i)
s[i]=c;
if(c=='\n'){//一行末尾的换行符也统计到行长度中
s[i]=c;
++i;}
s[i]='\0';//给字符串数组加上结束标志
returni;//返回输入信息行的长度
}
voidcopy(charto[],charfrom[])//字符数组间的复制
{
inti=0;
while((to[i]=from[i])!
='\0')//如果源字符串未结束则继续循环
++i;
}
9、指定每行打印的元素个数,每列用空格隔开:
#include
intmain()
{
inti,t[100];
for(i=0;i<100;i++)//给数组的100个元素赋值
t[i]=i;
for(i=0;i<100;i++)//每行打印10个元素,每列之间用一个空格隔开。
printf("%6d%c",t[i],(i%10==9||i==99)?
'\n':
'');//三元运算符,如果..则..否则..
}
第二章类型、运算符与表达式
1、检测字符串的长度:
#include
intmain(intargc,char*argv[])
{
printf("%3d\n",strlen("abcde"));
}
intstrlen(chars[])
{inti=0;
while(s[i]!
='\0')//如果字符串还未结束则继续循环
++i;
returni;}
2、枚举常量的定义及应用:
#include
intmain(intargc,char*argv[])
{
enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;//枚举常量的定义
a=sun;b=mon;c=tue;
printf("%d,%d,%d\n",a,b,c);
}
3、大写转小写,数字字符转数值,判断是否闰年:
#include
main()
{
voidleapyear(int);
inti=0;
intyear;
i=atoi("1234");//将数字组成的字符串转换为纯数字
printf("%d\n",i);
printf("输入具体的年数:
");
scanf("%d",&year);//从键盘获得需要判断是否闰年的具体年份数&year
leapyear(year);//调用是否闰年函数
printf("%c转换为小写字母是:
%c\n",'B',lower('B'));//调用转换为小字字母函数
}
intatoi(chars[])//字符数组转换为数字的函数
{
inti,n;
n=0;
for(i=0;s[i]>='0'&&s[i]<='9';++i)
n=10*n+(s[i]-'0');
returnn;
}
intlower(intc)//大写转小写函数
{
if(c>='A'&&c<='Z')
returnc+'a'-'A';
else
returnc;
}
voidleapyear(intyear)//判断是否为闰年函数
{
if((year%4==0&&year%100!
=0)||year%400==0)
printf("%disaleapyear\n",year);
else
printf("%disnotaleapyear\n",year);
}
4、删除字符数组中某个指定字符,再连接一个字符串:
#include
main()
{
voidsqueeze(chars[],intc);
voidstrcat(chars[],chart[]);
charsour[20]="abcdefg";//定义一字符数组并赋初值
intc='b';
printf("%s\n",sour);//输出未删除前源字符数组的内容
printf("删除%c字符后:
\n",c);
squeeze(sour,c);//调用函数squeeze删除指定字符
printf("%s\n",sour);
chara[10]="tttt";
printf("再连接一个字符串%s后:
\n",a);
strcat(sour,a);
printf("%s\n",sour);
}
voidsqueeze(chars[],intc)//删除字符数组中的某个指定字符的函数
{
inti,j;
for(i=j=0;s[i]!
='\0';i++)
if(s[i]!
=c)//不一样的才赋值后进下次循环;否则直接进入下次循环
s[j++]=s[i];
s[j]='\0';
}
voidstrcat(chars[],chart[])//字符数组的连接函数
{
inti,j;
i=j=0;
while(s[i]!
='\0')//原字符数组先保留
i++;
while((s[i++]=t[j++])!
='\0')//再在后面添加新字符数组的内容
;
}
第三章控制流
1、在经过排序后的整型数组中查找指定数字所在的位置:
核心是整型数组的操作
#include
intmain()
{
intbinsearch(intx,intv[],intn);
intt[15];
inti,x;
printf("录入15个数\n");//提示数据录入信息
for(i=0;i<15;++i)//循环录入15个数给数组各元素赋值
scanf("%d",&t[i]);//带&表示录值给对应序列数组元素的值
printf("输入要查找的数:
\n");
scanf("%d",&x);
printf("%d\n",binsearch(x,t,t[14]));//调用折半查找函数
printf("最后一个元素的值是:
%d\n",t[14]);//引用数组中某个元素的值
}
intbinsearch(intx,intv[],intn)
{
intlow,high,mid;
low=0;//下限
high=n-1;//上限
while(low<=high)
{
mid=(low+high)/2;//中值
if(xhigh=mid-1;
elseif(x>v[mid])//如果待查找的值大于中值,将下限改为中值加1后再循环
low=mid+1;
else
returnmid;//如果正好等于中值,那就返回中值
}
return-1;//返回没有找到
}
2、Switch应用的一个示例
#include
main()
{
intc,i,nwhite,nother,ndigit[10];
nwhite=nother=0;//对二个整型变量进行连续赋初值0
for(i=0;i<10;i++)//10个元素的整型数组赋初值0
ndigit[i]=0;
while((c=getchar())!
=EOF)//从键盘获取输入的信息,直到收到结束信号
{
switch(c)
{//逐个字符进行判断,如果是数字则整型数组对应元素的值加1
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
ndigit[c-'0']++;//输入的是以字符形式存储的,ASCII码中0为48
break;//若输入4,实际存储4这个字,ASCII码52,故:
c-'0'=4
case'':
case'\n':
case'\t':
nwhite++;
break;//break跳出这层分支,阻止程序直接进入下一分支
default:
//缺省选项,可以没有。
习惯在这分支也加上break跳出语句
nother++;
break;
}
}
printf("digits=");
for(i=0;i<10;i++)//for循环读出整型数组中各元素的值
printf("%d",ndigit[i]);
printf(",whitespace=%d,other=%d\n",nwhite,nother);
return0;
}
3、Shellsort排序:
#include
main()
{
voidshellsort(intv[],intn);
inti,a[10];
printf("录入要排序的10个数:
\n");
for(i=0;i<10;i++)//for循环录入整型数组10个元素的值
scanf("%d",&a[i]);
shellsort(a,i);//调用排序函数实现排序
printf("排序后的数组\n");
for(i=0;i<10;i++)//for循环读出已排序数组的10个元素的值
printf("%2d",a[i]);
}
voidshellsort(intv[],intn)
{
intgap,i,j,temp;
for(gap=n/2;gap>0;gap/=2)//控制二个被比较元素间隔,从n/2开始,逐步对折
for(i=gap;ifor(j=i-gap;j>=0&&v[j]>v[j+gap];j-=gap)//比较相距gap个位置的各对元素,如果逆序则互换
{
temp=v[j];
v[j]=v[j+gap];
v[j+gap]=temp;
}
}
4、字符串反转操作:
#include
#include//后有使用strlen字符串操作的函数
intmain()
{
inti;
voidreverse(chars[]);
chara[100];
printf("输入需反转的字符串:
\n");
scanf("%s",a);//从键盘获取字符串;汉字字符串本程序不能反转
reverse(a);//字符数组名本身为指针,故前面不需要加"&"
printf("反转后的字符串:
\n%s\n",a);
}
voidreverse(chars[])
{
intc,i,j;
for(i=0,j=strlen(s)-1;i{c=s[i];
s[i]=s[j];
s[j]=c;}
}
5、将数值转换为字符串:
#include
#include
main()
{
voiditoa(int,chars[]);
voidreverse(chars[]);
longx=-1234552;
chart[100];
itoa(x,t);//调用itoa将数值转为字符串;
printf("将长整型数值%d转换为字符串:
\n",x);
printf("%s\n",t);
inti;
for(i=0;iprintf("%2c",t[i]);
}
voiditoa(intn,chars[])//将数字转换为字符串并保存到S中
{
inti,sign;
if((sign=n)<0)
n=-n;
i=0;
do{s[i++]=n%10+'0';}
while((n/=10)>0);
if(sign<0)
s[i++]='-';
s[i]='\0';
reverse(s);
}
voidreverse(chars[])//将字符数组中各元素的值的反置
{
intc,i,j;
for(i=0,j=strlen(s)-1;i{
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
6、去除字符串尾部的不可见字符:
#include
intmain(intargc,char*argv[])
{
inttrim(chars[]);
intstrlen(chars[]);
chart[100]="abcdade";
//printf("录入尾部包含不可见字符的字符串:
\n");
//scanf("%s",t);
printf("输入的字符串长度为:
%d\n",strlen(t));
trim(t);
inti=0;
printf("删除字符串尾部的不可见字符后,读数组各值:
\n");
for(i=0;iprintf("%2c",t[i]);
printf("\n以字符串格式读出%s\n",t);
}
inttrim(chars[])//去除字符串尾部不可见字符函数
{
intn;
for(n=strlen(s)-1;n>=0;n--)//从后面开始循环;实际上就是将’\0’放到假想的位置上
if(s[n]!
=''&&s[n]!
='