描述
教授正在为一个有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;
}