| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1326 人关注过本帖
标题:学生档案管理问题
只看楼主 加入收藏
fjf1016
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-12-27
收藏
 问题点数:0 回复次数:6 
学生档案管理问题
这个程序是关于学生档案管理的,有两个功能,查找和修改,
这个程序运行没有问题,但是我运行后不能进行修改功能,请高手帮忙下!!

#include <stdio.h>
struct student
  {int num;
   char name[10];
   char sex;
   char address[20];
   };
   struct student stu[3]={ {000,"li lin",'m',"103 beijing road"},
               {001,"zhang fun",'m',"130 shanghai road"},
               {002,"wang min",'f',"1010 zhongshan road"}  } ;
   struct student (*p)[3];


void main()
{
void query();
void modify();
char X,Z;
int i;

printf("num    name   sex    address\n");
for (i=0;i<3;i++)
printf("%5d%10s%3c%20s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].address);


printf("do you want to query?Y OR N\n ");
scanf("%c",&X);
if (X=='Y'||X=='y')
  query();
else if (X=='N'||X=='n')
  printf("byebye!\n");


printf("do you want to modify?Y or N\n");
scanf("%c",&Z);
if (Z=='Y'||Z=='y')
   modify();
else if(Z=='N'||Z=='n')
printf("byebye\n");
}




void query()
{
int i,number;
char Z;
printf("please enter numbers:");
scanf("%d",&number);

printf("num   name   sex   address\n");
for (i=0;i<3;i++ )
{

if (number==stu[i].num)

printf("%3d%20s%2c%20s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].address);
 }

}





void modify()
{
int modinum,k,i;
printf("please input theseat which you will modify:");
scanf("%d",&modinum);
for (i=0;i<3 ;i++ )
{if (modinum==stu[i].num)
{ k=i;
scanf("%d ",&stu[k].num);
scanf("%s",&stu[k].name);
scanf("%c",&stu[k].sex);
scanf("%s",&stu[k].address);}
}
}

附图,在图中的地方就有问题了 !!!

1.jpg (19.48 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 学生档案管理 void char student 
2008-01-01 15:23
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
主要问题:
scanf("%d ",&stu[k].num);
scanf("%s",&stu[k].name);   // 改为 stu[k].name
scanf("%c",&stu[k].sex);
scanf("%s",&stu[k].address); // 改为 stu[k].address

—>〉Sun〈<—
2008-01-01 20:08
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
/* 一个修改版本 */

#include <stdio.h>

struct student
{
    int  num;
    char name[10];
    char sex;
    char address[20];
};

struct student stu[3] = {
    {000, "li lin", 'm', "103 beijing road"},
    {001, "zhang fun", 'm', "130 shanghai road"},
    {002, "wang min", 'f', "1010 zhongshan road"}
};

void query(void);
void modify(void);

int main(void)
{
    char ch;
    int i;
   
    printf("num    name   sex    address\n");
    for (i = 0; i < 3; i++)
        printf("%5d%10s%3c%20s\n", stu[i].num, stu[i].name,
                                   stu[i].sex, stu[i].address);
    putchar('\n');

    printf("do you want to query? [Y/N]\n");
    scanf("%c", &ch);
    putchar('\n');
    if(ch != '\n')
        while(getchar() != '\n')
            continue;
    if (ch == 'Y' || ch == 'y')
        query();

    printf("do you want to modify? [Y/N]\n");
    scanf("%c", &ch);
    putchar('\n');
    if(ch != '\n')
        while(getchar() != '\n')
            continue;

    if (ch == 'Y' || ch == 'y')
        modify();

    printf("Bye!\n");
    getchar();
    return 0;
}

void query()
{
    int i, number, k;
   
    printf("please enter numbers: ");
    while(scanf("%d", &number) != 1)
    {
        printf("please enter numbers[integer]: ");
        while(getchar() != '\n')
            continue;
    }
    while(getchar() != '\n')
        continue;

    printf("num    name                sex    address\n");
    for (i = k = 0; i < 3; i++)
    {
        if (number == stu[i].num)
        {
            printf("%-3d    %-20s %c    %20s\n", stu[i].num, stu[i].name,
                                       stu[i].sex, stu[i].address);
            k = 1;
        }
    }
    if(k == 0)
        printf("Not!\n");
   
    putchar('\n');
}

void modify()
{
    int modinum, k, i;
    printf("please input theseat which you will modify:");
    while(scanf("%d", &modinum) != 1)
    {
        printf("please input theseat which you will modify[integer]:");
        while(getchar() != '\n')
            continue;
    }
    while(getchar() != '\n')
        continue;

    for (i = k = 0; i < 3; i++ )
    {
        if (modinum == stu[i].num)
        {
            printf("Please enter num: ");
            while(scanf("%d", &stu[i].num) != 1)
            {
                printf("Please enter num[integer]: ");
                while(getchar() != '\n')
                    continue;
            }
            while(getchar() != '\n')
                continue;

            printf("Please enter name: ");
            while(scanf("%s", stu[i].name) == 0)
            {
                while(getchar() != '\n')
                    continue;
                printf("Please enter name: ");
            }
            while(getchar() != '\n')
                continue;

            do
            {
                printf("Please enter sex[m/f]: ");
                scanf("%c",  &stu[i].sex);
                while(getchar() != '\n')
                    continue;
            }while(stu[i].sex != 'm' && stu[i].sex != 'f');

            printf("Please enter address: ");
            while(scanf("%s",  stu[i].address) == 0)
            {
                printf("Please enter address: ");
                while(getchar() != '\n')
                    continue;
            }
            while(getchar() != '\n')
                continue;
            k = 1;
        }
    }

    if(k == 0)
        printf("Not!\n");

    putchar('\n');
}

—>〉Sun〈<—
2008-01-01 20:32
fjf1016
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-12-27
收藏
得分:0 
感谢
非常感谢这位高手!!!
2008-01-02 13:23
yanzi800013
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-11-5
收藏
得分:0 
大家说的都没错,当时我也觉得奇怪,就把输入之后的Z和X 输出看了以下,发现第二个字符输出的字符的ascii是10,而且换行的ascii是10,所以我觉得应该是换行的ascii赋给了Z,这样以来就明白了,回车其实占了两个字节的长度包括回车(13)和换行(10),当接收到(13)的时候把前面输入的给了第一个变量,然后自然换行(10)就给了第二个变量,而换行就只输出一个换行,都没注意到,一位没执行!要向避免这个的话也好办,向楼上大家说的那样,我觉得简单的办法是在两个输入之间加入一个getchar()这样,换行就会被getchar()接受,在输入也不会有问题,这个方法我亲自试了的,绝对没有问题!谢谢你提出了这么个有价值的问题供 大家研究
2008-01-03 13:24
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
getchar() 返回的不可能是 \r ( 13 )。

我是为了去掉缓冲区中多余的字符,并且保证scanf() 可以读取下次的输入。

[[italic] 本帖最后由 cosdos 于 2008-1-3 19:09 编辑 [/italic]]

—>〉Sun〈<—
2008-01-03 19:06
b2831196
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2008-1-3
收藏
得分:0 

http://www.xiandai.

平时就是喜欢购物
2008-01-03 22:10
快速回复:学生档案管理问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027240 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved