【提分秘籍】大一C语言期末经典题目

博主分享针对C语言期末考试的针对性复习资料,涵盖矩阵转置、字符串操作、文件I/O及算法题,助你高效复习,包括代码示例和百度网盘链接提取码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你的关注和三连就是我创作的最大动力!
这么好的博主不点个关注吗!
临近期末很多小伙伴需要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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值