第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;
}
注意循环参数不要搞错了