消息关闭
    暂无新消息!

关于c的简单程序问题 求解释

问题作者 : 雨凇2017-06-16发布
/*程序的功能是:某班有4个学生,三门课,通过main函数读入学生的学号(5位数字)、姓(最长7个字符)和三门课的成绩,然后通过调用用户自定义函数DispScore实现这些信息的输出,调用用户自定义函数FindNoPass实现找出有两门以上不及格的学生、输出其学号和不及格课程的成绩。要求用结构体编程。
测试数据:
00001 zhang 55 67 77
00032 li    64 44 55
30013 zhou  78 90 88
20706 peng  45 55 36

预期输出结果:
Student Info and Score:
 00001    zhang   55   67   77
 00032       li   64   44   55
 30013     zhou   78   90   88
 20706     peng   45   55   36

Two Course No Pass Students:
 00032       li   44   55
 20706     peng   45   55   36

实际输出结果:
Student Info and Score:
 00001    zhang   55   67   77
 00032       li   64   44   55
 30013     zhou   78   90   88
 20706     peng   45   55   36

Two Course No Pass Students:
 00001    zhang   55
 00032       li   44   55
 30013     zhou
 20706     peng   45   55   36

(红色部分 按预期不应该输出)


所写程序存在的问题:
输出不及格同学的时候跟预期结果存在不同
实际只需要输出两个或两个以上科目不及格的同学
但结果却是每一个同学不及格的科目都输出了
找了很久 还是找不到错误在哪里
(未实现:查找并输出两门以上不及格的学生时,输出了不该输出的学生)
求大神解释
  */


#include<stdio.h>

#define SNUM 4 /* student number */
#define CNUM 3 /* course number */

/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
struct student
{
char num[5];
int score[3];
char name[7];
};
void DispScore(struct student aa[]);
void FindNoPass(struct student aa[]);

/* User Code End(考生添加代码结束) */

int main(void)
{
int i, j;
struct student stu[SNUM];

printf("Please input student num name and score:\n");
for (i=0; i<SNUM; i++)

printf("Student %d: ", i+1);
scanf("%s %s", stu[i].num, stu[i].name);
for (j=0; j<CNUM; j++)
{
scanf("%d", &stu[i].score[j]);
}
}

DispScore(stu);
FindNoPass(stu);

return 0;
}

/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
void DispScore(struct student aa[])
{
int i,j;
printf("\nStudent Info and Score:\n");
for (i=0; i<SNUM; i++)
{
printf("%6s %8s", aa[i].num, aa[i].name);
for (j=0; j<CNUM; j++)
{
printf("%5d", aa[i].score[j]);
}
printf("\n");
}
}

void FindNoPass(struct student aa[])
{
int i,j,k;
printf("\nTwo Course No Pass Students:\n");
for (i=0; i<SNUM; i++)
{
k=0;
for (j=0; j<CNUM; j++)
{
if(aa[i].score[j]<60)
{
k++;
}
}
if(k >= 2)
{
for (i=0; i<SNUM; i++)
{
printf("%6s %8s", aa[i].num, aa[i].name);
for (j=0; j<CNUM; j++)
{
if(aa[i].score[j]<60)
{
printf("%5d", aa[i].score[j]);
}
}
printf("\n");
}
}
}
}

4个回答

︿ 3

#include <stdio.h>
#include <stdlib.h>
#define SNUM 4
#define CNUM 3
struct student
 {
 char num[5];
 int score[3];
 char name[7];
 };
 void DispScore(struct student aa[]);
 void FindNoPass(struct student aa[]);
 
/* User Code End(考生添加代码结束) */
 
int main(void)
 {
int i, j;
struct student stu[SNUM];
printf("Please input student num name and score:\n");
for (i=0; i<SNUM; i++)

printf("Student %d: ", i+1);
scanf("%s %s", stu[i].num, stu[i].name);
for (j=0; j<CNUM; j++)
{
scanf("%d", &stu[i].score[j]);
}
}
DispScore(stu);
FindNoPass(stu);
system("pause");
return 0;
 }
