數據結構實驗報告(一)學生信息管理系統

大二計算機學生報告的彙總

進入計算機專業以來每天的必要工作就是寫報告,按照老師的話來說,我們計算機專業的學生經過長時間的訓練,以後出去寫代碼就跟喝水一樣簡單.在這裏我將發表部分我寫的報告,僅以此懷念我的大二時光.(報告寫的不好.僅供欣賞)

報告彙總之c語言數據結構報告篇(一)

學生信息管理系統

代碼區

代碼說明:此代碼所運用的軟件是ios系統的x-code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int sum;
//創建一個學生的信息結構體
typedef struct student{
    long id;
    char name[64];
    float grade;
}s;
//定義順序表
typedef struct {
    s* student;
    int length;
}SqList;
//構造空順序表
int CreatStudent(SqList*L){
    L->student=(s*)malloc(sizeof(s));
    if (L->student==NULL)
        return 0;
    else
    {
        L->length=0;
        return 1;
    }
}
//錄入基礎學生信息和需要插入的學生信息
void GetStudent(SqList*L,int i){
    printf("請輸入學生的學號:");
    scanf("%ld",&L->student[i].id);
    printf("請輸入學生的姓名:");
    scanf("%s",L->student[i].name);
    printf("請輸入學生的成績:");
    scanf("%f",&L->student[i].grade);
    L->length++;
}
void jiaohuan(SqList*L,int i);
//打印學生信息
void PrintStudent(SqList*L,int i)
{
    printf("%ld\n%s\n%.3f\n\n",L->student[i].id,L->student[i].name,L->student[i].grade);
}
//查找指定的學生信息
void FindStudent (SqList*L)
{
    int n;
    printf("請輸入查找方式:\n0=學號查找\n1=存儲位置查找");//查找方式的選擇
    scanf("%d",&n);
    printf("請輸入需要查找學生的信息:");
    switch (n) {
        case 0:
        {
            long number;//輸入需要查找的學生學號
            scanf("%ld",&number);
            for (int i=0;i<=L->length;i++)
            {
                if (number==L->student[i].id)
                    PrintStudent(L,i);//打印出查找到的學神信息
            }
            break;
        }
        case 1:
        {
            int number;
            scanf("%d",&number);//輸入需要查找的學生位置
            PrintStudent(L,number-1);
            break;
        }
        default:
            printf("您輸入的查找方式有誤請確認後再操作");
            break;
    }
    
}
//刪除指定的學生信息
void DeletStudent (SqList*L,int i)
{
    if(i<0||i>sum)
        printf("輸入信息有誤");
    else
    {
        for (int m=i-1;m<sum;m++)
        {
            L->student[m]=L->student[m+1];
        }
        //刪除
        sum--;
        L->length--;
    }
}
//更新表中的學生信息
void ReGetStudent (SqList*L)
{
    int p;
    printf("請輸入需要更新的位置:");
    scanf("%d",&p);
    GetStudent(L, p-1);
}
void charu(SqList* L)
{
    printf("請輸入需要插入的位置:");
    int p;
    scanf("%d",&p);
    GetStudent(L, sum);
    sum++;
    for (int i=sum-1;i>p-1;i--)
        jiaohuan(L,i);
    
    
}
void jiaohuan(SqList*L,int i)
{
    long a;
    a=L->student[i-1].id;
    L->student[i-1].id=L->student[i].id;
    L->student[i].id=a;
    char b[64];
    strcpy(b, L->student[i-1].name);
    strcpy(L->student[i-1].name,L->student[i].name);
    strcpy(L->student[i].name, b);
    float c;
    c=L->student[i-1].grade;
    L->student[i-1].grade=L->student[i].grade;
    L->student[i].grade=c;
    
}
void paixu (SqList*L)
{
    printf("請輸入排序的要求:0代表學號;1代表成績");
    int m;
    scanf("%d",&m);
    switch (m) {
        case 0:
            while (1)
            {
                int f=0,q=0;
                f=q;
                for (int i=0;i<sum-1;i++)
                    if (L->student[i].id>L->student[i+1].id)
                    {
                        jiaohuan(L, i+1);
                        f=1;
                    }
                    else f=0;
                if (f==0)
                    break;
                
            }
            break;
            
        case 1:
            while (1)
            {
                int f=0,q=0;
                f=q;
                for (int i=0;i<sum-1;i++)
                    if (L->student[i].grade>L->student[i+1].grade)
                    {
                        jiaohuan(L, i+1);
                        f++;
                    }
                if (f==q)
                    break;
            }
            break;
    }
}

void qingkong (SqList*L)
{
    L->length=0;sum=0;

    printf("所有數據已經清空");
}

