功能导航:→

西安邮电学院论坛[西邮论坛]'s Archiver

sfzm 发表于 2008-6-12 22:14

西安邮电学院首届“周立功杯”大学生C语言设计竞赛

西安邮电学院首届“周立功杯”大学生C语言设计竞赛上机考试题目 (时间: 100分钟)
系统用户管理是许多应用软件里不可缺少的部分,请使用C语言为某软件开发一个简单的用户管理子系统,具体功能要求如下:
    1、添加新用户(40分)
在系统中为新用户创建一个访问系统的账号,其中用户名的长度限制在1~6个字符之间觉不分大小写;用户密码长度限制在6到10个字符之间,区分大小写。在输入新用户名是,需要判断输入的用户名是否已经存在,若已经存在提示用户重新输入;在输入哟陪你过户密码时,需要分别输入“用户密码”和“确认密码”,若两者不一致则提示用户并要全部重新输入;用户输入密码时,不允许直接在屏幕上显示密码,必须用*号代替;系统中所用的帐户存储在一个数据库文件中。
    2、系统登录(20分)
在用户登录时对用户身份进行确认。当输入了用户和密码后,判断输入的用户名是否存在且密码正确,若用户合法,则提示登录成功;否则,提示“用户名或密码错误”,让用户重新输入;注意,只允许用户尝试3次,超3次则显示“非法用户”并退出该模块。
    3、密码修改(20分)
在修改用户密码时,需要输入用户名和原始密码,以及新密码和确认密码;当用户和原始密码正确及新密码和确认密码一致时,更新用户密码,否则提示用户错误原因,即“用户名或密码错误”或“新密码和确认密码不一致”。
    4、用户查询(20分)
为用户管理提供模糊查询功能。当输入检索词后,查询出所有用户名中包含该检索次的用户。例如:假设当前系统中包含的用户有abc, bab, cab和cba,如果用户输入的检索词时ab或AB,则检索出来的用户应包括 abc,bab和cab.
为了验证上述模块的正确性,可以再主函数中编写一个菜单来完成上功能述模块的选择调用。另外,以上任务在字符模式下完成就可以了。

sfzm 发表于 2008-6-12 22:15

题目答案

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>

typedef struct{
    char name[7];
    char secret[11];
}User_t;

void getname(char *str)
{
    char name[32];
    char c;
    int k;

    do{
        printf("\nEnter name and press ENTER:  ");
        scanf("%s", name);
        if(strlen(name) > 6){
            printf("Name is too long!\nPress Y to enter it again or N to exit! ");
            c = bioskey(0);
            putchar(c);
        }
        else{
            k = strlen(name);
            memcpy(str, name, k);
            str[k] = '\0';
            break;
        }
    }while(c == 'Y' || c == 'y');
    if(c == 'N' || c == 'n')
        exit(1);
}

void getsecret(char *str, int sgin)
{
    char secret[2][16];
    char c;
    int k, s, i = 0;
    int N;

    if(sgin)  N = 2;
    else  N = 1;
    do{
        for(k = 0; k < N; k++){
            printf("\nEnter secret end with ENTER:  ");
            i = 0;
            while((c = bioskey(0)) != 13 /*CR*/ ){
                putchar('*');
                secret[k][i] = c;
                i++;
            }
            secret[k][i] = '\0';
            if(i < 6 || i > 10){
                printf("\n Not good secret!\nPress Y to input again or N to exit! ");
                c = bioskey(0);
                putchar(c);
            }
            else{
                s = strlen(secret[k]);
                memcpy(str, secret, s);
                str[s] = '\0';
            }
        }
        if(N == 2 && (strcmp(secret[0], secret[1]) != 0)){
            printf("\nThe second input does not same with rhe first.\nPress Y to input again or N to exit! ");
            c = bioskey(0);
            putchar(c);
        }
    }while(c == 'Y' || c == 'y');
}

char *filename(char *name)
{
    char fname[16];
    char *file = "data\\";
    char sname[11];
    char *s = ".txt";

    strcpy(sname, name);
    strcat(sname, s);
    strcpy(fname, file);
    strcpy(fname, strcat(fname, sname));

    return fname;
}

void  adduser(void)
{
        FILE *fp, *fl;
    User_t user1, user2;
    int i;
    char Fname[16];
    char c;

    if((fl = fopen("data\\name.txt", "ab")) == NULL)
        fl = fopen("data\\name.txt", "wb");
    do{
        getname(user1.name);
        getsecret(user1.secret, 1);

        fprintf(fl, "%7s", user1.name);
        strcpy(Fname, filename(user1.name));
        if((fp = fopen(Fname, "rb+")) == NULL)
            fp = fopen(Fname, "wb+");
        while(!feof(fp)){
            fread(&user2, sizeof(User_t), 1, fp);
            for(i = 0; i < strlen(user1.name); i++){
                user1.name[i] = tolower(user1.name[i]);
                user2.name[i] = tolower(user2.name[i]);
            }
            if(strcmp(user1.name, user2.name) == 0){
                printf("\nname has be used!\nPress C to Enter it again or E to exit! ");
                fclose(fp);
                c = bioskey(0);
                putchar(c);
                break;
            }
        }
        if(feof(fp)){
            fclose(fp);
            fp = fopen(Fname, "ab+");
            fwrite(&user1, sizeof(User_t), 1, fp);
            fclose(fp);
            printf("\nAdd user sccessful!\nPress C to add continue or E to exit! ");
            c = bioskey(0);
            putchar(c);
        }
    }while(c == 'C' || c == 'c');
    fclose(fl);
}

