季淳卿 发表于 2021-4-24 11:47:02

C语言for循环赋值为0 函数调用后会替换上面所有输入的数值 只能输出最后一次数值

// 目前我还只作了第一个“日常考情”的部分因为我是一个一个询问需不需要执行下一个操作 我“日常考情”的函数我用来一个for循环,我如果我第一次输入玩“日常考情”后,
//在选择“继续添加学生考情”输入的信息(也就是第二次输入)在“日常考情”的for循环中因为我给i赋值是为0 ,它会是替换掉第一个输入的信息
//各位大佬求解求解 我学了将近半个月左右的C语言做的一个学生管理的项目 有很多地方都不是搞不太清楚
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100

struct xueshengkaoqin
{
        char kc;/*   课程    */       
        char name;   /*   姓名    */       
    int id;         /*   学号ID*/
} xskq; /*   学生考勤    */

void tou();      /*   头部    */
void kaoqin();   /* 日常考勤*/
void kqxh();   /* 考勤循环*/
void czlx();    /* 查找学生类型 单个或者全部*/
void kqcz();    /* 单个学生考勤查找*/
void qbkqcz();/* 全部学生考勤查找*/
void ckkc();    /* 查看考情*/
void jiuqin();   /* 就寝记录*/
void weisheng(); /* 日常卫生*/
void daode();    /* 道德品质*/
void biaoxian(); /* 课堂表现*/
void zhiye();    /* 作业完成*/
void zhoukao();/*   周考    */
void yuekao();   /*   月考    */
void xiangmu();/* 课程项目*/
void zongchengji();/*课程总成绩 */
void baogao();   /* 打印报告*/
void shezhi();/* 系统设置*/

int main()

{
       
//         while(1)
        tou();
       
}

void tou()

{
        int n;
        printf("\n");
        printf("\n");
        printf("\n");
        printf("****************************欢迎来到学生管理系统***************************\n");
        printf("\n");
        printf("\t\t\t      请输入所需操作\n");
        printf("\n");
        printf("\t\t\t      1.日常考勤\n");
        printf("\t\t\t      2.就寝记录\n");
        printf("\t\t\t      3.日常卫生\n");
        printf("\t\t\t      4.道德品质\n");
        printf("\t\t\t      5.课堂表现\n");
        printf("\t\t\t      6.作业完成\n");
        printf("\t\t\t      7.周考\n");
        printf("\t\t\t      8.月考\n");
        printf("\t\t\t      9.课程项目\n");
        printf("\t\t\t      10.课程总成绩\n");
        printf("\t\t\t      11.打印报告\n");
        printf("\t\t\t      12.系统设置\n");
        printf("\n");
        printf("***************************************************************************\n");
        printf("\n");
       
    scanf("%d",&n);   
    printf("\n");
        switch(n)       
        {
               
        case 1 :
          kaoqin();
                break;
               
        default:
          printf("请重新输入选择(1-12)\n");
          tou();
          break;
        }
       
}

void kaoqin() /* 日常考勤*/

