c语言 试题总结

c语言 试题总结-2021版

1965. 2021C语言课前3 while循环

1. 洗衣服

#include <stdio.h>
#include <stdlib.h>
 
int main()
{int n,m,mt=0;
while(scanf("%d%d",&n,&m)!=EOF)
{mt=n/m;
printf("%d\n",mt);}
    return 0;
}

EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。

要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.

https://blog.csdn.net/henu1710252658/article/details/83040281

1966.2021C语言课前4 for循环

1.求绝对值最大值

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int i, n, a, fa, max, maxold;
    scanf("%d", &n);
    scanf("%d", &a);
    max = ((a >= 0)? a : -a);
    maxold = a;
    for(i = 1; i < n; i++)
    {
        scanf("%d", &a);
        fa = a;
        if(a < 0)
        {
            fa = -a;
        }
        if(max < fa)
        {
            max = fa;
            maxold = a;
        }
    }
    printf("%d\n", maxold);
    return 0;
}

不能使用abs函数,会超时(runtime error)

2.判断素数

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i;
    int flag=1;
    scanf("%d",&n);
    for(i=2; i<n; i++)
    {
        if(n%i==0)
            flag=0;
    }
    if(n!=1)
    {if(flag==1)
        printf("This is a prime.");
else
        printf("This is not a prime.");
    }
    else
        printf("This is not a prime.");
    return 0;
}

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

3.最大公约数与最小公倍数

在这里插入图片描述

#include <stdio.h>
int main()
{
    int m,n,max,min,b,c,g;
	//printf("请输入两个整数:\n");
	scanf("%d %d",&m,&n);
	
    c=m%n;
    b=m*n;
	while(c!=0)
	{
        m=n;
		n=c;
        c=m%n;
	}
    max=n;
	min=b/max;
	printf("%d\n%d\n",max,min);
    return 0;
}

一、最大公约数求法
(1)辗转相除法
设有两整数a和b:
① a%b得余数c
② 若c==0,则b即为两数的最大公约数
③ 若c!=0,则a=b,b=c,再回去执行①。

例如求27和15的最大公约数过程为:
27÷15 余12
15÷12 余3
12÷3 余0
因此,3即为最大公约数。

(2)相减法
设有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a==b,则a(或b)即为两数的最大公约数
④ 若a!=b,则再回去执行①。

例如求27和15的最大公约数过程为:
27-15=12( 15>12 )
15-12=3( 12>3 )
12-3=9( 9>3 )
9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即为最大公约数。

二、求最小公倍数算法
最小公倍数=两整数的乘积÷最大公约数

4.数列求和

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,n,i,s,m;
    scanf("%d",&a);
    scanf("%d",&n);
    s=0;
    m=a;
    for(i=1; i<n; i++)
    {
        s=s+m; //让个位等于a 
        m=m*10+a;//进位后再补a 
    }
    s=s+m;
    printf("%d\n",s);
    return 0;
}


m*10 好办法

5.做乘法

在这里插入图片描述

#include <stdio.h>
int main()
{
    int n,i,m;
    scanf("%d",&n);
    
    for(i=1; i<=n; i++)
    {
        m=i*n;
        printf("%d*%d=%d\n",n,i,m);
    }
    return 0;
}

2063. 2021C实验5——函数

B . 字符串连接

在这里插入图片描述

#include <stdio.h>
main()
{
	char a[100],b[100];
	int i=0,j=0;
	//printf("Please input 2 strings:\n");
	gets(a);     //输入字符串啊,a,b
	gets(b);
	while(a[i]!='\0')
		i++;       //  i 表示字符串a的'\0'所在的位置
	while(b[j]!='\0')   //将b中字符一个个赋值给'\0'以及其后面的位置,i++,j++控制一一对应
		a[i++]=b[j++];
	a[i]='\0'  ;   //给一个结束标志
	puts(a);    //输出
	return 0;
}

注意字符串的定义

输入输出流 gets和puts

在while循环中 i 表示字符串a的’\0’所在的位置

while(a[i]!='\0')
		i++;  
while(b[j]!='\0')   //将b中字符一个个赋值给'\0'以及其后面的位置,i++,j++控制一一对应
		a[i++]=b[j++];

先将i加到a的尾端,再在后面加上b串的内容,最后给a[i]一个结束标志a[i]=’\0’

实验1

A . 鲁东信电的密码

