最后应该是453呀 为什么是435

img


a、b、c都是按值传递给函数f,函数f不能改变它们的值。所以,a、b、c的值仍然是4、3、5。但是进行了比较 所以应该是453

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7602914
  • 这篇博客你也可以参考下:输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。(C语言)
  • 除此之外, 这篇博客: c语言编程练习题中的 在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    int main()
    {
        int  n = 0, t;
        for (t=0; t<=20*7; t++)
        {
            if (t%5 == 0 && t <= 20*5)  /* 控制A舰每隔5秒放1次 */
            {
                n++;
                continue;                  /* 继续下一次循环 */
            }
            if ( t%6 == 0 && t <= 20*6)   /* 控制B舰每隔6秒放1次 */
            {
                n++;
                continue;                  /* 继续下一次循环 */
            }
            if (t%7 == 0)                  /* 控制C舰每隔7秒放1次 */
            {
                n++;
            }
        }
        printf("n = %d\n", n);
    }
  • 以下回答由chatgpt基于相关博客总结生成:

    优化后的问题解答

    不理解结果为435的原因,期望结果应为453,为什么会出现这种情况?

    这段程序代码含有代码错误。

    第一部分:代码修改

    1.程序代码修改

    #include<stdio.h>
    
    int main()
    {
        double x1,x2,x3,y1,y2,y3,ab,ac,bc,flag=0;
        scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3); //输入三角形的三个顶点值
        ab=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);//关于防止出现误差可以直接在代码中的常数中加上一个小数点点,如:(1.0/3)。注意此处求两点之间距离要我们要讲sqrt包裹这个差值
        ac=(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
        bc=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);
        // 判断三角形的方案是否合法有效
        if((ab==bc)||(ab==ac)||(ac==bc))
        {
            if((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))
            {
                flag=1;
            }
        }
        if(flag)
        {
            printf("yes");
        }
        else
        {
            printf("no");
        }
        return 0;
    }
    

    第二部分:问题解答

    原来程序代码中没有对bc的取值操作,此是将ab==bc修改成bc==(x2-x3)(x2-x3)+(y2-y3)(y2-y3)。但是从编写思路上,我们应该将每次产生的取值保存下来,避免因取值操作带来精度误差。这种处理对于程序处理的精度优化是非常重要的。

    我们可以对变量bc进行计算,避免直接进行值之间的比较。bc=(x2-x3)(x2-x3)+(y2-y3)(y2-y3) 可以将ab 的值进行输出,观察其是否等于435。如果输出达不到预期的结果,后面有几个长表达式也有可能存在错误。下面的代码是对于修正后、测试后的结果:

    #include<stdio.h>
    
    int main()
    {
        double x1,x2,x3,y1,y2,y3,ab,ac,bc,flag=0;
        scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3); //输入三角形的三个顶点值
        ab=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);//关于防止出现误差可以直接在代码中的常数中加上一个小数点点,如:(1.0/3)。注意此处求两点之间距离要我们要讲sqrt包裹这个差值
        ac=(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
        bc=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);
        printf("ab:%lf\nbc:%lf\nc:%lf\n", ab,bc,ac);
        // 判断三角形的方案是否合法有效
        if((ab==bc)||(ab==ac)||(ac==bc))
        {
            if((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))
            {
                flag=1;
            }
        }
        if(flag)
        {
            printf("yes");
        }
        else
        {
            printf("no");
        }
        return 0;
    }
    

    习题一的答案和附带代码

    代码展示

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    struct Node { //链表结构体定义
        int data;
        Node* next; 
    };
    
    Node* Merge(Node* a, Node* b) { //尝试将两个单链表合并
        Node* head = new Node();
        Node* tmp = head;
        while (a != nullptr && b != nullptr) {
            if (a->data < b->data) {
                tmp->next = a;
                a = a->next;
            }
            else {
                tmp->next = b;
                b = b->next;
            }
            tmp = tmp->next;
        }
        if (a == nullptr) {
            tmp->next = b; 
        }
        if (b == nullptr) {
            tmp->next = a;
        }
        return head->next;
    }
    int main() {
        int T;
        scanf("%d",&T);
        while(T--) {
            int n,m; 
            scanf("%d%d",&n,&m);
            Node* a = new Node(),* b = new Node();
            Node* tmp = a;
            for(int i=1;i<=n;i++) {
                int x;
                scanf("%d",&x);
                tmp->next = new Node();
                tmp->next->data = x;
                tmp->next->next = nullptr;
                tmp = tmp->next;
            }
            tmp = b;
            for(int i=1;i<=m;i++) {
                int x;
                scanf("%d",&x);
                tmp->next = new Node();
                tmp->next->data = x;
                tmp->next->next = nullptr;
                tmp = tmp->next;
            }
            a = a->next;
            b = b->next;
            Node* c = Merge(a,b);
            while(c != nullptr) {
                printf("%d ",c->data);
                c = c->next;
            }
            printf("\n");
        }
        return 0;
    }
    

    31题

    此题是经典的汉诺塔,并不属于编程领域,不作讨论。如有使用需要可以参考下面的代码实现。

    #include <stdio.h>
    void move(int, char, char, char); 
    int num = 1;//记录次数
    int main(){
        int n;
        printf("请输入圆环数:");
        scanf_s("%d", &n);
        move(n, 'A', 'B', 'C');
        return 0;
    }
    /*
    步骤1:将A柱子上  P_{1}.........P_{n-1}以某种方法全部放到B柱子上(此时A柱子只有  P_{n},middle柱子上有 P_{1}........P_{n-1},而C(end)柱子上没有盘子)
    步骤2:将柱子上仅存的  P_{n}挪到空无一物的C柱子上。
    步骤3:将B柱子上剩余的  P_{1}......P_{n-1}全部挪到C柱子上。
    */
    //从A到C那B是缓冲区
    void move(int n, char a, char b, char c){
        if (n == 1) {
            printf("第%d步:%c-->%c\n", num, a, c);
            num++;
        } else {
            move(n - 1, a, c, b);//从A到B那C是缓冲区
            printf("第%d步:%c-->%c\n", num, a, c);
            num++;
            move(n - 1, b, a, c);//从B到C那A是缓冲区
        }
    }
    

因为f函数用的不是指针,无论怎么修改x y都不会改变主程序的abc
具体分析在我另一个回答里详细说明了,这里不赘述。