你的关注和三连就是我创作的最大动力!
这么好的博主不点个关注吗!
临近期末很多小伙伴需要C语言复习提纲,鉴于我们学校机考的缘故——大多以写程序为主,故挑选了这些题目进行讲解,这些题目非常具有针对性,覆盖了数组、指针、结构体和文件等习题,希望好好复习嗷!
以下代码和题目均写入了pdf文档,方便小伙伴离线观看嗷!百度网盘下载C语言复习题提取码:tznk
关于期末考的几点说明:填空题以代码补充为主,同时也会附有流程图的编写,大题主要以图形、字符串、文件题和一道基础算法题为主。复习呢也是以字符串、文件为主嗷,有需要帮助的可以私信博主嗷!
有需要去年校C语言期末卷的可以私信博主。
(知己知彼,百战不殆!)
矩阵转置
题目描述1:编写一个函数,将一个3*3的矩阵转置。
矩阵转置:就是将行列互换,简单而言就是关于左对角线对称交换。
#include<stdio.h>
void zhuanzhi(int a[][3]);
void print(int a[][3]);
void swap(int *a,int *b);
int main()
{
int a[3][3],i,j;
printf("Input 3*3 magic:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
}
zhuanzhi(a);
printf("\nAfter:\n");
print(a);
return 0;
}
void print(int a[][3])//打印函数
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void swap(int *a,int *b)//交换函数
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void zhuanzhi(int a[][3])//转置函数
{
int i,j,temp;
for(i=0;i<3;i++)
{
for(j=i;j<3;j++)//注意j从i开始,确保i之前已经调换好了。
{
swap(&a[i][j],&a[j][i]);//同理:swap((p+3*i+j),(p+3*j+i));
}
}
}
求字符串长度
题目描述2:写一个函数,求一个字符串的长度。(strlen函数)
在main函数中输入字符串,并输出其长度。用指针作为函数参数实现。
#include<stdio.h>
int length(char *p);
int main()
{
char st[80];
int len;
printf("Input:\n");
gets(st);
len=length(st);
printf("Length:%d\n",len);
return 0;
}
int length(char *p)//指针参数 int型
{
int i=0;
while(*(p+i)!='\0')//建立指针与数组关系
{
i++;
}
return i;
}
复制字符串
题目描述3:有一个字符串,包含n个字符。
写一个函数,将此字符串中从第m个字符开始的全部
字符复制成为另外一个字符串。
#include<stdio.h>
void mcopy(char a[],char b[],int m);
int main()
{
char a[80],b[80];
int n;
printf("Input:\n");
gets(a);
printf("Input num:\n");
scanf("%d",&n);
mcopy(a,b,n);
printf("A:%s\nB:%s",a,b);
return 0;
}
void mcopy(char a[],char b[],int m)//有3个变量
{
int i,j;
for(i=m,j=0;a[i]!='\0';i++,j++)//循环变量同时进行
{
b[j]=a[i];//复制
}
}
杨辉三角形
题目描述4:编写一个程序,输出一个n(n<10)阶杨辉三角形。
注意此时要求的是塔状的杨辉三角形 ,有一定的难度,不像平时的杨辉
#include<stdio.h>
void out(int sum[],int n);
int main()
{
int n,t,i,j;
do
{
printf("Input num:\n");
scanf("%d",&n);
}while(n<0||n>=10);//限定行数n的范围在1—10
t=2*n-1;//最底下一层的位数,也就是每一层包括空格的长度;
int sum[t]={0};//初始化数组
sum[n]=1;//第一行中间为1
out(sum,t);//先弄完第一行
for(i=1;i<n;i++)//以行为循环 ,因为第一行已经输完,所以循环量为n-1
{
for(j=1;j<n;j++)
{
sum[j]=sum[j]+sum[j+1];//杨辉三角形本质,空格都是用out函数控制的,建议自己仔细想想,和往常的不太一样。
}
out(sum,t);
}
return 0;
}
void out(int sum[],int n)
{
for(int i=0;i<n;i++)
{
if(sum[i]!=0) printf("%-4d",sum[i]); //不为0,不超过4个字符时左对齐并输出,后面的字符用空格替代;
else printf(" ");//如果sum[i]为0就输出2个空格与-4对应;
}
printf("\n");
}
字符串操作
题目描述5:编写函数求一个字符串的长度、实现2个字符串连接与复制。
#include<stdio.h>
int length(char *p);
void lianjie(char a[],char b[]);
void copy(char a[],char b[]);
int main()
{
char st1[80],st2[80];
printf("Input st1:\n");
gets(st1);
printf("Input st2:\n");
gets(st2);
printf("ST1 Length:%d\n",length(st1));
lianjie(st1,st2);
copy(st1,st2);
return 0;
}
int length(char *p)//指针参数 int型
{
int i=0;
while(*(p+i)!='\0')//建立指针与数组关系
{
i++;
}
return i;
}
void lianjie(char a[],char b[])
{
int i=0,j=0;
while(a[i]!='\0')
{
i++;
} //让A结束
while(b[j]!='\0')
{
a[i+j]=b[j];
j++;
}
a[i+j]!='\0';
printf("Connection:\n");
printf("%s",a);
}
void copy(char a[],char b[])
{
int i;
for(i=0;b[i]!='\0';i++)
{
a[i]=b[i]; //此时必须将B复制给A,否则会因为上一个lianjie函数而改变
}
a[i]='\0'; //保证此时A已经结束
printf("\nCopy:\n");
printf("%s %s",a,b);
}
比较字符串
题目描述6:编写函数比较2个字符串。
#include<stdio.h>
int compare(char a[],char b[]);
int main()
{
char a[80],b[80];
int t;
printf("Input a:\n");
gets(a);
printf("Input b:\n");
gets(b);
t=compare(a,b);
if(t==0) printf("\nA=B");
else if(t>0) printf("\nA>B");
else printf("\nB>A");
return 0;
}
int compare(char a[],char b[])//有返回型判断大小
{
int i=0;
while((a[i]==b[i])&&a[i]!='\0') i++; //如果Ai,Bi相等就下移,否则直接进行下一步;
if(a[i]=='\0'&&b[i]=='\0') return 0;//此时0表示A=B
else return a[i]-b[i];//用正负表示大小
}
创建文本文件
题目描述7:编写一个程序,以写读模式创建一个文本文件,并显示创建的这个文件的内容。
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *f1;
char ch,f1name[20],b;
printf("Input :\n");
gets(f1name);
f1=fopen(f1name,"w+");
if(f1==NULL)
{
printf("Open error!");
exit(0);
}
printf("Input ,end #:\n");
ch=getchar();//getchar输入函数,赋一个字符,按回车结束
while(ch!='#')
{
fputc(ch,f1);//将ch写入f1
putchar(ch);//向终端输入字符
ch=getchar();//吸收回车,否则将循环
}
rewind(f1);//文件指针返回
while(!feof(f1))//文件结束标志feof(f1)
{
b=fgetc(f1);//读出f1内容
putchar(b);//终端输入
}
printf("END\n");
fclose(f1);
return 0;
}
文件复制
题目描述8:编写一个程序,分别字符、字符串读写函数实现两个指定文件之间的复制。
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *f1,*f2,*f3;
char ch,f1name[20],f2name[20],f3name[20],b,c[255];
printf("Input f1:\n");
gets(f1name);
printf("Input f2:\n");
gets(f2name);
f1=fopen(f1name,"r");//此时f1为只读模式,必须用已存在的文件
f2=fopen(f2name,"w");
if(f1==NULL)
{
printf("Open error!");
exit(0);
}
if(f2==NULL)
{
printf("Open error!");
exit(0);
}
printf("copy character:\n");//通过字符复制
while(!feof(f1))
{
b=fgetc(f1);//将f1读入b
fputc(b,f2);//将b写入f2
}
rewind(f1);//f1返回指针
printf("copy string:\n");//通过字符串复制
printf("Input f3name:\n");
gets(f3name);
f3=fopen(f3name,"w");
if(f3==NULL)
{
printf("Open error!");
exit(0);
}
while(!feof(f1))
{
fgets(c,255,f1);//将f1读入数组中
fputs(c,f3);//将数组写入f3
}
printf("END");
fclose(f1),fclose(f2),fclose(f3);
return 0;
}
向文本写入数据
题目描述9:编写一个程序,建立一个名称为stud_in.txt的文本文件,
向其中格式化写入一组姓名和成绩,然后再把该文件复制到
另外一个文件stud_out.txt文件中。
#include<stdio.h>
#include<stdlib.h>
struct Stud
{
char name[20];
int score;
}person[3]={"li",98,"huang",94,"wang",92};//定义结构体
int main()
{
FILE *f1,*f2;
char f1name[20],f2name[20],b;
int i;
printf("Input f1name:\n");
gets(f1name);
printf("Input f2name:\n");
gets(f2name);
f1=fopen(f1name,"w+");//此时f1既要写入数据又要进行复制,故为读写模式
f2=fopen(f2name,"w");
if(f1==NULL)
{
printf("Open error!");
exit(0);
}
if(f2==NULL)
{
printf("Open error!");
exit(0);
}
for(i=0;i<3;i++)
fprintf(f1,"%s %d\n",person[i].name,person[i].score);//写入数据
rewind(f1);//返回开始
while(!feof(f1))
{
b=fgetc(f1);
fputc(b,f2);
}
printf("END");
fclose(f1),fclose(f2);
return 0;
}