#include<stdio.h>
#define N 256
int main() { 
	char str[N]; int i,m;
	scanf("%d",&m);
	scanf("%s",str);

	i=0;
	while ( str[i]!=0 ) {
		if ( str[i]>='a' && str[i]<='z' ) str[i]=(str[i]-'a'+m)%26+'a';
		else if ( str[i]>='A' && str[i]<='Z' ) str[i]=(str[i]-'A'+m)%26+'A';
		i++;
	}
	printf("%s\n",str);
}
B . 圆柱和圆球

在这里插入图片描述

#include <stdio.h>

int main()
{
	double h, r, l, s, sq, vq, vz;
	const double pi = 3.1415926;

scanf("%lf %lf",&r,&h);
	l = 2 * pi * r;
	s = r * r * pi;
	sq = 4 * pi * r * r;
	vq = (4.0 / 3.0 * pi * r * r * r);
	vz = pi * r * r * h;

printf("%.2lf %.2lf %.2lf %.2lf %.2lf",l,s,sq,vq,vz);
	return 0;
}

**1.**C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf。

**2.**scanf当中若是对双精度的变量赋值是必须是%后跟lf,而printf当中可以用%f也可以用%lf没有限制。

实验2——选择结构

A . 成绩的等级转换***

在这里插入图片描述

#include<stdio.h>
int main()
{
	int score[110],n;
	scanf("%d",&n);
	for(int i = 0;i<n;i++){
		scanf("%d",&score[i]);
		
	}
for(int i = 0;i<n;i++){
	if (score[i]<0 || score[i]>100)
	{
		printf("input error\n");
	}
	else
	{
		switch(score[i]/10)
		{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
			case 5:printf("E\n");break;
			case 6:printf("D\n");break;
			case 7:printf("C\n");break;
			case 8:printf("B\n");break;
		case 9:
			case 10:printf("A\n");break;

		}
	}}
	return  0;
}

*** stack smashing detected ***: <unknown> terminated

注意数组大小是否满足要求

B . 四个整数的排序

在这里插入图片描述

#include<stdio.h>

int main()
{
	int a,b,c,d,h;

	scanf("%d%%%d%%%d%%%d",&a,&b,&c,&d); //选择输入
	
	if (b<a)
		h=a, a=b, b=h;
	if (c<a)
		h=a, a=c, c=h;
	if (d<a)
		h=a, a=d, d=h;
	if (c<b)
		h=b, b=c, c=h;
	if (d<b)
		h=b, b=d, d=h;
	if (d<c)
		h=c, c=d, d=h;
	
	
	
	printf("%d %d %d %d",a,b,c,d);
	return 0;
	
}
C . 正整数的变换***

在这里插入图片描述

#include <stdio.h>

int main(){
int a,n,h;
int f[10];
scanf("%d",&a);
while(a!=0){
	h=a%10;
	a=a/10;
	
	f[n]=h;
	
	n++;
	//TODO
}
printf("%d\n",n);

for(int i =n-1;i>=0;i--){
	if(i!=0){
		printf("%d ",f[i]);
		//TODO
	}else{printf("%d\n",f[i]);}
	
}

for(int i =0;i<n;i++){
	
	printf("%d",f[i]);
}


}

注意输出格式控制

如何让最后一个字符不空格***

for(int i =n-1;i>=0;i--){
	if(i!=0){
		printf("%d ",f[i]);
		//TODO
	}else{printf("%d\n",f[i]);}
	
}

如果i是数组要输出的最后一个字符,那就进行if判断

D . 判断闰年***

在这里插入图片描述

#include<stdio.h>

int main()
{
	int a,y;

	int s[1001];
	scanf("%d",&a);
for(int i =0;i<a;i++){
	scanf("%d",&s[i]);
	
}
	
for(int i =0;i<a;i++){
	y=s[i];
	if((y%100!=0&&y%4==0)||y%400==0)
		printf("YES\n");
	else
		printf("NO\n");
	
}	
	
	
	
	
	return 0;
	
}

判断闰年的方法

f((y%100!=0&&y%4==0)||y%400==0)

实验3

B . 找这样的5位数

在这里插入图片描述

#include<stdio.h>

int main(){
	int n,i;
	
	while(scanf("%d",&n)!=EOF){
		int m,k,t;
		int sum=0;
		int ans=0;
		for(i=10000;i<=99999;i++)
		{
			m=i/1000;
			k=i%100;
			t=i/100%10;
			if(m%n==0&&k%n==0&&t%n==0){
				++sum;
			
				if(sum%n==0)
				printf("%d\n",i);
				else	
				printf("%d ",i);
			}
			
			
		
		
	}
		
		
		
	}
	
	return 0;
	
}

数字分割

在这里插入图片描述

C . 二分法解方程

