使用可变参数列表写出求平均数,最大值和模拟printf的函数

1.使用可变参数,实现函数,求函数参数的平均值。

#include<stdio.h>
#include<stdarg.h>
int average(int n,...)
{
     va_list arg;
     int i = 0;
     int sum = 0;
     va_start(arg,n);
     for(i=0; i<n; i++)
     {
        sum += va_arg(arg,int);

     }
     return sum/n;
     va_end(arg);
}
int main()
{
   int a = 10;
   int b = 20;
   int c = 30;
   int avg = average(3,a,b,c);
   printf("avg = %d\n", avg);
   return 0;
}

2.使用可变参数,实现函数,求函数参数的最大值。

#include<stdio.h>
#include<stdarg.h>
int Max(int n,...)
{
     int i = 0;
     int a = 0;
     int b = 0;
     va_list arg;
     va_start(arg,n);
     a = va_arg(arg,int);
     for(i=0; i<n; i++)
     {
        b = va_arg(arg,int);
        if(a < b)
        a = b;
     }

     return a;
     va_end(arg);
}
int main()
{
   int a = 10;
   int b = 20;
   int c = 30;
   int max = 0;
   max = Max(3,b,a,c);
   printf("max = %d\n", max);
   return 0;
}

3.模拟实现printf函数,可完成下面的功能
//
//能完成下面函数的调用。
//print(“s ccc d.\n”,”hello”,’b’,’i’,’t’,100);
//函数原型:
//print(char *format, …)
//
1.用一个while循环来读取你要打印的类型,直到遇到\0结束。

2.如果是字符c串就用putchar一个字符一个字符的输出,直到遇到\0结束。

3.如果是整形就转换为字符后再用putchar输出。

4.如果是单个字符就用putchar输出。

#include<stdio.h>
#include<stdarg.h>
void itoa(int n)//递归打印整数转变为字符的每一位
{
    if(n > 9)
    { 
         itoa(n/10);
         printf("%d",n%10);
    }
    else
        printf("%d",n);

}
void print(const char *format, ...) {
    int i = 0;
    va_list arg;
    va_start(arg, format);
        while(*format)
        {
            switch( *format ) {
            case 'c':
                putchar(va_arg(arg, int));
                break;
            case 'd': 
                {
                int r = va_arg(arg, int); 
                itoa(r);
                }
                break;
            case 's':
                {
                char *r = va_arg(arg, char*);
                while(*r != '\0')  
                  {  
                    putchar(*r); 
                    r++;
                  }                     
                }
                break;
            case ' ':
                putchar(' ');
                break;
            }
            format++;
        }
}

