C语言课程设计手机通讯录程序设计

1、系统功能模块框图设计

图1 系统功能模块框图

2.数据结构说明

1)头文件
1.#include<stdio.h>,头文件stdio.hC语言标准输入输出函数库。
2.#include<stdlib.h>,头文件stdlib.hC语言实用工具函数库。
3.#include<windows.h>,头文件windows.h这是Windows平台下的系统库
#include<assert.h>,头文件,assert.h用来解决程序终止问题。(源于网络,在程序运行中需要一个结束程序的方法)

struct ITEM
{
    int key;
    int balue;
};

void additem(struct ITEM *itemptr)
{
    assert(itemptr != NULL);
}

2)结构体

定义了一个结构体类型,结构体名为“book”。
结构体成员分别为
1.字符类型char,成员名为name,用来表示通讯录姓名。
2.字符类型char,成员名为office,用来表示通讯录的办公电话。
3.字符类型char,成员名为home,用来表示通讯录的家庭电话。
4.字符类型char,成员名为move,用来表示通讯录的移动电话。
5.字符类型char,成员名为sex,用来表示通讯录的性别。
6.字符类型char,成员名为cla,用来表示通讯录的分组。

定义一个结构体变量s[M];

struct book
{
    char name[10];//姓名
    char office[20];//办公电话
    char home[20];//家庭电话
    char move[20];//移动电话
    char sex[10];//性别
    char cla[10];//分组
}s[M];

3、详细设计

(1)准备数据
建立数据文件,如下图2所示。
在这里插入图片描述
图2
(2)程序整体框架设计
思路分析:手机通讯录的信息存放在“JK0124.txt”文件中,在我的程序中并没有进行全局变量的定义,全是局部变量,也就是每个函数功能块都是单独的一个小程序。通过主函数进行调用,整个程序框架如下图3所示。

在这里插入图片描述

图3 系统框图
(3)主运行OPEN()函数和查阅信息refer()函数
思路分析:利用OPEN()函数调用各个功能模块。由于查询函数refer()和主运行函数的思路是一样的,都是先展示菜单部分,在使用swich选择结构进行选择,调用。所以下面以OPEN()函数进行详细说明。

第一步,先展示主菜单menu1(),根据用户键盘输入数字,判断并调用对应的功能函数。

void menu1()//主菜单
{
    printf("_________________________________\n");
    printf("|      手机通讯录操作系统       |\n");
    printf("|_______________________________|\n");
    printf("|*******************************|\n");
    printf("|**********1.查询信息***********|\n");
    printf("|**********2.修改数据***********|\n");
    printf("|**********3.添加数据***********|\n");
    printf("|**********4.删除数据***********|\n");
    printf("|**********5.进行排序***********|\n");
    printf("|**********6.退出系统***********|\n");
    printf("|*******************************|\n");
    printf("|_______________________________|\n");
}

第二步,根据用户键盘输入的数组,赋值给input。采用switch选择结构进行选择。并调用每个数字对应的函数功能块。

switch (input)
        {
        case 1:
            refer();
            break;
        case 2:
            modify();
            break;
        case 3:
            AddData();
            break;
        case 4:
            Delete();
            break;
        case 5:
            ordering();
            break;
        case 6:
            getout();
            additem(NULL);
            break;    
        
        default:
            printf("选择错误,请重新选择!\n");
            break;
        }
    } while (input);

(4)作者信息Front()函数
思路分析:使用windows系统下的系统库SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_);用来设置控制台的颜色信息。
使用一个for运行来延迟程序的运行,在for循环中使用了整数后加U来解决整数长度过长问题。
最后使用system(“cls”);清除指令,清除控制台信息。

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
 printf("\n");
 printf("                                         手机通讯录系统\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
 printf("\n");
 printf("                                          作者:XXX\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
 printf("\n");
 printf("                                        QQ:2238265682\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加
 printf("\n");
 printf("                                           请等待......");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
 for(int i =0 ;i<=3000000000U;i++){}
 system("cls");

(5)查询函数部分。姓名查询refername()函数,分组查询referclass()函数,办公电话查询officephone()函数,家庭电话查询homephone()函数,移动电话查询movephone()函数。
思路分析:查询函数部分的代码和思路基本一样,这里以姓名查询为例进行思路分析。唯一不一样的地方就在于查找的信息不同,对结构体体类型中成员的引用的不一样,也就是s[i].name还是s[i].cla的不同。
第一步:从键盘获取用户输入的查找信息。

char nam[100];
    printf("请输入你要查找的姓名->");
    scanf("%s",nam);

第二步,使用字符操作函数strcmp(str1,str2)进行两个字符串的比较。如果两个字符串相同就输入这一整条信息,如果不一样就输出查无此人。

while(!feof(fp))
    {
        if(strcmp(nam,s[i].name)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
            k=1;
            break;
        }
        i++;
    }
    
    if(k==0)
    {
        printf("\n对不起,查无此人!\n");
    }

(6)修改数据部分modify()函数
思路分析:
第一步,既然需要修改数据,首先就要对数据进行查询,判断所要查询的数据是否存在,这个查询部分就和上面的查询函数就有点相识了。

while(!feof(fp))
    {
        if(strcmp(nam,s[i].name)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
            k=1;
            break;
        }
        i++;
    }
    
    if(k==0)
    {
        printf("\n对不起,查无此人!\n");

第二步,查找到需要修改的信息后就要,对该数据进行修改,这里仍然要使用对字符串的操作函数,这里使用的是strcpy(str1,str2)字符串拷贝函数,将str2所指的字符串内容复制到str1所指的存储空间中,函数返回str1的值。

char num1[10];
            printf("\n请输入你要修改的新姓名信息->");
            scanf("%s",&num1);
            strcpy(s[i].name,num1);
            char num2[10];
            printf("\n请输入你要修改的新办公电话信息->");
            scanf("%s",&num2);
            strcpy(s[i].office,num2);
            char num3[10];
            printf("\n请输入你要修改的新家庭电话信息->");
            scanf("%s",&num3);
            strcpy(s[i].home,num3);
            char num4[10];
            printf("\n请输入你要修改的新移动电话信息->");
            scanf("%s",&num4);
            strcpy(s[i].move,num4);
            char num5[10];
            printf("\n请输入你要修改的新性别信息->");
            scanf("%s",&num5);
            strcpy(s[i].sex,num5);
            char num6[10];
            printf("\n请输入你要修改的新分组信息->");
            scanf("%s",&num6);
            strcpy(s[i].cla,num6);

(7)添加数据AddData()函数
思路分析:添加数据,事实上和修改数据的思路一样,只是添加数据不需要进行判断了,直接在数组的最后加一行,进行数据输入就可以了。同样使用字符串操作函数strcpy()函数进行字符串的操作。

char num1[10];
            printf("\n请输入你要添加的新姓名信息->");
            scanf("%s",&num1);
            strcpy(s[i].name,num1);
            char num2[10];
            printf("\n请输入你要添加的新办公电话信息->");
            scanf("%s",&num2);
            strcpy(s[i].office,num2);
            char num3[10];
            printf("\n请输入你要添加的新家庭电话信息->");
            scanf("%s",&num3);
            strcpy(s[i].home,num3);
            char num4[10];
            printf("\n请输入你要添加的新移动电话信息->");
            scanf("%s",&num4);
            strcpy(s[i].move,num4);
            char num5[10];
            printf("\n请输入你要添加的新性别信息->");
            scanf("%s",&num5);
            strcpy(s[i].sex,num5);
            char num6[10];
            printf("\n请输入你要添加的新分组信息->");
            scanf("%s",&num6);
            strcpy(s[i].cla,num6);

(8)删除数据Delete()函数

思路分析:删除数据事实上,就是将你要删除的数据替换掉就行了,也就是将所给的数据换成空字符串就行了。在删除数据中同样使用的是字符串操作函数strcpy(str1,str2),只是将这里的str2换成空字符串了。对于需要查找你要删除的信息的代码和添加数据已经修改数据一样都是一个字符查找操作。

strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," ");
            strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");

(9)排序操作ordering()函数

思路分析:运用了一个排序的模板,这里用变量m记录最小的数组元素下标,先设m=i,然后通过循环来实现,循环变量n从最小开始,不断比较。用当前最小值(s[n].name)与(s[m].name)进行比较,如果s[n].name小于s[m].name,然后运用结构体变量t将s[n].name与s[m].name进行对换。

for(i = 0;i < j;i++ )
    {
        m = i;
        for(int n = 1;n < i;n++)
        {    if(strcmp(s[n].name,s[m].name)>0)
                {
                    m = n;
                    
                    
                }   
                t = s[m];
                s[m] = s[n];
                s[n] = t;   
                
                
        }
    }   

4.完整代码如下

#include<stdio.h>
#include<stdlib.h>
#include<windows.h> 
#include<assert.h>
#define M 20
struct book
{
    char name[10];//姓名
    char office[20];//办公电话
    char home[20];//家庭电话
    char move[20];//移动电话
    char sex[10];//性别
    char cla[10];//分组
}s[M];
/
struct ITEM
{
    int key;
    int balue;
};

//
char title[100]; 
void OPEN();//总运行
void Front();//作者信息
void menu1();//主目录
void menu2();//查询目录
void refer();//查询页面
void getout();//退出程序
void input();//读取数据
void print();//输出数据 
void refername();//根据姓名查询 
void referclass();//根据分组类型查询
void officephone();//根据办公电话查询
void homephone();//根据办公电话查询
void movephone();//根据办公电话查询
void modify();//修改数据
void AddData();//添加数据
void Delete();//删除数据
void ordering();//进行排序


///
int main()
{
    Front();
    OPEN();
}
///
void Front()
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
 printf("\n");
 printf("                                         手机通讯录系统\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
 printf("\n");
 printf("                                          作者:乾中权\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
 printf("\n");
 printf("                                        QQ:2238265682\n");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加
 printf("\n");
 printf("                                           请等待......");
 printf("\n");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
 for(int i =0 ;i<=3000000000U;i++){}
 system("cls");
}
///
void getout()
{
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
        printf("\n");
        printf("\n");
        printf("               你已退出程序,欢迎下次使用。               ");
        printf("\n");
        printf("\n");
        for (int i = 0; i <= 3000000000U; i++){}
    
}

void additem(struct ITEM *itemptr)
{
    assert(itemptr != NULL);
}
/
void menu1()//主菜单
{
    printf("_________________________________\n");
    printf("|      手机通讯录操作系统       |\n");
	printf("|_______________________________|\n");
    printf("|*******************************|\n");
    printf("|**********1.查询信息***********|\n");
    printf("|**********2.修改数据***********|\n");
    printf("|**********3.添加数据***********|\n");
    printf("|**********4.删除数据***********|\n");
    printf("|**********5.进行排序***********|\n");
    printf("|**********6.退出系统***********|\n");
    printf("|*******************************|\n");
    printf("|_______________________________|\n");
}
void menu2()//查询菜单
{
	printf(" _________________________________\n");
    printf(" |         查询信息菜单           |\n");
    printf(" |________________________________|\n");
    printf(" |*******1.按姓名查询*************|\n");
    printf(" |*******2.按分组查询*************|\n");
    printf(" |*******3.按办公电话查询*********|\n");
    printf(" |*******4.按家庭电话查询*********|\n");
    printf(" |*******4.按移动电话查询*********|\n");
    printf(" |*******6.显示全部信息***********|\n");
    printf(" |*******0.返回上一级目录*********|\n");
    printf(" |********************************|\n");
    printf(" |________________________________|\n");
}
/
void refer()//refer查阅信息
{
    int Q;
    do
    {
        menu2();

        printf("请选择功能->");
        scanf("%d",&Q);

        switch (Q)
        {
        case 1:
            refername();
            break;
        case 2:
            referclass();
            break;
        case 3:
            officephone();
            break;
        case 4:
            homephone();
            break;
        case 5:
            movephone();
            break;
        
        case 6:
            print();
            break;
        case 0:
            OPEN();
            break;
        
        default:
            printf("选择错误,请重新选择!\n");
            break;
        }
    } while (Q);
    
}
//
void OPEN()//主运行
{
    int input;
    do
    {
        menu1();
        
        printf("请选择功能—>");
        scanf("%d",&input);
        
        switch (input)
        {
        case 1:
            refer();
            break;
        case 2:
            modify();
            break;
        case 3:
            AddData();
            break;
        case 4:
            Delete();
            break;
        case 5:
            ordering();
            break;
        case 6:
            getout();
            additem(NULL);
            break;    
        
        default:
            printf("选择错误,请重新选择!\n");
            break;
        }
    } while (input);


}
//
void input()//输入数据,查询所有数据
{
    FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    fgets(title,100,fp);
    int i=0;
    while (!feof(fp))
    
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        i++;
    }  
    fclose(fp);
}
//
void print()//输出所有数据
{
	int i;
	puts(title);
	for(i=0;i<M;i++)
	{
		printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
	
	}
}
//
void refername()//按姓名进行查询
{
    int k=0,i;
    char nam[100];
    printf("请输入你要查找的姓名->");
    scanf("%s",nam);
    
	FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    
	while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(nam,s[i].name)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        	k=1;
        	break;
        }
        i++;
    }
    
	if(k==0)
    {
        printf("\n对不起,查无此人!\n");
    }
    
	fclose(fp);
}
//
void referclass()//按分组进行查询
{
    int k=0,i=0;
    char nam[100];
    printf("请输入你要查找的分组类型->");
    scanf("%s",nam);
    printf("\n已查到该信息,记录为:\n");
    puts(title);
	FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    
	while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(nam,s[i].cla)==0)
        {
            
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        	k=1;
        }
        i++;
    }
    
	if(k==0)
    {
        printf("\n对不起,查无此类型!\n");
    }
    
	fclose(fp);
}

