西安邮电学院首届“周立功杯”大学生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.
为了验证上述模块的正确性,可以再主函数中编写一个菜单来完成上功能述模块的选择调用。另外,以上任务在字符模式下完成就可以了。
题目答案
#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;
}
回复 2# sfzm 的帖子
当时我是把题目的意思给弄错了,几乎得了个零分(或许说就是零分)。要把题目在限定的时间内完整的解决还是有难度的。回到宿舍没事干,花了两个小时又写了一个,貌似正确,只能在TC和WIN-TC下能编译通过。若有错误,或不好之处,请读者提出来。 Good!───────────────小问题:
修改密码是change password,check是检查
你的substring好像没有考虑忽略大小写。
修改密码、查询应该检查是否用户已登录
default: break; 没有任何作用直接去掉。 楼主很强!
版主更强! 谢谢分享
mark 看不懂……:emot-04
......
复赛机试有位美女老师站旁边太影响发挥,以至于用错函数,满盘皆输,走时候一男老师问我做过C课程设计没!!!!X他XX的!不过女老师的确挺漂亮,呵呵...不知楼上的朋友注意到了没!虽然无缘决赛,但也饱眼福了,也算有收获吧!:emot-04回复 8# 我不是美女 的帖子
你可知道她的名字,西邮的美女老师不多啊。......
楼上的想干嘛?难不成师生恋! 莫非是白琳?呵呵
随便看了几行这答案不咋地
容错完全不管,指针什么的直接申请就用,万一没申请到呢?do循环死了会不会自己跳出?程序会不会跑飞?
要真放在实用的软件里,死的不知道多难看……
页:
[1]