/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
 void DispScore(struct student aa[])
 {
int i,j;
printf("\nStudent Info and Score:\n");
for (i=0; i<SNUM; i++)
{
printf("%6s %8s", aa[i].num, aa[i].name);
for (j=0; j<CNUM; j++)
{
printf("%5d", aa[i].score[j]);
}
printf("\n");
}
 }
void FindNoPass(struct student aa[])
{
int i,j,k;
printf("\nTwo Course No Pass Students:\n");
for (i=0; i<SNUM; i++)
{
k=0;
for (j=0; j<CNUM; j++)
{
if(aa[i].score[j]<60)
{
k++;
}
}
if(k >= 2)
{
printf("%6s %8s", aa[i].num, aa[i].name);
for (j=0; j<CNUM; j++)
{
if(aa[i].score[j]<60)
{
printf("%5d", aa[i].score[j]);
}
}
printf("\n");
}
}


︿ 2
2.课后实验内容:用单链表实现一个学生信息管理系统,
    学生信息为如下表格,系统功能要求对学生信息进行录入,显示,插入一个新学生信息,删除一个学生,并实现按学号查找某学生信息。
例:现有一学生学籍信息表,该表包含如下学生信息:学号num、姓名name、年龄age、是否退学 LeaveSch。该信息表主要用于查询学生学籍信息,如有新生入学,则在表尾加入新生信息,将其LeavSch字段设为“N”:如有学生退学,则将其LeavSch字段设为 “Y”。
学号 姓名 年龄 是否退学
1101050101 王小二 18 N
1101050103 张三 21 N
1101050405 李四 18 Y
1101050406 刘小明 20 N
1201050102 杨升 19 N


#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define MAXSIZE 100
typedef struct Student
{
  char no[10];
  char name[20];
   int   age;
  char  leaveSch;
}elemtype;

typedef struct
{
 elemtype  data[MAXSIZE];
 int len;
}Sequenlist;

Sequenlist *InitList(Sequenlist *L)
{
   L=( Sequenlist *)malloc(sizeof(Sequenlist));
   L->len=0;
   return(L);
}

void  input(Sequenlist *L)
{
    int i,x;
    char no[10];
    char name[20];
    int  age;
    char leaveSch;
    i=0;
    printf("\n 请输入数据元素的量:");
    scanf("%d",&x);
    while(x!=i)
    {
      if(i==MAXSIZE)
      {
          printf("Table is overflow!!");
      }
      else
  {
          printf("\n Input data element,以回车键间隔:");
          scanf("%s",no);
          scanf("%s",name);
          scanf("%d",&age);
          fflush(stdin);
          scanf("%c",&leaveSch);
          strcpy(L->data[i].no,no);
          strcpy(L->data[i].name,name);
          L->data[i].age=age;
          L->data[i].leaveSch=leaveSch;
  }
  i++;
    }
   L->len=i;
}


void output(Sequenlist  *L)
{
  int i;
  printf("\n  Output element of Table:\n");
 for(i=0;i<L->len;i++)
 {
     printf("%s  ",L->data[i].no);
     printf("%s  ",L->data[i].name);
     printf("%d  ",L->data[i].age);
 printf("%c  \n",L->data[i].leaveSch);
 }
}

int InsItem (Sequenlist *L, int i)
{
    int j;
    char no[10];
    char name[20];
    int  age;
    char leaveSch;
    if( L->len>= MAXSIZE)
    {
        printf("The list is overflow.\n");
        return 0;
    }
    else if( (i<1)||(i>L->len+1) )
    {
        printf("Position is not corrent.\n");
        return 0;
    }
    else
    {
        printf("\n Input  new data element,以回车键间隔:");
        scanf("%s",no);
        scanf("%s",name);
        scanf("%d",&age);
        fflush(stdin);
        scanf("%c",&leaveSch);
        for(j=L->len-1;j>=i-1;j--)
        {
            L->data[j+1]=L->data[j];
        }
        strcpy(L->data[i-1].no,no);
        strcpy(L->data[i-1].name,name);
        L->data[i-1].age=age;
        L->data[i-1].leaveSch=leaveSch;
        L->len++;
    return 1;
    }
}


int LocItem(Sequenlist *L,int item)
{
    int i,j;
    j=L->len;
    if(j==0)
    {
        printf("The sequenlist is empty");
        //return 0;
    }
    for(i=0;i<=j;i++)
    {
        if(atoi(L->data[i].no)==item)
        {
            return (i+1);
        }
    }
    printf("The item is not in this sequenlist");
  return 0;
}

int DelItem(Sequenlist *L, int i)
{
    int j;
    if((*L).len==0)
    {
        printf("List is empty \n");
        return 0;
    }
    else if( (i<1)||(i>(*L).len) )
    {
        printf("Delete item fail\n");
        return NULL;
    }
    else
    {
        for ( j=i; j<=(*L).len-1;j++)
        {
            (*L).data[j-1]=(*L). data[j];
        }
        (*L).len--;
        return 1;
    }
    }

main()
{
  int n,item;
  int i;
  Sequenlist *L;
  L=InitList(L);
  input(L);
  output(L);
  printf("请输入新生信息:");
  InsItem(L,L->len+1);
  output(L);
  printf("请输入你要查找的学生的学号:");
  scanf("%d",&item);
  if (LocItem(L,item)==0)
  {
      printf("查找学生失败,不存在");
  }
  else
  {
      i=LocItem(L,item);
      printf("%s  ",L->data[i-1].no);
      printf("%s  ",L->data[i-1].name);
      printf("%d  ",L->data[i-1].age);
      printf("%c  \n",L->data[i-1].leaveSch);
  }
  printf("请输入你要删除的学生的学号:");
  scanf("%d",&i);
  DelItem(L,i);
  output(L);
}
我自己写的一道题,希望对你有帮助!
︿ 2
#include<stdio.h>

#define SNUM 4 /* student number */
#define CNUM 3 /* course number */
/* User Code Begin(考生可在本行后添加代码,例如结构体的定义、函数原型声明等,行数不限) */
struct student
{
    char num[12];
    int score[3];
    char name[7];
};

void DispScore(struct student aa[]);
void FindNoPass(struct student aa[]);

/* User Code End(考生添加代码结束) */

int main(void)
{
    int i, j;
    struct student stu[SNUM];

    printf("Please input student num name and score:\n");
    for (i=0; i<SNUM; i++)
    {
        printf("Student %d: ", i+1);
        scanf("%s %s", stu[i].num, stu[i].name);
        for (j=0; j<CNUM; j++)
        {
            scanf("%d", &stu[i].score[j]);
        }
    }

    DispScore(stu);
    FindNoPass(stu);

    return 0;
}

/* User Code Begin(考生在此后完成自定义函数的设计,行数不限) */
void DispScore(struct student aa[])
{
    int i,j;
    printf("\nStudent Info and Score:\n");
    for (i=0; i<SNUM; i++)
    {
        printf("%6s %8s", aa[i].num, aa[i].name);
        for (j=0; j<CNUM; j++)
        {
            printf("%5d", aa[i].score[j]);
        }
        printf("\n");
    }
}

void FindNoPass(struct student aa[])
{
    int i,j,k;
    printf("\nTwo Course No Pass Students:\n");
    for (i=0; i<SNUM; i++)
    {
        k=0;
        for (j=0; j<CNUM; j++)
        {
            if(aa[i].score[j]<60)
            {
                k++;
            }
        }
        if(k >= 2)
        {
            printf("%6s %8s", aa[i].num, aa[i].name);
            for (j=0; j<CNUM; j++)
            {
                if(aa[i].score[j]<60)
                {
                    printf("%5d", aa[i].score[j]);
                }
            }
            printf("\n");
        }
    }
}

处理不及格的学生信息的函数里,逻辑有问题;请注意与上面函数比对一下函数逻辑不同之处。
另外,num定义长度不够,因为字符串也要考虑结束标记'\0'还要占一个字节,所以,你的程序里定义的num是越界的