关于#c++#的问题:如何不用printf写效果一样的代码

img


如何不用printf写效果一样的代码,请大师帮忙解答

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n , m;
    double a ,s=0 ,p=0;
    cin >> n;        
    m=n;            
    for(n--)        
    {
        cin >> a;    
        p+=a/m;        
        s+=a;        
    } 
    printf("%.0lf %.5lf\n",s,p);    
    return 0;
}

修改后效果图

img

源代码运行效果如图

img

修改过后的代码 如有帮助给个采纳谢谢

#include <iostream>
using namespace std;

int main() {
    int n, m;
    double a, s = 0, p = 0;

    cin >> n;
    m = n;

    while (n--) {
        cin >> a;
        p += a / m;
        s += a;
    }

    cout.precision(0);
    cout << fixed << s << " " << p << endl;

    return 0;
}

// #include <iostream>
// using namespace std;

// int main() {
//     int n, m;
//     double a, s = 0, p = 0;

//     cin >> n;
//     m = n;

//     while (n--) {
//         cin >> a;
//         p += a / m;
//         s += a;
//     }

//     printf("%.0lf %.5lf\n", s, p);

//     return 0;
// }


可以写cout,cout里也有控制格式的代码,但是比较复杂,不像printf这样传一个格式化字符串

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7636251
  • 这篇博客你也可以参考下:c++ printf无法打印问题
  • 除此之外, 这篇博客: 自己实现printf函数中的 下面解析printf函数的使用: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这里写图片描述

    x86平台VC6.0编译器中,stdarg.h头文件内变参宏定义如下,本次实现也printf函数也采用此定义:

    变参宏根据堆栈生长方向和参数入栈特点,从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。

    typedef char * va_list;
    
    #define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )
    
    #define va_start(ap,v)        ( ap = (va_list)&v + _INTSIZEOF(v) )
    
    #define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )
    
    #define va_end(ap)             ( ap = (va_list)0 )

    各宏的含义如下:
    _INTSIZEOF宏考虑到某些系统需要内存地址对齐。从宏名看应按照sizeof(int)即堆栈粒度对齐,即参数在内存中的地址均为sizeof(int)=4的倍数。例如,若在1≤sizeof(n)≤4,则_INTSIZEOF(n)=4;若5≤sizeof(n)≤8,则_INTSIZEOF(n)=8。
            为便于理解,简化该宏为:

    
    #define _INTSIZEOF(n)  ((sizeof(n) + x) & ~(x))
    
    x = sizeof(int) - 1 = 3 = 0b’0000 0000 0000 0011
    
    ~x = 0b’1111 1111 1111 1100

    一个数与(~x)相与的结果是sizeof(int)的倍数,即_INTSIZEOF(n)将n圆整为sizeof(int)的倍数。

    ② va_start宏根据(va_list)&v得到第一个可变参数前的一个固定参数在堆栈中的内存地址,加上_INTSIZEOF(v)即v所占内存大小后,使ap指向固定参数后下个参数(第一个可变参数地址)。
    固定参数的地址用于va_start宏,因此不能声明为寄存器变量(地址无效)或作为数组类型(长度难定)。
    ③va_arg宏取得type类型的可变参数值。首先ap+=_INTSIZEOF(type),即ap跳过当前可变参数而指向下个变参的地址;然后ap-_INTSIZEOF(type)得到当前变参的内存地址,类型转换后返回当前变参值。
    va_arg宏的等效实现如下:

    #define va_arg(ap,t)    (ap = ap + _INTSIZEOF(t), *(t *)(ap - _INTSIZEOF(t)))
    

    ④va_end宏使ap指针指向空,防止野指针


  • 以下回答由chatgpt基于相关博客总结生成:

    要实现与printf相同的输出效果,可以使用cout和<<运算符来代替printf函数。以下是一个示例代码:

    #include <iostream>
    using namespace std;
    
    int main() {
        int a = 3;
        cout << "a的值是" << a << endl;
    
        int a1 = 1;
        int a2 = 10;
        int a3 = 100;
        cout << "The result is " << a1 << endl;
        cout << "The result is " << setw(3) << a1 << endl;
        cout << "The result is " << setw(3) << a2 << endl;
        cout << "The result is " << setw(3) << a3 << endl;
    
        float b = 2.01;
        cout << "The result is " << b << endl;
        cout << "The result is " << fixed << setprecision(3) << b << endl;
    
        double c = 5.01;
        cout << "The result is " << c << endl;
        cout << "The result is " << fixed << setprecision(3) << c << endl;
    
        return 0;
    }
    

    这段代码使用了cout和<<运算符来进行输出,使用了iomanip库来设置输出格式。可以通过设置setw来控制整数输出的宽度,通过设置fixed和setprecision来保留小数的位数。

    需要注意的是,要使用cout和相关的功能,必须在代码文件的开头引入iostream和iomanip头文件,并且在使用cout之前加上using namespace std;语句,以便使用std命名空间中的cout函数。

    希望以上代码能够解决您的问题。如果还有其他疑问,请随时提问。