void officephone()//按办公电话查询
{
    int k=0,i;
    char nam[100];
    printf("请输入你要查找的办公电话->");
    scanf("%s",nam);
    
	FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    
	while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(nam,s[i].office)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        	k=1;
        	break;
        }
        i++;
    }
    
	if(k==0)
    {
        printf("\n对不起,查无此人!\n");
    }
    
	fclose(fp);
}
/
void homephone()//按家庭电话查询
{
    int k=0,i;
    char nam[100];
    printf("请输入你要查找的家庭电话->");
    scanf("%s",nam);
    
	FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    
	while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(nam,s[i].home)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        	k=1;
        	break;
        }
        i++;
    }
    
	if(k==0)
    {
        printf("\n对不起,查无此人!\n");
    }
    
	fclose(fp);
}
///
void movephone()//按移动电话查询
{
    int k=0,i;
    char nam[100];
    printf("请输入你要查找的移动电话->");
    scanf("%s",nam);
    
	FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    
	while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(nam,s[i].move)==0)
        {
            printf("\n已查到该信息,记录为:\n");
            puts(title);
            printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        	k=1;
        	break;
        }
        i++;
    }
    
	if(k==0)
    {
        printf("\n对不起,查无此人!\n");
    }
    
	fclose(fp);
}
///
void modify()//修改数据
{
int m,k=0,i=0;
    char namekey[10];
    printf("请输入你要修改的通讯录姓名->");
    scanf("%s",&namekey);

    FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp == NULL)
    {
        printf("文件打开失败!");
    }

        while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(namekey,s[i].name)==0)
        {
        	k=1;
        	break;
        }
        i++;
    }
    if (k==1)
    {
        printf("已经查到该姓名所对应的信息\n");
        puts(title);
        printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        printf("*********************\n");
        printf("******1.确定修改******\n");
        printf("******0.放弃修改******\n");
        printf("*********************\n");
        printf("请选择->");
        scanf("%d",&m);
        
        if(m==1)
        {   
            char num1[10];
            printf("\n请输入你要修改的新姓名信息->");
            scanf("%s",&num1);
            strcpy(s[i].name,num1);
            char num2[10];
            printf("\n请输入你要修改的新办公电话信息->");
            scanf("%s",&num2);
            strcpy(s[i].office,num2);
            char num3[10];
            printf("\n请输入你要修改的新家庭电话信息->");
            scanf("%s",&num3);
            strcpy(s[i].home,num3);
            char num4[10];
            printf("\n请输入你要修改的新移动电话信息->");
            scanf("%s",&num4);
            strcpy(s[i].move,num4);
            char num5[10];
            printf("\n请输入你要修改的新性别信息->");
            scanf("%s",&num5);
            strcpy(s[i].sex,num5);
            char num6[10];
            printf("\n请输入你要修改的新分组信息->");
            scanf("%s",&num6);
            strcpy(s[i].cla,num6);
            
            printf("修改成功\n");
            printf("修改后的通讯录信息如下\n");
            print();
        }
    }
    else 
    {
            printf("查无此人,无法修改!");
    }

    fclose(fp);
}

