为什么输出结果错误捏

问题遇到的现象和发生背景 1: 教授的课(程序设计基础第9周编程1)

描述
教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。

从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。

假设教授在时刻0开始上课。

①如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。

②如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。

③如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。

假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。

已知函数原型:

//函数功能:根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0

int IsCancel(int a[], int n, int k);
输入
包括两行数据:

第1行是n,k的值。
第2行是学生的到达时间。

输出
课程被取消,输出"YES"
课程不取消,输出"NO"

样例
输入

20 10
-8 -5 3 6 0 0 -7 -4 -5 7 -4 -1 1 1 2 -6 -2 2 -9 3
输出
NO
提示
输入提示:“Input n,k:\n”

用代码块功能插入代码,请勿粘贴截图
#include 
int IsCancel(int a[],int n,int k);
int main()
{
    int n,k,b;
    printf("n,k:\n");
    scanf("%d",&n);
    scanf("%d",&k);
    int a[1000];
    b=IsCancel(a,n,k);
    if(n>=0&&n<=1000&&k>1&&n>=k){
        if(b==1){
            printf("YES\n");
        }else if(b==0){
            printf("NO\n");
        }
    }
    return 0;
    
    
}
int IsCancel(int a[1000],int n,int k)
{
    int i;
    int cnt=0;
    int ret=0;
    for(i=0;i<1000;i++){
        a[i]=0;
    }
    i=0;
    int x,y=0;
    do{
        scanf("%d",&x);
        a[i++]=x;
        y++;
    }while(getchar()!='\n');
    if(a[i]>=-100&&a[i]<=100){
        for(i=0;iif(a[i]<=0){
            cnt++;
        }
    }
        } 
    if(cnt>=k){
        ret=0;
    }else{
        ret=1;
    }
    return ret;
    
}

运行结果及报错内容

输出结果错误: 第1行
输出结果错误: 第1行
输出结果错误: 第1行
输出结果错误: 第1行
输出结果错误: 第1行

我的解答思路和尝试过的方法

试了几组数据都没问题,不知道哪里出了问题

我想要达到的结果

输出结果正确


#include<stdio.h>
int IsCancel(int a[],int n,int k);
int main(void){
    int result;
    int n,k;
    int i;
 
    scanf("%d %d",&n,&k);              //输入共有多少学生:n,以及来上课的最小人数k
    
    if(k<1000){
        int a[n];
        i = 0;
        for( ;i < n;i ++){
            scanf("%d",&a[i]);         //输入到达时间
            if(a[i]>100||a[i]<-100){
                continue;
            }
        }
    
        //printf("k=%d\n",k);
        result = IsCancel(a,n,k);      //注意调用函数时数组的写法
        switch(result){                //如果写成a[n]会显示warning;写成a[]会显示error
            case 1:printf("YES");
            break;
            case 0:printf("NO");
            break;
        }
    }
    
        return 0;
}
 
    
    
int IsCancel(int a[],int n,int k)
{
    int i,late=0,before=0,ret;
//    scanf("%d,%d",&n,&k);
    
    for(i = 0;i < n;i++)
    {
        if(a[i]>0){
            late ++;
        }
        else{
            before ++;
        }
    }
    //printf("late=%d\nbefore=%d\n",late,before);
        switch(before < k){
        case 1: ret = 1;
        break;
        case 0: ret = 0;
        break;
        }
        
        return ret;
        
}

其实没有必要像你写得那么罗嗦,学生个数n已经给出,这就意味着数组长度已知,没有不要再去判断数组长度。

#include <stdio.h>
int IsCancel(int a[], int n, int k);
int main()
{
    int n, k;
    printf("Input n,k:\n");
    scanf("%d %d", &n, &k);
    int a[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    int b = IsCancel(a, n, k);
    b == 0 ? printf("NO\n") : printf("YES\n");
    return 0;
}

int IsCancel(int a[], int n, int k)
{
    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        if (a[i] <= 0)
            cnt++;
    }
    return cnt >= k ? 0 : 1;
}