{       
    int i;
    for(i=0;i<N;i++)
    {
    printf("\n");       
        printf("**************************    请输入日常考勤    **************************\n");
       printf("\n");
        printf("\t       考勤违规情况(迟到、早退、旷课、请假缺课)\n");
       printf("\n");
        printf("   请管理老师(学生科、班主任老师)在每天5:00下班前记载好当天情况\n");
        printf("\n");
        printf("请输入学生名字\n");
        scanf("%s",xskq.name);
        fflush(stdin);

        printf("请输入学生四位数的学号\n");
        scanf("%d",&xskq.id);
        fflush(stdin);
       
        printf("请输入第一节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第二节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第三节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第四节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第五节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第六节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第七节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第八节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第九节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
        printf("请输入第十节课\n");
        scanf("%s",&xskq.kc);
        fflush(stdin);
       
       
    kqxh();
        break;
        }
          
}


void kqxh() //考勤循环
{
        char c;
        int i;
        for(i=0;i<N;i++)
        {
               printf("\n");
                  printf("是否继续添加学生考勤(y或n)\n");
                  fflush(stdin);
                  scanf("%c",&c);
               if(c=='y')
              {
                  kaoqin(); /* 再次跳转日常考勤*/
                  return kaoqin() ;
                  }
                else if(c=='n')
                {
                            ckkc();/* 查看考情*/
                }
                else if(c!='y' || c!='n')
                {
                            printf("\n");
                            printf("温馨提示输入错误 请重新输入\n");
                            printf("\n");
                      kqxh();
                }
       
        }
}   

void ckkc()/* 查看考情*/
{
        char z;
        int j;
        for(j=0;j<N;j++)
        {
               printf("\n");
                  printf("是否需要查看学生的考勤情况(y或n)\n");
                  fflush(stdin);
                  scanf("%c",&z);
               if(z=='y')
              {
                  czlx();/* 查找学生类型 单个或者全部*/
//                  break;
                  }
                  else if(z=='n')
                  {
                            tou(); /* 返回头部*/
                  }
                  else if(z!='y' || z!='n')
                  {
                            printf("\n");
                            printf("温馨提示输入错误 请重新输入\n");
                            printf("\n");
                      ckkc();
                  }
       
        }
}

void czlx()/* 查找学生类型 单个或者全部*/
{
        char z;
        int j;
        for(j=0;j<N;j++)
        {
                printf("\n查找单个学生请输入(y)查找所有学生请输入(s)\n");
          fflush(stdin);
          scanf("%c",&z);
          if(z=='y')
          {
                  kqcz(); /*单个学生考勤查找*/
                 
                }
                else if(z=='s')
                {
                        qbkqcz();/* 全部学生考勤查找*/
//                        return
                }
                else if(z!='y' || z!='s')
                {
                        printf("\n");
                            printf("温馨提示输入错误 请重新输入\n");
                            printf("\n");
                      czlx();
                }
        }
               
}









void qbkqcz()/* 全部学生考勤查找*/
{
//          char sname;
          int i;
          for(int i=0;i<N;i++)
                {
                printf("||    名字   ||    学号   ||    第一节   ||    第二节    ||    第三节    ||    第四节    ||    第五节    ||    第六节    ||    第七节   ||    第八节   ||   第九节    ||    第十节    ||\n");
      printf("\n");
                printf
                (               
                "    %-14s %-14d %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s\n",
                xskq.name,xskq.id,xskq.kc,xskq.kc,xskq.kc,xskq.kc,
                xskq.kc,xskq.kc,xskq.kc,xskq.kc,xskq.kc,xskq.kc,
                xskq.kc
                ) ;
                tou();
                }
}







void kqcz()//单个学生考勤查找
{
//        int z;
        char sname;
        int i;
        printf("\n");
        printf("请输入您要查找的学生\n");
        fflush(stdin);
        gets(sname);
        printf("\n");
                                               
        if(strcmp(sname,xskq.name)==0)
        {
                printf("||    名字   ||    学号   ||    第一节   ||    第二节    ||    第三节    ||    第四节    ||    第五节    ||    第六节    ||    第七节   ||    第八节   ||   第九节    ||    第十节    ||\n");
      printf("\n");
                printf
                (               
                "    %-14s %-14d %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s %-14s\n",
                xskq.name,xskq.id,xskq.kc,xskq.kc,xskq.kc,xskq.kc,
                xskq.kc,xskq.kc,xskq.kc,xskq.kc,xskq.kc,xskq.kc,
                xskq.kc
                );               
           tou();
    }
    else
        {
                printf("抱歉为查找学生信息 请重新查找\n");
                printf("\n");
                kqcz();
        }
}



yuxijian2020 发表于 2021-4-24 20:19:41

首先,我建议你把所有的
fflush(stdin);
换成
getchar();

刷新缓冲区最好不要用fflush(stdin)
这玩意行为其实是未定义的而且你程序里 缓冲区也就总是有'\n'一个字符
getchar够用了

其次,我建议你所有变量声明即初始化,不要咔咔咔 声明一堆变量,又不初始化
我看你的程序甚至还有明明上面声明了一个 i   然后在循环里又声明一次

还有一件事,scanf 获取字符串是没有终止符的,我也不推荐用scanf获取用户输入的字符串
最好是自己用getchar写一个,也不是很难

再然后,你那个获取用户输入课程,简直辣眼睛,用个循环不就完事了写那么长....

嘛,我也不知道你用的啥编译器,反正尽量注意变量的初始化吧...
-------------------------------------------------------------------------------------
void kqcz()//单个学生考勤查找   ---->这个函数里的 i 没有初始化

void qbkqcz()/* 全部学生考勤查找*/   ----->   这个函数里的 i 重定义
页: [1]
查看完整版本: C语言for循环赋值为0 函数调用后会替换上面所有输入的数值 只能输出最后一次数值