数据结构——算法、程序设计

一、实验目的

  1. 理解和掌握线性表的类型定义方法。
  2. 掌握顺序表中的基本运算,包括顺序表的创建、元素的添加、删除,判空及判满等基本操作。

二、实验要求

【题目1 - C/C++语言中函数参数传递的三种方式】

C语言提供了两种函数参数传递的方式:传值和传地址。在C++中,又拓展了引用方式。通过本项目,确认是否已经掌握了这三种方式的原理,为后续学习做好准备。
两个变量的值的交换,请用三种方法来实现,分别完成主程序的编写:

//(1)传值
void myswap(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

//(2)传地址
void myswap(int *p1, int *p2)    P1=&A
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
//(3)引用作形参
void myswap(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d", &a, &b);
    __________________;  //分三个程序,分别写上调用myswap的合适形式
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

添加修改:
第一种交换:
代码:

#include <iostream>
#include <stdio.h>
using namespace std;
void myswap1(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

//(2)传地址
void myswap2(int *p1, int *p2)    //P1=&A
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
//(3)引用作形参
void myswap3(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d",&a,&b);
    myswap1(a,b);  //分三个程序,分别写上调用myswap的合适形式
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

运行截图:
在这里插入图片描述
第二种交换:
代码:

#include <iostream>
#include <stdio.h>
using namespace std;
void myswap1(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

//(2)传地址
void myswap2(int *p1, int *p2)    //P1=&A
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
//(3)引用作形参
void myswap3(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d",&a,&b);
    myswap2(&a,&b);  //分三个程序,分别写上调用myswap的合适形式
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

运行截图:
在这里插入图片描述
第三种交换:
代码:

#include <iostream>
#include <stdio.h>
using namespace std;
void myswap1(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

//(2)传地址
void myswap2(int *p1, int *p2)    //P1=&A
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
//(3)引用作形参
void myswap3(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d",&a,&b);
    myswap3(a,b);  //分三个程序,分别写上调用myswap的合适形式
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

运行截图:
在这里插入图片描述
【项目2 - 程序的多文件组织】

学习数据结构,目标就是要编制出有相当规模的程序的。将所有的代码放在一个文件中的做法,不能适用现阶段的需求了。
 通过这个项目,确认有能力用多文件组织程序。方便以后各章,我们就某一数据结构定义算法库,并能引用算法库进行实践。
最简单的多文件组织,一个项目中有3个文件:
  (1) .h 头文件:定义数据类型、声明自定义函数、定义宏等
  (2).cpp 源文件1:用于实现头文件中声明的自定义函数
  (3).cpp 源文件2:定义main()函数,用于调用相关函数,实现问题求解目标。
  
如程序:
head.h:

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#define MaxStud 50
#define MaxCour 300
struct stud1
{
    int no;
    char name[10];
    int bno;
};
struct stud2
{
    int no;
    int cno;
    int deg;
};
double studavg(struct stud2 s2[],int m,int i);
double couravg(struct stud2 s2[],int m,int i);
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m);
#endif // HEAD_H_INCLUDED

sources.cpp:

#include "head.h"
#include <iostream>
#include <stdio.h>
using namespace std;
double studavg(struct stud2 s2[],int m,int i)
{
    int j,n=0;
    double sum=0;
    for(j=0;j<m;j++)
        if(s2[j].no==i)
        {
            n++;
            sum+=s2[j].deg;
        }
    return (sum/n);
}
double couravg(struct stud2 s2[],int m,int i)
{
    int j,n=0;
    double sum=0;
    for(j=0;j<m;j++)
        if(s2[j].cno==i)
        {
            n++;
            sum+=s2[j].deg;
        }
    return (sum/n);
}
void allavg(struct stud1 s1[],int n,struct stud2 s2[],int m)
{
    int i,j;
    printf("学生平均分:\n");
    printf("  学号    姓名   平均分\n");
    i=0;
    while(i<n)
    {
        j=s1[i].no;
        printf("%4d%10s%g\n",s1[i].no,s1[i].name,studavg(s2,m,j));
        i++;
    }
    printf("课程平均分:\n");
    for(i=1;i<6;i++)
        printf(" 课程%d:%g\n",i,couravg(s2,m,i));
}

main.cpp:

#include "head.h"
#include <iostream>
using namespace std;
int main()
{
    int n=7;
    int m=21;
    struct stud1 s1[MaxStud]=
    {
        {1,"张斌",9901},
        {8,"刘丽",9902},
        {34,"李英",9901},
        {20,"陈华",9902},
        {12,"王奇",9901},
        {26,"董强",9902},
        {5,"王萍",9901},
    };
    struct stud2 s2[MaxCour]=
    {
        {1,1,67},
        {1,2,98},
        {1,4,65},
        {8,1,98},
        {8,3,90},
        {8,6,67},
        {34,2,56},
        {34,4,65},
        {34,6,77},
        {20,1,68},
        {20,2,92},
        {20,3,64},
        {12,4,76},
        {12,5,75},
        {12,6,78},
        {26,1,67},
        {26,5,78},
        {26,6,62},
        {5,1,94},
        {5,2,92},
        {5,6,89}
    };
    allavg(s1,n,s2,m);
    return 0;
}

程序运行结果截图:
在这里插入图片描述

【项目3 - 体验复杂度】
(1)两种排序算法的运行时间
  排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为O(n2)的选择排序BubbleSort,和复杂度为O(nlogn)的快速排序quicksort,在main函数中加入了对运行时间的统计。
  请阅读后附的程序1和程序2,利用一个将近10万条数据的文件作为输入数据运行程序,感受两种算法在运行时间上的差异。

代码:
head.h:

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include<time.h>
#include<stdlib.h>
#define MAXNUM 100000
void BubbleSort(int a[],int n);
void quicksort(int data[],int first,int last);
#endif // HEAD_H_INCLUDED

sources.cpp:

#include "head.h"
#include <iostream>
using namespace std;
void BubbleSort(int a[],int n)
{
    int i,j;
    bool exchange;
    for(i=0;i<n-1;i++)
    {
        exchange=false;
        for(j=n-1;j>i;j--)
        {
            if(a[j]<a[j-1])
            {
                swap(a[j],a[j-1]);
                exchange=true;
            }
        }
        if(!exchange)
        return;
    }
}
void quicksort(int data[],int first,int last)
{
    int i,j,t,base;
    if(first>last)
        return;
    base=data[first];
    i=first;
    j=last;
    while(i!=j)
    {
        while(data[j]>=base&&i<j)
            j--;
        while(data[i]<=base&&i<j)
            i++;
        if(i<j)
        {
            t=data[i];
            data[i]=data[j];
            data[j]=t;
        }
    }
    data[first]=data[i];
    data[i]=base;
    quicksort(data,first,i-1);
    quicksort(data,i+1,last);
}

main.cpp:

#include "head.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int x[MAXNUM];
    int n=0;
    double t1,t2;
    FILE *fp;
    fp=fopen("numbers.txt","r");
    if(fp==NULL)
    {
        printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");
        exit(1);
    }
    while(fscanf(fp,"%d",&x[n])!=EOF)
        n++;
    printf("数据量: %d,开始排序....",n);
    t1=time(0);
    BubbleSort(x,n);
//    quicksort(x,0,n-1);
    t2=time(0);
    printf("用时 %d 秒",(int)(t2-t1));
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述
在这里插入图片描述

1.实验内容: 1) 建立学生档案管理的数据结构和存储结构; 2) 完成学生档案管理数据的基本操作; 3) 为提高管理效率,尝试设计较好的面向应用的查找存储结构,如二叉排序树。 2.实验任务: 设计一个学生档案管理信息系统,管理的学生信息包括学号、姓名、性别、高数成绩、英语成绩、大学物理成绩;要求可对学生档案信息进行浏览、增加、修改、删除和查找操作;能够依据不同的检索条件进行查找. 2 隐式图的搜索问题 1. 实验内容: 1) 对九宫重排问题,建立图的启发式搜索求解问题的方法; 2) 编写九宫重排问题的启发式搜索求解程序。 2. 实验任务: 在3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘留有一个空格,空格周围的棋子可以移动到空格,从而改变棋盘的布局。根据给定初始布局和目标布局,求解如何移动棋子才能从初始布局到达目标布局,找到一种最少步骤的移动方法。 3 可视化界面的文本文件操作 1. 实验内容: 1).通过对可视化开发环境的实用,实现对文本文件编辑器的设计。 2).通过键盘实现对文本文件进行创建、插入、删除、修改、存储等操作。 2. 实验任务: 设计一个具有可视化界面的全文本编辑器,通过对键盘操作可实现对文本进行显示、插入、修改、删除、查找、存储等操作。实现全文本编辑器的基本功能。具体要求如下:  具有图形菜单界面;  能正确显示文本总行数。(行数不少于5行,每行字符数不少于80个字符);  可正确读取,保存文本;  能实现简单的文本处理功能  查找:查找文本的字符串,显示其出现的行数,列数及总共出现次数  替换(等长,不等长):对文本的文本实现等长及不等长替换  插入(插串,文本块的插入):插入一行或在具体行号列号处插入文本  删除:删除一行,删除某一行、某列,定长的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值