二级C语言操作题练习(上)复试强推

第1题:奇数位置小写转大写

请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。
例如,若输入"abc4EFG",则应输出“aBc4EFG”。

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

void fun(char *ss){
	for(int i=0;ss[i];i=i+2){		//ss[i]等同于ss[i]!='\0'
		if((ss[i]>='a')&&(ss[i]<='z')){
			ss[i]=ss[i]-32;	//或者ss[i]=ss[i]-'a'+'A';
		}
	}
}

int main(){
	char ss[50];
	printf("\nPlease enter an character string within 50 characters:\n");
	gets(ss);
	fun(ss);
	printf("\nbecomes\n \"%s\"", ss);
}

字符串输出的占位符是%s
输入字符串char ss[50]; gets(ss);
字符传递结尾都是有个’\0’的字符(strlen不会计算字符串末尾的’\0’,而sizeof会计算
字符串变量的定义char arry[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘w’}; 或者 char arry[]=“hellow”;
字符串常量的定义char *p=“hellow”; 字符串常量是不可以被修改的,字符串变量是可以被修改

第2题:一维数组移动

请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p, p小于等于n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。

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

void fun(int *ss,int n,int p){
	int temp[50];
	printf("\n临时数组信息:");
	for(int i=0;i<=p;i++){	//复制到临时数组
		temp[i]=ss[i];
		printf("%d",temp[i]);
	}
	printf("\nss数组信息:");
	for(int i=p+1;i<=n-1;i++){	//数组前移
		ss[i-p-1]=ss[i];		//🔺回到ss下标为0的地方
		printf("%d",ss[i]);
	}
	printf("\n临时数组信息:");
	for(int i=0;i<=p;i++){	//临时数组后补
		ss[n-p+i-1]=temp[i];		//🔺
		printf("%d",temp[i]);
	}
	printf("\n");
}

int main(){
	int n,p;
	int ss[]={1,2,3,4,5,6,7,8,9};
	n=sizeof(ss)/sizeof(ss[0]);
	printf("长度n为%d",n);
	printf("输入整数p:\n");
	scanf("%d",&p);
	fun(ss,n,p);
	printf("最终结果:");  
	 for (int i = 0; i < n; i++) {  
        printf("%d ", ss[i]);  
    }  
}
}

在这里插入图片描述

数组长度的计算int n = sizeof(arr) / sizeof(arr[0]); sizeof(array) 返回整个数组的字节大小,sizeof(array[0]) 返回数组中一个元素的字节大小
在这里插入图片描述

第3题:求整数因子

请编写一个函数fun,它的功能是:计算并输出给定整数n的所有因子(不包括1与n自身)之和。规定n的值不大于1000。
例如,在主函数中从键盘给n输入的值为856,则输出为:sum=763。

#include <stdio.h>

void fun(int n){
	int sum=0;
	for(int i=2;i<n;i++){	//复制到临时数组
		if(n%i==0){
		sum+=i;
		}
	}
	printf("\n临因子和为:");
	printf("%d\n",sum);
}

int main(){
	int n,p;
	printf("请给定小于1000的整数n:\n");
	scanf("%d",&n);
	fun(n);
}

在这里插入图片描述
判断是否为素数:

 if (num <= 1) {  
        return false; // 小于等于1的数不是素数  
    }  
    if (num == 2) {  
        return true; // 2是素数  
    }  
    if (num % 2 == 0) {  
        return false; // 偶数(除了2)不是素数  
    }  
    // 从3开始,每次增加2,检查是否能被整除  
    for (int i = 3; i * i <= num; i += 2) {  
        if (num % i == 0) {  
            return false; // 如果能被i整除,则不是素数  
        }  
    }  
    return true; // 如果不能被任何数整除,则是素数  

第4题:第三位小数四舍五入

请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四舍五入(规定实型数为正数)。
例如:实型数为1234.567,则函数返回1234.570000;
实型数为1234.564,则函数返回1234.560000。

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

void fun(float num){
	float n;
	n=(int)(num*100+0.5);
	printf("%f",n/100.0);
}

