You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言区间比较程序调试求助:条件判断逻辑问题排查

C语言区间比较程序调试问题

我正在准备大学编程测试,想要编写一个C语言程序来比较两个区间,但多次尝试后程序均无法正常运行,我认为问题出在if条件参数中。其中k、n为第一个区间的起始和结束数值,i、j为第二个区间的起始和结束数值,我接触C语言及编程仅3周,希望能得到帮助。

原代码

#include <stdio.h>
#include <stdlib.h>

//functions
int io_menu(int a,int b);
int int_check(int k,int n);
int basic_ui(int k,int n,int i,int j);
unsigned interval(int k,int n,int i,int j);
void printint(char str[]);

int main()
{
    int fir_beg,fir_last,sec_beg,sec_last;

    do{
        basic_ui(fir_beg,fir_last,sec_beg,sec_last);
    }while(int_check(fir_beg,fir_last)==0 || int_check(sec_beg,sec_last)==0);

    return 0;
}

//menu for print and scan
int io_menu(int a,int b)
{
    printf("Give Begining number: ");
    scanf("%d",&a);
    getchar();

    printf("Give Ending number: ");
    scanf("%d",&b);
    getchar();
}

//integer check
int int_check(int k,int n){
    if(n > 0 && k > 0){return 1;}
    else{return 0;}
}

//main menu
int basic_ui(int k,int n,int i,int j)
{
    char frst[]="first";
    char scnd[]="second";

    printint(frst);
    io_menu(k,n);
    printint(scnd);
    io_menu(i,j);

    if (int_check(k,n)==1 && int_check(i,j)==1)
    {
        printf("Data is correct,please wait\n");
        interval(k,n,i,j);
    }
    else{
        printf("Unable to calculate,please try again later\n\n");
    }
}

//calculation for the intervals
unsigned interval(int k,int n,int i,int j)
{
    if(k!=n && i!=j){
        if(n<i)
        {
            printf("Before");
        }
        else if(k>j)
        {
            printf("After");
        }
        else if(i=k && n>i)
        {
            printf("Meets");
        }
        else if(i=n && k<i)
        {
            printf("Met By");
        }
        else if(k<i && n>i)
        {
            printf("Overlaps");
        }
        else if(k<j && n>j)
        {
            printf("Overlapped by");
        }
        else if(k>i && n<j)
        {
            printf("Strict during");
        }
        else if(k<i && n>j)
        {
            printf("Strict Contains");
        }
        else if(k=i && n<j)
        {
            printf("Start");
        }
        else if(k=i && j>n)
        {
            printf("Started By");
        }
        else if(n=j && i<k)
        {
            printf("Finishes");
        }
        else if(n=j && i>k)
        {
            printf("Finished by");
        }
        else if(n=j && i=k)
        {
            printf("Equal");
        }

    }
    else{printf("Unable to calculate,please try again later\n\n");}
}

void printint (char str[])
{
    printf("Enter for %s interval\n",str);
    return 0;
}

问题分析与修复要点

  • 参数传递错误:io_menu、basic_ui使用值传递,无法修改主函数中的变量值。需要改为指针传递,让函数能直接修改外部变量。
  • 条件判断的赋值错误:interval函数中所有判断相等的地方误用了赋值运算符=,应该改为相等比较运算符==,比如i=k要改成i==k。
  • 函数返回值不匹配:io_menu、basic_ui、interval声明了返回值但未在函数内返回,printint是void类型却返回了0,这些都会导致未定义行为。需要调整函数类型为void(如果不需要返回值)。
  • 区间合法性检查不全:int_check只判断了数值大于0,未检查区间起始是否小于等于结束(比如k <= n),会导致无效区间进入计算逻辑。
  • 主循环逻辑失效:因为参数传递错误,主函数中fir_beg等变量始终未被初始化或修改,导致循环的条件判断完全失效。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

// 函数声明
void io_menu(int *a, int *b);
int int_check(int k, int n);
void basic_ui(int *k, int *n, int *i, int *j);
void interval(int k, int n, int i, int j);
void printint(char str[]);

int main()
{
    int fir_beg, fir_last, sec_beg, sec_last;

    do {
        basic_ui(&fir_beg, &fir_last, &sec_beg, &sec_last);
    } while (int_check(fir_beg, fir_last) == 0 || int_check(sec_beg, sec_last) == 0);

    return 0;
}

// 输入区间的起始和结束值
void io_menu(int *a, int *b)
{
    printf("Give Begining number: ");
    scanf("%d", a);
    getchar();

    printf("Give Ending number: ");
    scanf("%d", b);
    getchar();
}

// 检查区间合法性:数值大于0且起始<=结束
int int_check(int k, int n) {
    if (k > 0 && n > 0 && k <= n) {
        return 1;
    } else {
        return 0;
    }
}

// 主交互界面
void basic_ui(int *k, int *n, int *i, int *j)
{
    char frst[] = "first";
    char scnd[] = "second";

    printint(frst);
    io_menu(k, n);
    printint(scnd);
    io_menu(i, j);

    if (int_check(*k, *n) == 1 && int_check(*i, *j) == 1) {
        printf("Data is correct,please wait\n");
        interval(*k, *n, *i, *j);
    } else {
        printf("Unable to calculate,please try again later\n\n");
    }
}

// 区间比较逻辑
void interval(int k, int n, int i, int j)
{
    if (k != n && i != j) {
        if (n < i) {
            printf("Before\n");
        } else if (k > j) {
            printf("After\n");
        } else if (i == k && n > i) {
            printf("Meets\n");
        } else if (i == n && k < i) {
            printf("Met By\n");
        } else if (k < i && n > i) {
            printf("Overlaps\n");
        } else if (k < j && n > j) {
            printf("Overlapped by\n");
        } else if (k > i && n < j) {
            printf("Strict during\n");
        } else if (k < i && n > j) {
            printf("Strict Contains\n");
        } else if (k == i && n < j) {
            printf("Start\n");
        } else if (k == i && j > n) {
            printf("Started By\n");
        } else if (n == j && i < k) {
            printf("Finishes\n");
        } else if (n == j && i > k) {
            printf("Finished by\n");
        } else if (n == j && i == k) {
            printf("Equal\n");
        }
    } else {
        printf("Unable to calculate,please try again later\n\n");
    }
}

// 打印区间提示
void printint(char str[])
{
    printf("Enter for %s interval\n", str);
}

内容的提问来源于stack exchange,提问作者dannyph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:25:21