在这里插入图片描述

#include<stdio.h>
#include<math.h>
int main()
{
	double x0,x1, f, fd;
	x1=10;
	do {
		x0=x1;
		f = 2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6;
		fd = 6 * x0 * x0 - 8 * x0 + 3;
		x1 = x0 - f / fd;
	} while (fabs(x0-x1) >=1e-2);
	printf("%.6f", x1);
	return 0;
}


https://blog.csdn.net/qq_45891676/article/details/107906949?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

D . 终于会求e的值了

在这里插入图片描述

#include<stdio.h>
//本来想用调和函数f返回int,但当n的值太大时,就超出了返回的int的最大范围会报错,所以要采用双精度
double fact(int n);

int main()
{
	int n;
	double sum=0;
	
	while(scanf("%d",&n)!=EOF){
	
	for(int i=0;i<=n;i++)
	{
		sum=sum+1.0/fact(i);
	}
	
	printf("%.6f\n",sum);
	sum = 0;
	
	
}
	return 0;
}
//实现阶乘
double fact(int n)
{
	int i;
	double sum=1;
	for(i=1;i<=n;i++)
	{
		sum=sum*i;
	}
	return sum;	
}







实验4

A . 考上大学!

在这里插入图片描述

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	long long n;
	int i,j;
	scanf("%lld",&n);
	int a[100001][6]={};
	for(i=0;i<n;i++)
	{
		//memset(a,0,6);
		for(j=0;j<5;j++)
		{
			scanf("%d",&a[i][j]);
		
		}	
		
	
	}
	
	
	for(i=0;i<n;i++)
	{
		float sum=0.0;
		float k;
		for(j=0;j<5;j++)
		{
			sum+=a[i][j];
		}
		k=sum/5;
		printf("%.1f\n",k);	
	}
	
	
	for(i=0;i<5;i++)
	{
		float b[100001]={};
		for(j=0;j<n;j++)
		{
			b[i]+=a[j][i];
		}
		if(i!=4)
		printf("%.1f\n",b[i]/n);
		else
		printf("%.1f",b[i]/n);
	
	}
	
		
	
	
	return 0;


	
}

B . 简单的转换

在这里插入图片描述

#include<stdio.h>
int trans(char a[])
{
	int n=0;
	for(int i=0;a[i]!='\0';i++)
	{
		if(a[i]>='0'&&a[i]<='9')
			n=n*16+a[i]-'0';
		else if(a[i]>='a'&&a[i]<='f')
			n=n*16+a[i]-'a'+10;
//		else if(a[i]>='A'&&a[i]<='F')
//			n=n*16+a[i]-'A'+10;
	}
	return n;
}
int main()
{
	int i=0,n;
	char a[20],ch;
	while((ch=getchar())!='\0')
	{
		if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='f')||(ch>='A'&&ch<='F'))
		{
			a[i++]=ch;
		}
		else
		{
			a[i]='\0';
			n=trans(a);
			printf("%d\n",n);
			break;
		}
	}
	return 0;
}
C . 超大福利

在这里插入图片描述

#include<stdio.h>	
#include<string.h>
int main()
{
	char a[100000]={'\0'},b[100000],c[100000];
	int i=0,j=0,l=0,len=0;
	gets(a);
	len=strlen(a);
	//统计字符串的长度,不包含'\0',但是包含空格
	for(i=0;i<=len;i++)
		//连a数组的结尾的\0'也算上,所以是<= 
		if(a[i]==' '|| a[i]=='\0')
	{
		b[j]='\0';
		if(j>l)
		{
			strcpy(c,b);
			//将数组b的内容复制到数组c中,注意写法!!
			l=j;
		}
		j=0;
		//这个要写在if的外面,
		//因为不论是否是最长单词,这个计数器都要清零,也就是从b[0]开始重新输入b数组_
	}
	else
	{
		b[j]=a[i];
		j++;
	}
	puts(c);
	return 0;
}





D . 统计难题

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
	int i=0,n;
	int a[100001];
	int j;
	int b[10]={0};
	scanf("%d",&n);
	for(int t=0;t<n;t++)
	{
		scanf("%d",&a[t]);
	}
	//memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
