目录

说明

1、实训目的

2、实训内容

3、系统需求分析

4、系统设计与实现

完整程序代码(纯C语言 代码)

5、系统测试与运行结果分析

6、心得体会

原创性声明


说明

大一下学期(2019年 上半年),开学第一周,C语言实训作业!展示作品!

2019 125日至 20193 1 日          C语言程序设计实训 总结报告

1、实训目的

C语言程序设计实训》是移动软件专业的主要实践性教学环节。通过本课程的实训,使学生在完成有关专业基础课学习的基础上,能够综合运用所学相关知识,并基于学生个人的创新创意,设计并实现相应的程序;使学生初步掌握程序设计的基本方法、初步具备运用程序设计解决实际问题的能力、初步具备进行工程设计的基本技能及分析能力,为毕业设计和以后的工程实践打下良好的基础。

2、实训内容

设计并实现一个学生通讯录管理系统。

3、系统需求分析

系统需求:用结构数组实现通讯录管理。

首先用switch分支结构,进行循环。

其次,用文件来存储学生信息。

然后,用函数实现不同的功能。例如:1.创建通讯录、2.显示通讯录、3.查询通讯录、4.修改通讯录、5.添加通讯录、6.删除通讯录、7.排序通讯录、8.退出等。

4、系统设计与实现

在C++环境下 ,编译运行,需要 添加 头文件 #include <cstdlib>

C++ 中error: ‘exit’ was not declared in this scope 的解决方法:添加头文件#include <cstdlib>