int main()
{
   print("s ccc d.\n","hello",'b','i','t',100);  
   return 0;
}
<think>嗯,用户让我用C语言一个程序,要给定一个数组,然后计算最大值、最小值、平均值以及总。首先,我需要确定用户的需是否明确。题目看起来很清楚,但可能需要确认输入数组的方式。用户可能希望手动输入数组,或者数组是预先定义好的?比如,他们可能希望从标准输入读取数组元素,或者直接在代码里初始化一个数组。这里可能需要灵活处理,但通常这类题目可能希望处理用户输入的数组,或者至少是一个示例数组。 然后,我需要考虑如何实现这四个计算。总应该是所有元素相加,平均值则是总除以元素数量。最大值最小值需要遍历数组比较元素。这几个功能可以分开处理,或者在一次遍历中同时完成,这样效率更高,特别是当数组很大时。所以,可能在一次循环中同时找出最大值、最小值,并累加总,这样减少循环次数,提高效率。 接下来,关于数组的输入方式,假设用户希望程序能够处理任意长度的数组,但C语言中数组的大小需要在编译时确定,除非使用动态内存分配。但如果是用户输入的话,可能需要先让用户输入数组的大小,然后再输入各个元素。或者,用户可能希望直接处理一个固定大小的数组的例子。比如,可能给出一个例子,如int arr[] = {1,2,3,4,5},然后计算这些值。不过题目中并没有说明,所以需要明确。 可能用户希望程序能处理用户输入的数组。比如,用户输入n个元素,然后程序计算。或者可能他们希望函数接收数组长度作为参数。所以,可能需要设计函数来实现各个功能。例如,函数max、min、sum、average,但也可以在同一个函数中处理。不过,分开的话可能更模块化,但可能效率较低,因为需要多次遍历数组。而如果同时处理,则只需一次遍历。 比如,可以一个函数,或者直接在main函数里遍历数组,同时记录最大值、最小值,并累加总。然后平均值通过总除以元素个数得到。这种方法更高效,特别是对于大数组。 接下来,考虑代码的结构。可能的步骤: 1. 获取用户输入的数组元素。 a. 先询问用户数组的大小。 b. 然后依次输入每个元素。 c. 或者使用预定义的数组进行测试。 2. 遍历数组,初始化maxmin为第一个元素,总初始化为0。 a. 遍历每个元素,比较当前元素max、min,更新它们。 b. 同时累加到总。 3. 计算平均值:总除以元素个数,注意浮点数的问题,需要将总转换为float或double类型。 4. 输出结果:最大值、最小值、总、平均值。 需要注意的问题: - 数组为空的情况:但一般来说题目可能假设数组至少有一个元素。如果用户输入数组长度为0,需要处理错误。但题目可能假设数组非空,所以代码可能不需要处理这种情况,或者可以添加检查。 - 数据类型的处理:如果数组元素是整数,总可能溢出,所以可能需要用long类型。但题目没有说明,所以可能默认使用int,但需要根据实际情况调整。例如,如果数组很大或者元素值很大,可能需要更大的类型,但题目可能只考虑小数组的情况。 - 平均值的精度问题:用整数除法会丢失小数部分,所以需要转换为浮点数计算。例如,(float)sum / n。 可能的测试用例: 比如数组{1,2,3,4,5},最大值5,最小值1,总15,平均值3.0。 或者数组有负数的情况,比如{-2, 4, 3, -5},最大值4,最小值-5,总0,平均值0.0。 另外,需要考虑所有元素相同的情况,比如所有都是5,这样maxmin都是5。 代码的大致结构: #include <stdio.h> int main() { int n; printf("输入数组的元素个数: "); scanf("%d", &n); int arr[n]; printf("输入%d个整数:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } if (n == 0) { printf("数组为空!\n"); return 0; } int max = arr[0]; int min = arr[0]; int sum = 0; for (int i = 0; i < n; i++) { sum += arr[i]; if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } float average = (float)sum / n; printf("最大值: %d\n", max); printf("最小值: %d\n", min); printf("总: %d\n", sum); printf("平均值: %.2f\n", average); return 0; } 这样的话,用户需要先输入元素个数,然后输入每个元素。代码处理了动态大小的数组,使用了C99的变长数组特性。如果编译器不支持,可能需要使用动态内存分配,但题目可能不涉及这些,所以假设用户的环境支持变长数组。 另外,当n为0时,给出错误提示。但题目中的数组应该是给定的,所以可能用户提供的数组不会是空的。不过,代码中加入判断会更安全。 测试部分是否正确?比如输入5个元素1到5,总15,平均3.0。程序应该正确输出。对于负数的情况,比如数组包含-5,3,0,那么min是-5,max是3,总-2,平均-0.666…,但程序会显示两位小数,即-0.67。 可能用户希望输出平均值保留两位小数,所以格式字符串用%.2f。 但用户是否希望四舍五入?printf的格式说明符默认会四舍五入,所以没有问题。 总结:这个程序应该满足要,处理用户输入的数组,计算所需的值,并在一次循环中完成max、min、sum的计算,提高效率。然后计算平均值时转换为浮点,并保留两位小数输出。</think>以下是使用C语言编的程序,能够计算给定数组的最大值、最小值、平均值: ```c #include <stdio.h> int main() { int n; printf("请输入数组的元素个数: "); scanf("%d", &n); if (n <= 0) { printf("错误:数组长度必须大于0!\n"); return 1; } int arr[n]; printf("请输入%d个整数:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } int max = arr[0], min = arr[0], sum = 0; for (int i = 0; i < n; i++) { sum += arr[i]; if (arr[i] > max) max = arr[i]; if (arr[i] < min) min = arr[i]; } float average = (float)sum / n; printf("最大值: %d\n", max); printf("最小值: %d\n", min); printf("总: %d\n", sum); printf("平均值: %.2f\n", average); return 0; } ``` ### 功能说明: 1. **输入处理** - 用户首先输入数组的长度 `n`。 - 若输入的 `n ≤ 0`,程序会提示错误并终止。 - 用户随后输入 `n` 个整数构成数组。 2. **核心计算** - **最大值最小值**:通过一次遍历数组,实时比较并更新最大值最小值。 - **总**:在遍历过程中累加所有元素。 - **平均值**:总除以元素个数,结果为浮点数(保留两位小数)。 3. **输出结果** - 最大值、最小值、总直接以整数输出。 - 平均值保留两位小数输出。 ### 示例运行: ``` 请输入数组的元素个数: 5 请输入5个整数: 3 7 2 9 1 最大值: 9 最小值: 1 总: 22 平均值: 4.40 ``` ### 注意事项: - **动态数组**:程序使用C99的变长数组(VLA)特性,若编译器不支持,需改用动态内存分配(如 `malloc`)。 - **数据类型**:若数组元素较大,可将 `sum` 的类型改为 `long long` 避免溢出。 - **健壮性**:已处理非法输入(如 `n ≤ 0` 的情况)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值