/*
float fun(float num){
	float n;
	n=(int)(num*100+0.5);
	return n;
}
*/
int main(){
	float num;
	printf("输入带有三位小数的数:\n");
	scanf("%f",&num);
	fun(num);
	//printf("%f",fun(num)/100.0);
}

在这里插入图片描述

注意/100所在的位置
整除小数部分直接忽略

第5题:阶乘求和***

请编写函数fun,其功能是:计算并输出下列多项式的值:输入一个正整数n,求1/1!+1/2!+1/3!+……1/n!的值。
例如,在主函数中从键盘给n输入15,则输出为:s=2.718282。
注意:要求n的值大于1但不大于100ₒ

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

float fun(int n){
	float sum=0.0;
	float num=1.0;
	for(int i=1;i<=n;i++){
		num=num*i;
		sum+=1.0/num;
	}
	return sum+1;
}

int main(){
	int n;
	printf("输入整数:\n");
	scanf("%d",&n);
	//fun(num);
	printf("s=%f",fun(n));
}

在这里插入图片描述

在for循环中可以实现阶乘

第6题:数据存储到形参所指的存储单元

请编写函数fun,其功能是统计出x所指数组中能被e整除的元素个数,通过函数值返回主函数;同时,计算不能被e整除的元素之和,放到形参sum所指的存储单元中。
例如:当数组x内容为1, 7,8,6, 10, 15, 11, 13, 29,31,整数e内容为3时,
输出结果应该是:n=2, sum = 110

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

int fun(int *num,int e,int p,int *sum){
	int n=0;
	*sum=0;
	for(int i=0;i<p;i++){
		if(num[i]%e==0){
			n=n+1;
		}else{
			*sum+=num[i];
		}
	}
	return n;
}

int main(){
	int num[]={1,7,8,6,10,15,11,13,29,31};
	int e=3,p,sum=0;
	p=sizeof(num)/sizeof(num[0]);
	printf("整数e=%d\n",e);
	int n=fun(num,e,p,&sum);	//传递sum的地址
	printf("n=%d,sum=%d",n,sum);
}

在这里插入图片描述

在 main 函数中,sum 是一个普通的整数变量。当调用 fun 函数时,&sum(即 sum 的地址)被作为参数传递。这样,fun 函数内部对 *sum 的修改会反映到 main 函数中的 sum 变量上。(类似于数组名int arr[10];fun(arr))
在 fun 函数中,sum 是一个指向整数的指针。这意味着你可以通过⭐sum 来访问和修改它所指向的整数值。在函数开始时,*sum 被初始化为 0。然后,在遍历数组时,所有不能被 e 整除的元素的值都会被累加到 *sum 上。

第7题:形参找大小

请编写函数fun:在形参指针所指的4个整数中找出最大值和最小值, 最大的放在a中,最小的放在d中。

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

void fun(int *arr,int *a,int *b){
	int max=*arr;
	int min=*arr;
	for(int i=0;i<4;i++){	
		if(arr[i]>max){
			max=arr[i];
		}
		if(arr[i]<min){
			min=arr[i];
		}
	}
	*a=max;
	*b=min;
}

int main() {  
	int arr[4]={3,1,4,2};
	int *a=&arr[0];
	int *b=&arr[3];
	fun(arr,a,b);
	printf("最大值: %d\n", *a);  // 输出最大值  
    printf("最小值: %d\n", *b);  // 输出最小值 
}

在这里插入图片描述

注意参数以及参数地址的调用和传递
int ⭐a = &arr[0]; 这行代码的含义是声明一个指向整数的指针变量 a,并将它初始化为数组 arr 第一个元素的地址
在 fun(arr, a, d); 调用中,a 是一个指向整数的指针(int⭐类型)
在 printf(“最大值: %d\n”, *a); 这行代码中,*a 表示的就是通过指针 a 访问到的整数值,也就是数组中的最大值。

第8题:年龄分类

请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9 岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依此类推,把100岁(含 100)以上年龄的人数都放在d[10]中。结果在主函数中输出。

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
#define N 100 // 年龄数组的大小  
#define M 11  // 年龄段统计数组的大小(0-9, 10-19, ..., 90-99, 100及以上)  
  