完整程序代码(纯C语言 代码

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

#define N 108

typedef struct telephone
{
    char name[25];
    char num[25];
    char tel[25];
} TEL;

void DisplayMenu(); //显示主菜单
void save(TEL a[], int n);
void CreateList(TEL a[], int n);      //1.创建通讯录
void DisplayList(TEL a[], int n);     //2.显示通讯录
void InquireListName(TEL a[], int n); //3.按姓名查询通讯录
void InquireListNum(TEL a[], int n);  //4.按学号查询通讯录
void ChangeListName(TEL a[], int n);  //5.按姓名修改通讯录
void ChangeListNum(TEL a[], int n);   //6.按学号修改通讯录
int DelListName(TEL a[], int n);      //7.按姓名删除通讯录
int DelListNum(TEL a[], int n);       //8.按学号删除通讯录
void UpSortListName(TEL a[], int n);  //9.姓名升序排序通讯录
void DownSortListNum(TEL a[], int n); //10.学号逆序排序通讯录
int AddList(TEL a[], int n);          //11.添加学生信息

int main()
{
    struct telephone a[N];
    int i, n;
    FILE *fp;

    if ((fp = fopen("stu.dat", "r")) != NULL) //如果文件stu.dat已存在
    { // 则把数据从文件加载到数组a(读入记录个数n和n个姓名、学号、电话号码)
        fscanf(fp, "%d", &n);
        for (i = 0; i < n; i++)
            fscanf(fp, "%s%s%s", a[i].name, a[i].num, a[i].tel);
    }
    else
    {
        printf("第一次使用该系统,请输入n和n个姓名、学号、电话号码:\n");
        scanf("%d", &n);
        for (i = 0; i < n; i++)
            scanf("%s%s%s", a[i].name, a[i].num, a[i].tel);
        save(a, n);
    }

    DisplayMenu(); //显示主菜单
    while (1)
    {
        char select;
        char name[25];
        scanf(" %c", &select);

        if (select < 'a' || select > 'l')
        {
            printf("输入错误!\n");
            continue;
        }
        //if( select=='l' )
        //    break;

        switch (select)
        {
        case 'a':
            DisplayMenu(); //显示主菜单
            break;
        case 'b':
            DisplayList(a, n); //2.显示通讯录
            break;
        case 'c':
            InquireListName(a, n); //3.按姓名查询通讯录
            break;
        case 'd':
            InquireListNum(a, n); //4.按学号查询通讯录
            break;
        case 'e':
            ChangeListName(a, n); //5.按姓名修改通讯录
            break;
        case 'f':
            ChangeListNum(a, n); //6.按学号修改通讯录
            break;
        case 'g':
            if (DelListName(a, n)) //7.按姓名删除通讯录
                n--;
            break;
        case 'h':
            if (DelListNum(a, n)) //8.按学号删除通讯录
                n--;
            break;
        case 'i':
            UpSortListName(a, n); //9.姓名升序排序通讯录
            break;
        case 'j':
            DownSortListNum(a, n); //10.学号逆序排序通讯录
            break;
        case 'k':
            if (AddList(a, n)) //11.添加学生信息
                n++;
            save(a, n);
            break;
        case 'l':
            exit(0); //12.退出系统
            break;
        }
    }
    return 0;
}

void save(TEL a[], int n)
{
    int i;
    FILE *fp;
    fp = fopen("stu.dat", "w");
    fprintf(fp, "%d\n", n);
    for (i = 0; i < n; i++)
        fprintf(fp, "%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
}

void DisplayMenu() //1.显示主菜单
{
    printf("                      学生通讯录管理系统\n\n");
    printf("*************************系统功能菜单**************************\n");
    printf(" -------------------------------------------------------------\n");
    printf("   a.显示主菜单                       b.显示通讯录\n");
    printf("************************************************************\n");
    printf("   c.按姓名查询通讯录                 d.按学号查询通讯录\n");
    printf("************************************************************\n");
    printf("   e.按姓名修改通讯录                 f.按学号修改通讯录\n");
    printf("************************************************************\n");
    printf("   g.按姓名删除通讯录                 h.按学号删除通讯录\n");
    printf("************************************************************\n");
    printf("   i.姓名升序排序通讯录               j.学号逆序排序通讯录\n");
    printf("************************************************************\n");
    printf("   k.添加学生信息                     l.退出系统\n");
    printf(" -------------------------------------------------------------\n");
    printf("***************************************************************\n\n");
    printf("请选择您需要的操作:\n");
}

void DisplayList(TEL a[], int n) //2.显示通讯录
{
    int i;
    printf("显示通讯录:\n");
    for (i = 0; i < n; i++)
        printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
    printf("\n");
}

void InquireListName(TEL a[], int n) //3.按姓名查询通讯录
{
    int i, flag;
    char SearchName[25];
    printf("按姓名查询通讯录:\n");
    scanf("%s", SearchName);
    for (i = 0, flag = 0; i < n; i++)
    {
        if (strcmp(SearchName, a[i].name) == 0)
        {
            printf("%s\t", a[i].name);
            printf("%s\t", a[i].num);
            printf("%s\n", a[i].tel);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
    {
        printf("未查询到该姓名信息!\n");
    }
    printf("\n");
}

void InquireListNum(TEL a[], int n) //4.按学号查询通讯录
{
    int i, flag;
    char SearchID[25];
    printf("按学号查询通讯录:\n");
    scanf("%s", SearchID);
    for (i = 0, flag = 0; i < n; i++)
    {
        if (strcmp(SearchID, a[i].num) == 0)
        {
            printf("%s\t", a[i].name);
            printf("%s\t", a[i].num);
            printf("%s\n", a[i].tel);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
    {
        printf("未查询到该学号信息!\n");
    }
    printf("\n");
}

void ChangeListName(TEL a[], int n) //5.按姓名修改通讯录
{
    int i, flag;
    char SearchName[25];
    printf("按姓名修改通讯录:\n");
    scanf("%s", SearchName);
    for (i = 0, flag = 0; i < n; i++)
    {
        if (strcmp(SearchName, a[i].name) == 0)
        {
            strcpy(a[i].name, SearchName);
            printf("请输入要修改的学号:");
            scanf("%s", a[i].num);
            printf("请输入要修改的电话号码:");
            scanf("%s", a[i].tel);
            //strcpy(p[i].name,ChangeName);
            //strcpy(p[i].name,ChangeTel);
            save(a, n);
            printf("信息修改完毕!\n");
            printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        printf("未找到该姓名信息!");
    printf("\n");
}

void ChangeListNum(TEL a[], int n) //6.按学号修改通讯录
{
    int i, flag;
    char SearchNum[25];
    printf("按学号修改通讯录:\n");
    scanf("%s", SearchNum);
    for (i = 0, flag = 0; i < n; i++)
    {
        if (strcmp(SearchNum, a[i].num) == 0)
        {
            strcpy(a[i].num, SearchNum);
            printf("请输入要修改的名字:");
            scanf("%s", a[i].name);
            printf("请输入要修改的电话号码:");
            scanf("%s", a[i].tel);
            //strcpy(p[i].name,ChangeName);
            //strcpy(p[i].name,ChangeTel);
            save(a, n);
            printf("信息修改完毕!\n");
            printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        printf("未找到该学号信息!");
    printf("\n");
}

int DelListName(TEL a[], int n) //7.按姓名删除通讯录
{
    int i, j;
    char SearchName[25];
    printf("按姓名删除通讯录:\n");
    scanf("%s", SearchName);
    for (i = 0; i < n; i++)
    {
        if (strcmp(a[i].name, SearchName) == 0)
            break;
    }
    if (i >= n)
    {
        printf("未查询到该姓名信息!按姓名删除通讯录失败!\n");
        return 0;
    }
    else
    {
        for (j = i; j < n - 1; j++)
            a[j] = a[j + 1];
        save(a, n);
        printf("按姓名删除通讯录成功!\n");
        return 1;
    }
}

int DelListNum(TEL a[], int n) //8.按学号删除通讯录
{
    int i, j, flag;
    char SearchNum[25];
    printf("按学号删除通讯录:\n");
    scanf("%s", SearchNum);
    for (i = 0; i < n; i++)
    {
        if (strcmp(a[i].num, SearchNum) == 0)
            break;
    }
    if (i >= n)
    {
        printf("未查询到该学号信息!按学号删除通讯录失败!\n");
        return 0;
    }
    else
    {
        for (j = i; j < n - 1; j++)
            a[j] = a[j + 1];
        printf("按学号删除通讯录成功!\n");
        save(a, n);
        return 1;
    }
    printf("\n");
}

void UpSortListName(TEL a[], int n) //9.姓名升序排序通讯录
{
    int i, j;
    TEL temp;
    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (strcmp(a[i].name, a[j].name) > 0)
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("姓名升序排序通讯录:\n");
    for (i = 0; i < n; i++)
        printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
    printf("\n");
}

void DownSortListNum(TEL a[], int n) //10.学号逆序排序通讯录
{
    int i, j;
    TEL temp;
    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (strcmp(a[i].num, a[j].num) > 0)
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("学号逆序排序通讯录:\n");
    for (i = n - 1; i >= 0; i--)
        printf("%s\t%s\t%s\n", a[i].name, a[i].num, a[i].tel);
    printf("\n");
}

int AddList(TEL a[], int n) //11.添加学生信息
{
    int i, flag;
    char AddNum[25];
    printf("添加通讯录:\n");
    printf("请输入要添加的学号:");
    scanf("%s", AddNum);
    for (i = 0, flag = 0; i < n; i++)
    {
        if (strcmp(AddNum, a[i].num) == 0)
        {
            flag = 1;
            printf("学号重复!\n");
            return 0;
        }
    }
    if (flag == 0)
    {
        //n++;
        printf("学号不重复!请添加信息:\n");
        printf("请输入要添加的名字:");
        scanf("%s", a[n].name);
        strcpy(a[n].num, AddNum);
        printf("请输入要添加的电话号码:");
        scanf("%s", a[n].tel);
        //save(a,n);
        printf("添加信息成功!\n");
        return 1;
        //printf("%d",n);
    }
    printf("\n");
}

5、系统测试与运行结果分析

涉及“文件操作”!

程序运行无误。本程序容错能力较强,有很强的错误查找能力。本程序各个小函数的联系性并不强,容易修改与改善。

运行结果无误。无论是“修改通讯录”还是“添加通讯录、删除通讯录”本程序都能够正确执行,并保存到文件之中,非常方便。 “删除通讯录”中“按姓名删除通讯录”与“按学号删除通讯录”分为两个函数,这使得“删除函数”更为简单、清晰,同时使得整个程序更为简单、优化。

 

6、心得体会

此次实训,收获甚多,受益匪浅。“学生通讯录管理系统”用到的知识很多,函数、结构、文件。缺少任何一部分,都无法编出完好的程序。另外,“学生通讯录管理系统”对思维能力要求苛刻,能够使学生真正地掌握所学知识。

原创性声明

本人郑重声明本报告内容,是由作者本人独立完成的。有关观点、方法、数据和文献等的引用已在文中指出。除文中已注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品成果,不存在剽窃、抄袭行为。

特此声明!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