void login(void)
{
    FILE *fp;
    User_t user1, user2;
    char Fname[16];
    int i;
    int k = 0;

    do{
        getname(user1.name);
        getsecret(user1.secret, 0);
        strcpy(Fname, filename(user1.name));
        fp = fopen(Fname, "rb");
        while(!feof(fp)){
            fread(&user2, sizeof(User_t), 1, fp);
            for(i = 0; i < strlen(user1.name); i++){
                user1.name[i] = tolower(user1.name[i]);
                user2.name[i] = tolower(user2.name[i]);
            }
            if((strcmp(user1.name, user2.name) == 0) && (strcmp(user1.secret, user2.secret) == 0) ){
                printf("\nLogin sccessful!");
                return ;
            }
        }
        if(feof(fp)){
            printf("\nname or secret ERROR! ");
        }
        k++;
    }while(k < 3);
    if(k >= 3)
        printf("\nBad user!\n");
}

void check_secret(void)
{
    FILE *fp;
    User_t user1, user2;
    char Fname[16];
    int i;


    getname(user1.name);
    getsecret(user1.secret, 0);
    strcpy(Fname, filename(user1.name));
    fp = fopen(Fname, "rb");
    while(!feof(fp)){
        fread(&user2, sizeof(User_t), 1, fp);
        fclose(fp);
        for(i = 0; i < strlen(user1.name); i++){
            user1.name[i] = tolower(user1.name[i]);
            user2.name[i] = tolower(user2.name[i]);
        }
        if(strcmp(user1.name, user2.name) == 0){
            if( strcmp(user1.secret, user2.secret) == 0 ){
                getsecret(user1.secret, 1);
                strcpy(user2.secret, user1.secret);
                fp = fopen(Fname, "wb");
                fwrite(&user1, sizeof(User_t), 1, fp);
                fclose(fp);
                printf("\nchange secret sccessful!\n");
            }
            else{
                printf("\nsecret ERROR!\n");
            }
            break;
        }
    }
    if(feof(fp)){
        printf("\nname or secret ERROR! ");
    }
}

int substring(char *
s1, char *s2)
{
    int i = 0, j = 0;

    while(i < strlen(s1) && j < strlen(s2)){
        if(s1[i] == s2[j]){
            i++;
            j++;
        }
        else{
                i = i-j+1;
            j = 0;
        }
    }
    if(j >= strlen(s2))
        return 1;
    return 0;
}

void search_user(void)
{
    FILE *fl;
    char name1[7], name2[7];

    printf("\nInput name:  ");
    scanf("%s", name1);
    fl = fopen("data\\name.txt", "rb");
    printf("\nThe output:\n\t");
    while(!feof(fl)){
        fscanf(fl, "%7s", name2);
        if(substring(name2, name1)){
            printf("\n\t%s\n\t", name2);
        }
    }
}

int main(void)
{
    int c;
    clrscr();

    while(1){
        printf("\n\t0  to exit.");
        printf("\n\t1  add user.");
        printf("\n\t2  login.");
        printf("\n\t3  change secret.");
        printf("\n\t4  seach user.\n\n\t");

        scanf("%d", &c);
        switch(c){
            case 0:  break;
            case 1: adduser(); break;
            case 2: login();  break;
            case 3: check_secret(); break;
                case 4: search_user(); break;
            default: break;
        }
        if(c < 1 || c > 4)
            break;
    }
    return 0;
}

sfzm 发表于 2008-6-12 22:21

回复 2# sfzm 的帖子

当时我是把题目的意思给弄错了,几乎得了个零分(或许说就是零分)。要把题目在限定的时间内完整的解决还是有难度的。回到宿舍没事干,花了两个小时又写了一个,貌似正确,只能在TC和WIN-TC下能编译通过。若有错误,或不好之处,请读者提出来。

静听花开 发表于 2008-6-14 15:46

Good!
───────────────小问题:
修改密码是change password,check是检查
你的substring好像没有考虑忽略大小写。
修改密码、查询应该检查是否用户已登录
default: break;  没有任何作用直接去掉。

白色的冰 发表于 2008-6-16 02:38

楼主很强!
版主更强!

rkw123 发表于 2008-10-10 14:22

谢谢分享
mark

Tlost_heaven 发表于 2008-10-10 21:52

看不懂……:emot-04

我不是美女 发表于 2008-10-13 22:16

......

复赛机试有位美女老师站旁边太影响发挥,以至于用错函数,满盘皆输,走时候一男老师问我做过C课程设计没!!!!X他XX的!不过女老师的确挺漂亮,呵呵...不知楼上的朋友注意到了没!虽然无缘决赛,但也饱眼福了,也算有收获吧!:emot-04

sfzm 发表于 2008-10-18 16:47

回复 8# 我不是美女 的帖子

你可知道她的名字,西邮的美女老师不多啊。

我不是美女 发表于 2008-10-19 21:45

......

楼上的想干嘛?难不成师生恋!

漂流瓶 发表于 2008-10-19 22:16

莫非是白琳?

void 发表于 2008-12-2 15:08

呵呵

随便看了几行
这答案不咋地
容错完全不管,指针什么的直接申请就用,万一没申请到呢?do循环死了会不会自己跳出?程序会不会跑飞?
要真放在实用的软件里,死的不知道多难看……

页: [1]
西邮论坛管理团队期待您的加入!

Powered by 西安邮电学院论坛[西邮论坛] Archiver 6.1.0  © 2001-2007 discuz 欢迎光临站长论坛发表您的建站故事