void fun(int *a, int *b) {  
    int i;  
      
    // 初始化数组b,将所有元素设为0  
    for (i = 0; i < M; i++) {  
        b[i] = 0;  
    }  
      
    // 遍历年龄数组a,统计各年龄段的人数  
    for (i = 0; i < N; i++) {  
        // 计算年龄段索引,注意处理100岁及以上的情况  
        int ageGroup = (a[i] >= 100) ? 10 : a[i] / 10;  
        // 增加对应年龄段的人数  
        b[ageGroup]++;  
    }  
}  
  
int main() {  
    int a[N]; // 年龄数组  
    int b[M] = {0}; // 年龄段统计数组  
    int i;  
      
    // 初始化随机数生成器  
    srand(time(NULL));  
      
    // 生成随机年龄数据,假设年龄范围在0到100之间  
    for (i = 0; i < N; i++) {  
        a[i] = rand() % 101; // 生成0到100之间的随机整数作为年龄  
    }  
      
    // 调用fun函数进行年龄段统计  
    fun(a, b);  
      
    // 打印统计结果  
    printf("各年龄段的人数如下:\n");  
    for (i = 0; i < M; i++) {  
        printf("%d至%d岁: %d人\n", i * 10, (i == M - 1) ? 100 : (i + 1) * 10 - 1, b[i]);  
    }  
      
    return 0;  
}

关键是对于年龄的处理,采用三目运算符ageGroup = (a[i] >= 100) ? 10 : a[i] / 10;
三元运算符 (i == M - 1) ? 100 : (i + 1) * 10 - 1 的解释如下:
①i == M - 1 是一个条件判断,检查i是否等于M - 1。如果是最后一个索引(即i等于M - 1),那么就将年龄段的上限设为100,因为我们要包含所有100岁及以上的人。
②如果i不等于M - 1,那么年龄段的上限就是(i + 1) * 10 - 1。这是因为i * 10是年龄段的下限,所以(i + 1) * 10将是下一个年龄段的下限。我们减去1来得到当前年龄段的上限。例如,当i为0时,(i + 1) * 10 - 1 就是9,表示0至9岁的上限是9岁。

第9题:判断字符串自增

请编写函数fun,其功能是:判断str所指字符串中的字母是否由连续递增字母序列组成
(字符串长度大于等于2)。
例如:字符串:abcd满足要求;
而字符串:bcda不满足要求。

#include <stdio.h> 
  
int fun(char *str){  
	int k=1;
	for(int i=1;str[i];i++){
		if(str[i]<str[i-1]){
			k=0;
		}
	}
	return k;
}  
  
int main() {  
    char str[50]; 
	printf("请输入长度大于2的字符串:");  
    gets(str); 
    printf("您输入的为:%s",str);  
	if(fun(str)){
		printf("满足要求");
	}else{
		printf("不满足要求");  
	}      
    return 0;  
}

在这里插入图片描述
在这里插入图片描述

依次比较当前字母与前一个字母的大小

第10题:删除字符

请编一个函数fun,函数的功能是:将s所指字符串中ASCll码值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符串A的ASCll码值为奇数,字符1的ASCll码值也为奇数,都应该删除,其他以此类推。最后t所指的数组中的内容应是"BDF24"。

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

void fun(char *s,char *t){  
	int len,n=0;
	len=strlen(s);
	for(int i=0;i<len;i++){
		if(s[i]%2==0){
			t[n++]=s[i];
		}
	}
	t[n]='\0';
}  
  
int main() {  
    char s[]="ABCDEFG12345"; 
	printf("原字符串: %s\n", s); 
	char t[100]; // 假设t数组足够大以存放结果  
	fun(s,t);  
    printf("结果字符串: %s\n", t); 
    return 0;  
}

在这里插入图片描述

len=strlen(s);直接计算字符串长度
t[n++]=s[i];中先取n值,再对n自加1

第11题:含阶乘公式计算

编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n。
在这里插入图片描述
例如: m = 12, n=8时,运彳亍结果为495.000000。

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

float fun(int m,int n){  
	float sum,a=1,b=1,c=1;
	for (int i=m;i>=1;i--) a=a*i;  /*求出m的阶乘*/
	for (int i=n;i>=1;i--) b=b*i;  /*求出n的阶乘*/
	for (int i=m-n;i>=1;i--) c=c*i;  /*求出m-n的阶乘*/
	sum=a/(b*c);
	return sum;
}  
  