int main()
{
    SqList *text=(SqList*)malloc(sizeof(SqList)*10000);
    //爲text劃分存儲空間
    CreatStudent(text);
    printf("共有多少名學生:");
    //錄入基礎有多少學生
    scanf("%d",&sum);
    text->length=0;
    for (int i=0;i<sum;i++)
        GetStudent(text,i);
    //獲得基礎學生信息
    int c;
    printf("(1)顯示:顯示當前所有學生信息記錄;\n");
    printf("(2)錄入:從鍵盤輸入一條學生信息記錄,插入到表中指定的位置;\n");
    printf(" (3)查找:根據學號或者記錄的位置查找學生的各項信息;\n");
    printf("(4)刪除:刪除指定位置的學生信息記錄;\n");
    printf("(5)更新:更新指定位置的學生信息記錄;\n");
    printf("(6)統計:統計表中學生人數。\n");
    printf(" (7) 排序:按照學號或者績點進行排序\n");
    printf("(8)清空:清空表中所有記錄\n");
    int p=1;
    while (p==1)
    {
        printf("請輸入你的操作指令:\n");
        scanf("%d",&c);
        switch (c) {
            case 1:
                for (int i=0;i<sum;i++)
                    PrintStudent(text,i);
                break;
            case 2:
                charu(text);
                break;
            case 3:
                FindStudent(text);
                break;
            case 4:
            {
                int m;
                printf("請輸入需要刪除學生的位置:");
                scanf("%d",&m);
                DeletStudent(text, m);
            }
                break;
            case 5:
                ReGetStudent(text);
                break;
            case 6:
                printf("學生的總數是:%d",sum);
                break;
            case 7:
                paixu(text);
                break;
            case 8:
                qingkong(text);
                break;
            case 0:
                p=0;
                break;
            default:
                printf("輸入指令不對,請重新輸入如果退出請輸入0;");
                break;
        }
    }
}

報告區

第一部分:實驗分析與設計(可加頁)
一、 實驗內容描述(問題域描述)
設計一個學生信息管理系統,實現對學生基本信息的添加、刪除、修改和查詢等操作,其中每個學生信息包含學號,姓名和績點。要求系統完成以下主要功能:
(1)顯示:顯示當前所有學生信息記錄;
(2)錄入:從鍵盤輸入一條學生信息記錄,插入到表中指定的位置;
(3)查找:根據學號或者記錄的位置查找學生的各項信息;
(4)刪除:刪除指定位置的學生信息記錄;
(5)更新:更新指定位置的學生信息記錄;
(6)統計:統計表中學生人數。
(7) 排序:按照學號或者績點進行排序
(8)清空:清空表中所有記錄

二、 實驗基本原理與設計(數據結構設計與算法設計)

(1) 顯示利用棧的順序遍歷輸出每一個學生的信息;
(2) 錄入需要先通過遍歷找到需要插入的位置,然後獲取需要錄入的學生的信息,利用尾插法插入該學生信息。
(3) 查找通過遍歷每一個學生的信息和所擁有的數據進行對比最終得出結果
(4) 刪除直接從該位置開始後面的學生信息向前進一
(5) 先通過查找找到指定位置然後對其中的元素信息進行替換
(6) 遍歷過程中設置一個變量讓其每次加一
(7) 對所需要排序的內容進行比較如果不一致則進行交換並將變量j++;重複循環直到變量j爲0;
(8) 清空令length爲0;
三、主要儀器設備及耗材
1.PC機
2.開發環境(比如:VC,Eclipse)
X-code
第二部分:實驗調試與結果分析(可加頁)
一、 調試過程(包括調試方法描述、實驗數據記錄,實驗現象記錄,實驗過程發現的問題等)
1.調試方法描述
① 輸入c程序,並保存;
② 編譯c程序,找出程序的語法錯誤並改正;
③ 輸入測試數據,運行c程序;
④ 若有錯利用斷點一步步運行查錯
⑤ 重複②-④步,直到得到正確的運行結果。

2.實驗輸入/輸出數據記錄
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
4.實驗過程發現的問題

在設計除排序算法外的算法的時候沒有什麼太大問題;在設計排序算法時,我發現總會出現未完全排序的情況,因爲順序表與鏈表不同不能排序過程中直接插入,直到我引入了一個新的變量,讓他來檢驗排序是否完全完成;雖然時間複雜度有所上升,但是能較好的完成功能的需要。

二、 實驗結果及分析(包括結果描述、實驗現象分析、影響因素討論、綜合分析和結論等)
1.結果描述
功能1-8全部都能正常實現;沒有意外。
2.實驗現象分析
所有程序經調試均符合題目要求。
3.影響因素討論
① 程序的輸入提示不夠,不知道何時需要輸入數據,所以要增加輸入提示,提示用戶改做什麼;
② 輸出提示不夠,輸出結果不太清晰;
4.算法分析(包括時間和空間)
T(n)=o(n3);
5.結論
順序表便於查找指定位置的內容,也便於順序查找,但是在插入的時候不是很方便;總體來說這個實驗我做的時間不算長但是其中的思路還是花了點時間。順序表還是很實用的。
三、 實驗小結、建議及體會
通過這次上機實驗,使我對順序表有了更加深刻的理解,結構體的用法也更加熟練,雖然在編程中出現了很多錯誤,但是最終錯誤都得以解決,讓我下一次遇到這些問題更加的得心應手。鍛鍊了我的邏輯能力。
運用順序表來寫一個學生管理系統,有其優勢就是統計顯示比較方便快捷,但是也有其劣勢那就是錄入和刪除的繁瑣,每一次錄入刪除需要移動所有數據。但好在在排序上,順序表的便捷和可讀比鏈表好。
下一次遇到順序表和鏈表的問題時可以多比較一下其各自的時間和空間複雜度,選擇更加便捷不容易出錯的作爲一開始的思路。
算法在節省空間存儲的基礎上卻又加大了程序運行時間的開銷,空間與時間是難以兼得的熊和魚掌,程序員編寫的時候需要考慮側重點

發佈了11 篇原創文章 · 獲贊 9 · 訪問量 3313
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章