//	memset(b,10,0);
	for(i=0;i<n;i++)
	{
	
		j=a[i]%10;
		if(j==0){
			b[0]++;
		}
		if(j==1){
			b[1]++;
		}
		if(j==2){
			b[2]++;
		}
		if(j==3){
			b[3]++;
		}
		if(j==4){
			b[4]++;
		}
		if(j==5){
			b[5]++;
		}
		if(j==6){
			b[6]++;
		}
		if(j==7){
			b[7]++;
		}
		if(j==8){
			b[8]++;
		}
		if(j==9){
			b[9]++;
		}
	} 
	
	for(int k=0;k<10;k++)
		printf("%d\n",b[k]);
	
	return 0;
}
E . 智商比赛

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
	int i=0;
	long  n;
	scanf("%ld",&n);
	double k;
	k=sqrt(n);
	for(i=2;i<k;i++)
	{
		if(n%i==0)
			break;
	}
	
	if (n <= 1)
		printf("No");
	else if (i <= k)  //i小于n根的数n不是质数
		printf("No");
	else
		printf("Yes");
	
	return 0;
}

实验5

A . 回文串

在这里插入图片描述

//判断字符串是否是回文
#include<stdio.h>
#include<string.h>
int huiwen(char *str)
{
	//char ch[100];
	int len=strlen(str);  //获取字符串的长度
	int i,j,temp;
	for(i=0,j=len-1;i<=j;i++,j--)  //第一位和最后一位相比较循环判断
	{
		if(str[i]==str[j])  //
			temp=1;
		else                 
		{
			temp=0;
			break;
		}
	}
	return temp;
}
main()
{
	char ch[10][100];
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++){
	  //无法判断特殊字符如空格键;
	scanf("%s",ch[i]) ;      //可以判断键盘输入的任意字符
	
	
	if(huiwen(ch[i]))
		printf("yes\n");
	else
		printf("no\n");
}

}

E . 什么是鞍点?

在这里插入图片描述

#include<stdio.h>
#include<string.h>


int main(){
	int n;
	int a[11][11]={};
	int i,j;
	int p,q;
	int N=1;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<n;i++){
		int max=0,flag=1;
		for(j=0;j<n;j++){
			if(a[i][j]>max)
			{
				max=a[i][j];
				 p=i,q=j;
			}	
			
		}
		for(int k=0;k<n;k++){
			if(max>a[k][q]){
			//	printf("no exists");
				flag=0;
				break;
			}
		
		}
		if(flag==1){
		N=0;
		printf("%d",a[p][q]);
		break;
		}
	
	}
	if(N==1)
		printf("no exists");
	
	return 0;
	
	
	
	
}

F . 进制转换***

在这里插入图片描述

#include <stdio.h> 
#include <math.h> 
int main() 
{ 
	int r,i,b; 
	long long n,t;
	char a[100]; 
	char c[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	scanf("%lld%d",&n,&r); 
	t=n; 
	t=(int)fabs(t); 
	for(i=0;;i++) //无限循环
	{ 
		b=t%r; 
		if(b>=10) 
			a[i]=c[b-10]; 
		else 
			a[i]=b+'0'; 
		t=(t-b)/r; 
		if(t==0) 
			break;} 
	//if(n<0) 
	//printf("-"); 
	for(;i>=0;i--) 
		printf("%c",a[i]); 
	//printf("\n"); 
	return 0; }

G . 找一找,看一看

在这里插入图片描述

#include<stdio.h>
#include<string.h>

int chazhao(int a[],int len,int t)
{
	int low=0;
	int high=len-1;
	int mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(a[mid]==t)
			return mid;
		else if(a[mid]<t){
			low=mid+1;}
		else{
			high=mid-1;}
		
	}
	
	
}

int main(){
	int n,m;
	int a[100001];
	int i,j;
	int t;
	int q;
	int flag=0;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<m;i++)
	{
		flag=0;
		scanf("%d",&t);
		for(j=0;j<n;j++){
			if(t==a[j])
				flag=1;
		}
		if(flag==1){
			q=chazhao(a,n,t);
			q++;
			printf("%d\n",q);}
		else
			printf("no exists\n");
	}
	
	
	
	
	
	
}

H . 我会排序了

在这里插入图片描述

#include<stdio.h>
#include<string.h>

int paixu(int a[],int n)
{
	int i,j;
	int temp;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(a[j]>a[j+1] ){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	
	
}

int main(){
	int n;
	scanf("%d",&n);
	int a[101];
	int i,j;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	paixu(a,n);
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	

	
	
	
}

实验6——指针

A . 指针排序

在这里插入图片描述

#include<stdio.h>


int main()
{
	int n;
	int i,j;
	int *p;
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	p=a;
	int t;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(p[j]>p[j+1])
			{
				t=p[j];
				p[j]=p[j+1];
				p[j+1]=t;
			}
			
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%d ",p[i]);
	}
	
	return 0;
	
	
	
	
	
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值