int main() {  
    int m,n;
	printf("请输入m n:");
	scanf("%d",&m);
	scanf("%d",&n);
	fun(m,n);
    printf("结果为: %f\n",fun(m,n)); 
    return 0;  
}

在这里插入图片描述

第12题:结构体***

结构体struct mpow两个成员的意义是:a为幂的底,t为幂的指数。
请编写函数fun,其功能是:计算出x所指数组中n个幂数之和并返回。
例如,当结构体数组用如此数据12, 0,9, 2, 23, 1, 7, 2初始化时, 程序的输出结果应该是:sum = 154.000000

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

struct mpow{
	double a; // 幂的底  
    int t;    // 幂的指数  
};

double fun(struct mpow x[],int n){
	double sum=0.0;
	for(int i=0;i<n;i++){	
		sum+=pow(x[i].a,x[i].t);
	}
	return sum;
}

int main() {  
	// 初始化结构体数组
	struct mpow array[]={{12,0},{9,2},{23,1},{7,2}};
	int n=sizeof(array)/sizeof(array[0]);
	printf("n = %d\n", n); 
	// 调用fun函数计算幂数之和  
    double sum = fun(array, n);  
	// 输出结果  
    printf("sum = %.6f\n", sum);  
  
    return 0;  
}

在这里插入图片描述

pow 函数是 C 语言标准库 <math.h> 中定义的一个函数,double pow(double base, double exponent);
base:底数,即幂运算中的底。
exponent:指数,即幂运算中的指数

第13题:公式计算

编写函数fun,它的功能是:计算并输出下列级数和:
在这里插入图片描述
例如,当n=10时,函数值为0.909091。

#include <stdio.h>  

float fun(int n){
	float sum=0.0;
	for(int i=1;i<=n;i++){	
		sum+=1.0/(i*(i+1));
	}
	return sum;
}

int main() {  
	int n;
	printf("输入n的值:");
	scanf("%d",&n);
    printf("sum = %f\n", fun(n));  
    return 0;  
}

在这里插入图片描述

注意分子1.0

第14题:二维数组找最大数

请编一个函数fun,函数的功能是求出2×M整型二维数组中最大元素的值,并将此值返回调用函数。

#include <stdio.h>  
#define M 2

int fun(int arr[][M]){
	int max=arr[0][0];
	printf("arr[0][0]=%d\n", arr[0][0]);
	printf("M=%d\n", M);
	for(int i=0;i<2;i++){	
		for(int j=0;j<M;j++){
			//max=max>arr[i][j]?max:arr[i][j];
			if (arr[i][j]>max){
				max=arr[i][j];

			}
		}
	}
	return max;
}

int main() {  
	int arr[2][M]={1,2,3,4};
    printf("max = %d\n", fun(arr));  
    return 0;  
}

在这里插入图片描述

注意数组的边界

第15题:四叶玫瑰数

请编写函数fun,其功能是:求n (n< 10000)以内的所有四叶玫瑰数并逐个存放到result所指的数组中,四叶玫瑰数的个数作为函数值返回值。
如果一个4位正整数等于其各个数字的4次方之和,则称该数为四叶玫瑰数。
例如:1634=1x1x1x1+6x6x6x6+3x3x3x3+4x4x4x4,因此1634就是一个四叶玫瑰数。

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

int fun(int n,int *result){
	int count=0;
	int a,b,c,d;
	if(n<1000||n>10000){
		printf("输入有误");
	}else{
		for(int i=1000;i<=n;i++){
			a=i/1000;
			b=(i/100)%10;
			c=(i/10)%10;
			d=i%10;
			if(i==a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d){
				result[count++]=i;
				printf("%d\n",i);
			}
		}
	}
	return count;
}

int main() {  
	int n,result[100];
	printf("请输入n(n< 10000):");
	scanf("%d",&n);
    printf("四叶玫瑰数的个数为:%d\n",fun(n,result));  
    return 0;  
}

在这里插入图片描述

注意循环参数不要搞错了

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值