对数据的存储结构有要求吗?
#include
#include
const int MAX_NAME = 99;
const int MAX_PHONE = 27;
const int MAX_ADDR = 127;
typedef struct _PersonInfo
{
char name[MAX_NAME + 1];
char phone[MAX_PHONE + 1];
char addr[MAX_ADDR + 1];
}PersonInfo ;
const char *ID = "编号:";
const char *NAME = "姓名:";
const char *PHONE = "电话:";
const char *ADDR = "地址:";
const int MAX_NUM = 512;
PersonInfo g_piArry[MAX_NUM];
static int read_line ( FILE *fp, char *line, int max_length )
{
int i;
char ch;
/* initialize index to string character */
i = 0;
/* read to end of line, filling in characters in string up to its
maximum length, and ignoring the rest, if any */
for(;;)
{
/* read next character */
ch = fgetc(fp);
/* check for end of file error */
if ( ch == EOF )
return -1;
/* check for end of line */
if ( ch == '\n' )
{
/* terminate string and return */
line[i] = '\0';
return 0;
}
/* fill character in string if it is not already full*/
if ( i < max_length )
line[i++] = ch;
}
/* the program should never reach here */
return -1;
}
void menu_add();
void menu_print();
void menu_delete();
void menu_modify();
void menu_detail();
/* codes for menu */
#define PRINT_CODE 1
#define ADD_CODE 2
#define DEL_CODE 3
#define MOD_CODE 4
#define DETAIL_CODE 5
#define EXIT_CODE 6
int main(void)
{
memset(g_piArry, 0, sizeof(g_piArry));
for(;;)
{
int choice, result;
char line[301];
// FILE *fp1=fopen("input2","r");
/* print menu to standard error */
fprintf ( stderr, "\nOptions:\n" );
fprintf ( stderr, "%d: 显示所有已录入的通讯录\n", PRINT_CODE );
fprintf ( stderr, "%d: 录入新纪录\n", ADD_CODE );
fprintf ( stderr, "%d: 删除一条记录\n", DEL_CODE );
fprintf ( stderr, "%d: 修改一条纪录\n", MOD_CODE );
fprintf ( stderr, "%d: 根据姓名,电话或地址查询相关信息\n", DETAIL_CODE );
fprintf ( stderr, "%d: 退出系统\n", EXIT_CODE );
fprintf ( stderr, "\nEnter option: " );
if ( read_line ( stdin, line, 300 ) != 0 ) continue;
// read_line (fp1 , line, 300 ) ;
//printf("\n-----------%s-----------\n",line);
result = sscanf ( line, "%d", &choice );
if ( result != 1 )
{
fprintf ( stderr, "corrupted menu choice\n" );
continue;
}
switch ( choice )
{
case ADD_CODE: /* add book to database */
menu_add();
break;
case PRINT_CODE: /* get book details from database */
menu_print();
break;
case DEL_CODE: /* delete book from database */
menu_delete();
break;
case MOD_CODE: /* print database contents to screen
(standard output) */
menu_modify();
break;
case DETAIL_CODE: /* print tree to screen (standard output) */
menu_detail();
break;
/* exit */
case EXIT_CODE:
break;
default:
fprintf ( stderr, "illegal choice %d\n", choice );
break;
}
/* check for exit menu choice */
if ( choice == EXIT_CODE )
break;
}
return 0;
}
bool isdigit(char n)
{
if (n <= '9' && n >= '0')
{
return true;
}
else
{
return false;
}
}
int IsString(char *szBuff)
{
const int nLen = strlen(szBuff);
int nDigitCnt = 0;
int nPos = 0;
for (nPos = 0; nPos < nLen; nPos++)
{
if (isdigit(szBuff[nPos]))
{
nDigitCnt++;
}
}
if (nLen == nDigitCnt)
{
fprintf(stderr, "The words(%s) which you entered is digits, enter again!\n", szBuff);
return 0;
}
return 1;
}
/* trim the space of the words */
static int trim_space(char *p)
{
char *q = NULL;
if(*p != '\0')
{
q = p + strlen(p) - 1;
}
else
{
return -1;
}
for(; *q == ' '; q--);
*(q + 1) ='\0';
for(q = p; *q == ' '; q++);
strcpy(p,q);
return 0;
}
void print_node(PersonInfo *node, int n)
{
fprintf(stderr, "%s", ID);
printf("%d\n", n);
fprintf(stderr, "%s", NAME);
printf("%s\n", node->name);
fprintf(stderr, "%s", PHONE);
printf("%s\n", node->phone);
fprintf(stderr, "%s", ADDR);
printf("%s\n", node->addr);
}
void menu_add()
{
char name[MAX_NAME + 1] = {0};
char phone[MAX_PHONE + 1] = {0};
char addr[MAX_ADDR + 1] = {0};
int nId = 0;
do
{
fprintf(stderr, "%s", ID);
scanf("%d", &nId);
getchar();
}while(nId >= MAX_NUM && nId < 1);
int nLen = 0;
do
{
fprintf(stderr, "%s", NAME);
fgets(name, MAX_NAME, stdin);
nLen = strlen(name) - 1;
name[nLen] = '\0';
trim_space(name);
}while (!IsString(name));
fprintf(stderr, "%s", PHONE);
fgets(phone, MAX_PHONE, stdin);
nLen = strlen(phone) - 1;
phone[nLen] = '\0';
fprintf(stderr, "%s", ADDR);
fgets(addr, MAX_ADDR, stdin);
nLen = strlen(addr) - 1;
addr[nLen] = '\0';
nId = nId - 1;
PersonInfo *pi = &g_piArry[nId];
if (0 != strlen(pi->name))
{
int i = 0;
for (i = MAX_NUM; i > nId; i--)
{
memcpy(&g_piArry[i], &g_piArry[i - 1], sizeof(PersonInfo));
}
}
strcpy(pi->name, name);
strcpy(pi->phone, phone);
strcpy(pi->addr, addr);
return;
}
void menu_print()
{
int n = 0;
for (n = 0; n < MAX_NUM; n++)
{
if (0 != strlen(g_piArry[n].name))
{
print_node(&g_piArry[n], n + 1);
}
}
return;
}
void menu_delete()
{
int nId = 0;
do
{
fprintf(stderr, "%s", ID);
scanf("%d", &nId);
getchar();
}while(nId >= MAX_NUM && nId < 1);
PersonInfo *pi = &g_piArry[nId];
int i = 0;
for (i = nId - 1; i < MAX_NUM - 1; i++)
{
memcpy(&g_piArry[i], &g_piArry[i + 1], sizeof(PersonInfo));
}
fprintf(stderr, "删除成功(%s)", nId);
return ;
}
void menu_modify()
{
int nId = 0;
do
{
fprintf(stderr, "%s", ID);
scanf("%d", &nId);
getchar();
}while(nId >= MAX_NUM && nId < 1);
char name[MAX_NAME + 1] = {0};
char phone[MAX_PHONE + 1] = {0};
char addr[MAX_ADDR + 1] = {0};
int nLen = 0;
do
{
fprintf(stderr, "%s", NAME);
fgets(name, MAX_NAME, stdin);
nLen = strlen(name) - 1;
name[nLen] = '\0';
trim_space(name);
}while (!IsString(name));
fprintf(stderr, "%s", PHONE);
fgets(phone, MAX_PHONE, stdin);
nLen = strlen(phone) - 1;
phone[nLen] = '\0';
fprintf(stderr, "%s", ADDR);
fgets(addr, MAX_ADDR, stdin);
nLen = strlen(addr) - 1;
addr[nLen] = '\0';
nId = nId - 1;
PersonInfo *pi = &g_piArry[nId];
strcpy(pi->name, name);
strcpy(pi->phone, phone);
strcpy(pi->addr, addr);
return ;
}
void menu_detail()
{
int nId = 0;
do
{
fprintf(stderr, "%s", ID);
scanf("%d", &nId);
getchar();
}while(nId >= MAX_NUM && nId < 1);
print_node(&g_piArry[nId - 1], nId);
return;
}
假设记录通讯录的表名为:TList
1. select * from TList
2. insert into TList(...) values(...)
3.delete from TList where ...
4.update TList set ... Where...
5.select * from TList Where name=? or name='' ....
界面用C++写,数据库就用SQL SERVER,简单方面。
需求再明确一下:
1.比如之前有3条记录,他们的序号为1、2、3,删除第二条记录之后,第三条记录的序号是仍然为3还是变为2?
2.删除和修改记录的时候分别根据什么进行删除或修改?序号?名字?还是其它?
比如之前有3条记录,他们的序号为1、2、3,删除第二条记录之后,第三条记录的序号是仍然为3还是变为2?
你QQ或是邮箱多少,我把源文件发给你。