void AddData()//添加数据
{
    int i=0;
    FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp == NULL)
    {
        printf("文件打开失败!");
    }

        while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
        i++;
    }
            char num1[10];
            printf("\n请输入你要添加的新姓名信息->");
            scanf("%s",&num1);
            strcpy(s[i].name,num1);
            char num2[10];
            printf("\n请输入你要添加的新办公电话信息->");
            scanf("%s",&num2);
            strcpy(s[i].office,num2);
            char num3[10];
            printf("\n请输入你要添加的新家庭电话信息->");
            scanf("%s",&num3);
            strcpy(s[i].home,num3);
            char num4[10];
            printf("\n请输入你要添加的新移动电话信息->");
            scanf("%s",&num4);
            strcpy(s[i].move,num4);
            char num5[10];
            printf("\n请输入你要添加的新性别信息->");
            scanf("%s",&num5);
            strcpy(s[i].sex,num5);
            char num6[10];
            printf("\n请输入你要添加的新分组信息->");
            scanf("%s",&num6);
            strcpy(s[i].cla,num6);

            printf("添加成功\n");
            printf("添加后的通讯录信息如下\n");
            print();            

    fclose(fp);
}
///
void Delete()//删除数据
{
    int m,k=0,i=0;
    char namekey[10];
    long a;
    printf("请输入你要删除的通讯录姓名->");
    scanf("%s",&namekey);

    FILE *fp;
    fp = fopen("JK0124.txt","a");
    if (fp == NULL)
    {
        printf("文件打开失败!");
    }
        while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        if(strcmp(namekey,s[i].name)==0)
        {
        	k=1;
        	break;
        }
        i++;
    }
    

    if (k==1)
    {
        printf("已经查到该姓名所对应的信息\n");
        puts(title);
        printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);

        printf("*********************\n");
        printf("******1.确定删除******\n");
        printf("******0.放弃删除******\n");
        printf("*********************\n");
        printf("请选择->");
        scanf("%d",&m);
        int n;
        if(m==1)
        {
        	for(n = i; n < M-1;n++)
        	{
	        	strcpy(s[n].name,s[n+1].name);strcpy(s[n].office,s[n+1].office);strcpy(s[n].home,s[n+1].home);
	            strcpy(s[n].move,s[n+1].move);strcpy(s[n].sex,s[n+1].sex);strcpy(s[n].cla,s[n+1].cla);
        	}
            /*strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," ");
            strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");*/
            
            printf("删除成功\n");
            printf("删除后的通讯录信息如下\n");
            print();
        }
    }
    else 
    {
            printf("查无此人,无法修改!");
    }

    fclose(fp);
}
///
void ordering()//选择法排序操作
{
	int i=0,m,n,j=0;
	struct book t;
    FILE *fp;
    fp = fopen("JK0124.txt","r");
    if (fp == NULL)
    {
        printf("文件打开失败!");
    }

        while(!feof(fp))
    {
        fscanf(fp,"%s%s%s%s%s%s\n",s[j].name,s[j].office,s[j].home,s[j].move,s[j].sex,s[j].cla);
        j++;
    }
    
	
	for(i = 0;i < j;i++ )
    {
    	m = i;
	    for( n = i+1;n < j;n++)
	    {    if(strcmp(s[n].name,s[m].name)>0)
	            {
	            	m = n;	
				}	
	            t = s[m];
	            s[m] = s[n];
	            s[n] = t;	
	            
				
		}
	}	
	print();
    fclose(fp);
}


  • 22
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Android程序设计课程报告 "题 目: "360安全卫士 " "专 业: "软件工程 " "姓名 " "学 号: " " 1. 系统功能 1. 手机防盗 手机防盗主要实现对手机的保护,进入"手机防盗"模块,提示用户设置手 机保护密码,设置密码成功或者已经设置后进入保护程序,主要有以下几 个功能:SIM卡变更警报等。 2. 通讯卫士 通讯卫士主要实现对手机通讯录的备份,添加黑名单,防骚扰设置。 1.3 手机杀毒 手机杀毒主要实现对恶意软件的扫描,通过调用数据库中恶意软件标识特 征来识别本机是否含有恶意软件。 1.4 软件管理 软件管理实现对软件的管理,包括系统软件和用户软件,包含软件的卸载 程序。 5. 任务管理 任务管理实现对系统内存中的进程进行动态监控,满足用户对无响应占资 源的进程结束机制。但不允许用户结束系统进程。 6. 流量管理 流量管理实现对各进程访问网络数据量的监控。 7. 系统优化 系统优化实现优化系统,对系统开机项进行优化、系统垃圾清理。 8. 隐私空间 隐私空间实现用户保存一些重要的文件,访问需要独立密码。 9. 高级工具 高级工具实现一些日常需要的帮助。 10. 设置中心 设置中心实现用户对操作习惯的设置,如界面颜色、升级服务、程序锁、 退出等操作。 二、项目分析 2.1 主界面 新建类SplashActivity设置不要提示标题栏并且全屏显示。检查是否升级版本。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.splash); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); tv_version = (TextView) findViewById(R.id.tv_splash_version); version = getVersion(); tv_version.setText("版本号 " + version); ll = (LinearLayout) findViewById(R.id.ll_splash_main); AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f); alphaAnimation.setDuration(2000); ll.startAnimation(alphaAnimation); progressDialog = new ProgressDialog(this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("正在下载..."); new Thread() { public void run() { try { sleep(3000); handler.sendEmptyMessage(0); } catch (InterruptedException e) { e.printStackTrace(); } }; }.start(); } private void showUpdateDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle("升级提醒"); builder.setMessage(info.getDescription()); builder.setCancelable(false); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dir = new File(Environment.getExt
一:需求分析 二:总体设计 三:详细设计 四:调试与测试 五;测试结果 六:本次课程设计的心得体会 七:附录 本程序设计亮点介绍(及)改进方面 1.在修改函数中,可以实现单条记录修改(运用switch) 2.查询函数中,能返回该函数继续查询(运用了递归) 3.使用变量少,仅通过变量i的递加和表示成员数的变量n就实现了数据结构体之间的联 系 4.界面美观,使用方便 5.允许编号输入为字符 6.在显示函数上能够分屏显示(换页) 缺点 在输入数据时,未输完一个成员的所有信息不能退出输入 一:需求分析 A.需要实现的功能有:输入功能、输出功能、显示功能、查找功能、以及增加、删 除、修改功能。输入功能要求一次完成若干信息的输入;显示功能要能完成所有信息的 显示,并且自动分页;查找可以通过多种方式进行。 按需求的功能,应该设计出输入函数、输出函数、显示函数、查找函数、修改函数。另 需要一个标准界面。 B.数据存储问题 这个系统数据庞大复杂,需要需要适当应用数组,循环,结构体,文件操作等基本 语句及稍有难度的语句。因此要求我们熟练掌握结构化程序设计的基本思路和方法,在 所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定 程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,利用自己所学知识 解决实际问题的能力,为以后的程序开发打下基础。 二:总体设计 主要结构图示 本程序由主函数和多个子函数组成,可执行多种数据管理的功能。具体通过c语言中 结构体数组来实现。主函数主体为定义的结构体,和一个switch函数,以提供多种程序 操作功能。 主要需运用到结构体数组、文件、函数等内容知识。 子函数有六个,分别负责添加、显示、删除、查询、修改、保存的功能。通过变量i使结 构体数组之间达成数据链表的功能,利用该方法主要考虑到成员中对于结构体指针尚未 熟练掌握,而这种方法更加便捷易懂。 子函数功能介绍 1. 添加:输入成员信息,依次输入编号、姓名、QQ、电话号码、单位、电子邮箱、身 份。 2. 显示:以表格形式输出所有通讯记录 3. 删除:只需输入该成员姓名,便删除其所有记录 4. 查询:可选用姓名、电话、单位身份4种方式来查询 5. 修改:输入该成员姓名后,再依次输入更新信息完成修改 6. 保存:输入文件名(带后缀)后保存。C-free中会默认以txt文件保存至c- free standard/temp文件夹中 三:详细设计 1. 主函数 完成变量的初始化与函数的定义之后,运用for( ; ; )来开启一个无限循环。循环内有switch函数来实现函数的选择功能,case1、case2等分 别执行不同的函数操作,每个函数中调用了相应的函数,并采用函数system("pause") ;暂停等待按键。在case6中采用函数exit(0)跳出循环。 下面在讲一下主函数中定义的n的作用,n的初值是1,当执行完case1中的函数input ( )后返回值为n+i,i为输入的成员数,返回值重新赋给n,n变为成员数,从而确定了之后 display()等函数循环中的终止条件。 2. 分函数 【1】添加 【2】显示 【3】删除 【4】查询 【5】修改 保存函数:【1】定义一个文件指针fp 【2】输入想创建的文件名称,如filename 【3】开辟文件,用fopen以"写"的方式打开,并把fp指针指向该文件 【4】在文件中输入信息 【5】保存(即fclose(filename)) 查询函数:运用了if来实现选择,并通过递归返回继续查询。 注:身份以及单位的查询方式有所不同,单位只能查找一条符合的记录,而按身份查询 可显示所有符合的信息。若查找不到,则返回继续查询,选择5返回则退出查询。 四:调试与测试 我们编写的函数具有一定的容错能力。具体表现为 【1】如select函数中输入0-6以外的数,则循环继续进行,直到输入0-6为止 【2】sign!='n'&&sign!='N'语句保证了大小写不会影响结果 【3】while(m!='1'&&m!='2'&&m!='3'&&m!='4') { printf("输入错误,请重新选择:"); scanf("%c",&m); }保证了输入正确 【4】当输入的成员信息错误时,可通过修改函数进行改动 五:测试结果 1.主函数运行正常。通过for语句是界面循环,并有switch及system函数进行配合调节 达到目的。(界面显示如下) 2.测试结果:运行正常,达到了预订的目标。 此处为通过保存函数保存后的txt文本中的学生信息 六:心得 课程设计是一个不断学习、思考、编写、修改的过程。它对我们的能力提出了挑战。 我不仅意识到c语言基础的重要性,更意识到了自学能力的重要性,同学学习书本,查找 资料等多种途径来构建思
通讯录程序设计是一种用C语言编写的程序,用于管理个人联系信息。根据引用\[1\]中的代码片段,该程序包含了输入函数`write()`、`write1()`和`write2()`,以及输出函数`show()`。输入函数用于接收用户输入的联系信息,包括姓名、家庭电话、地址、邮编和E-mail。输出函数用于显示已输入的联系信息。 在程序中,`write()`函数通过调用`write1()`函数来实现循环输入联系信息的功能。`write1()`函数根据用户输入的选项,调用`write2()`函数继续输入信息,或者调用`next()`函数停止输入。`write2()`函数用于接收用户输入的具体联系信息,并将其存储在相应的数据结构中。 另外,根据引用\[3\]中的代码片段,输出函数`show()`用于显示已输入的联系信息。它通过循环遍历存储联系信息的数据结构,并将每个联系人的信息逐行输出。 总结来说,这个C语言通讯录程序设计包括了输入函数和输出函数,通过用户输入来管理个人联系信息,并可以显示已输入的信息。这样的程序设计可以帮助用户方便地管理和查看联系人的信息。 #### 引用[.reference_title] - *1* *2* *3* [C语言课程设计_通讯录管理系统](https://blog.csdn.net/NBITer/article/details/128591706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值