广州大学学生实验报告,程序设计基础,实验3数组、结构体及指针

广州大学学生实验报告

开课学院及实验室:计算机学院/电子信息楼              202x年  月  日

  

计算机

年级/专业/

计科

姓名

Great

Macro

学号

实验课程名称

程序设计基础

成绩

实验项目名称

实验3数组、结构体及指针

指导老师

(***(1)报告只能为文字和图片;(2)实验项目名称不能有任何改动;(3)必须填写正确的姓名和学号;否则会影响最后成绩的统计,后果自负***)

实验A 数组字符串

一、实验目的及要求

1.了解数组与数学矩阵的关系;

2.掌握数组的定义、引用与初始化;

3.理解二维数组数据的存储顺序;

4.理解并掌握冒泡排序法、选择排序法;

5.掌握字符数组与字符串的定义、引用;

6.了解字符串处理函数的用法。

二、实验设备与平台

1. 实验设备:计算机;

2. 平台:Windows操作系统,Visual C++ 6.0或Microsoft Visual Studio 2005/2008/2010/2012/2013/2015/2017/2019;或适合的C/C++编程环境。

三、实验内容及步骤

编写程序,解下列问题,然后把编写的程序代码和运行结果截图复制到题目后面的空白处。

    1、某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求:

(1)计算每个学生的总分和平均分;

(2)按总分成绩由高到低排出成绩的名次;

(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;

(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。

#include <iostream>
#include <ctime>
using namespace std;

#define N 30    // 定义班级人数

// 定义学生结构体
struct student
{
    int NO;     // 学生编号
    int MT;     // 数学成绩
    int EN;     // 英语成绩
    int PH;     // 物理成绩
    int sum;    // 学生总分
    float avg;  // 学生评价分
};

// 初始化学生信息
void init(student *stu, int n)
{
    for(int i = 0; i < n; i++)
    {
        stu[i].NO = 1000 + i;
        stu[i].MT = rand()%71 + 30;
        stu[i].EN = rand()%71 + 30; 
        stu[i].PH = rand()%71 + 30; 
        stu[i].sum = stu[i].MT + stu[i].EN + stu[i].PH;
        stu[i].avg = stu[i].sum / 3.0;
    }
}

// 按照总分高低排名, 方便起见,用选择排序
void sort(student *stu, int n)
{
    int i, j, max;
    student tmp;

    for(i = 0; i < n - 1; i++)
    {
        max = i;
        for(j = i + 1; j < n; j++)
        {
            if(stu[max].sum < stu[j].sum)
            {
                max = j;
            }
        }

        if(max != i)
        {
            tmp = stu[i];
            stu[i] = stu[max];
            stu[max] = tmp;
        }
    }
}

// 打印学生信息
void display(student *stu, int n)
{
    cout << "名次\t学号\t数学\t英语\t物理\t总分\t平均分" << endl;
    for(int i = 0; i < n; i++)
    {
        cout << i+1 << '\t' << stu[i].NO << '\t' << stu[i].MT << '\t' 
            << stu[i].EN << '\t' << stu[i].PH << '\t' << stu[i].sum << '\t' << stu[i].avg << endl;
    }
}

int query(student *stu, int n, int NO)
{
    for(int i = 0; i < n; i++)
    {
        if(NO == stu[i].NO)
        {
            return i;
        }
    }

    return -1;
}

int main()
{
    int i, k, NO;
    srand(time(0));
    student stu[30];

    init(stu, 30);
    
    while(1)
    {
        cout << "请输入你的操作,1.排名并查看名次 2.查看个人信息 3.退出:";
        cin >> i;

        switch(i)
        {
            case 1:
                sort(stu, 30);
                display(stu, 30);
                break;

            case 2:
                cout << "请输入学号:";
                cin >> NO;
                k = query(stu, 30, NO);
                if(k != -1)
                {
                    cout << "名次\t学号\t数学\t英语\t物理\t总分\t平均分" << endl;
                    cout << k+1 << '\t' << stu[k].NO << '\t' << stu[k].MT << '\t' << stu[k].EN << '\t' 
                        << stu[k].PH << '\t' << stu[k].sum << '\t' << stu[k].avg << endl;
                }
                else
                {
                    cout << "没有找到对应学号的学生" << endl;
                }
                break;
        }

        if(i == 3)
        {
            cout << "你已退出!\n" << endl;
            break;
        }
    }
    
    return 0;
}

    2、不用字符串处理函数将两个字符串连接,即将字符串b连接到字符串a的后面,变成字符串c。

   

#include <iostream>
using namespace std;

// 计算字符串长度
int mystrlen(char *s)
{
    int i = 0;
    while(s[i])
    {
        i++;
    }

    return i;
}

// 字符串拼接函数
void mystrcat(char *s1, char *s2, char *s)
{
    int i, j;

    // 复制字符串s1
    for(i = 0; i < mystrlen(s1); i++)
    {
        s[i] = s1[i];
    }

    // 复制字符串s2
    for(i = 0, j = mystrlen(s1); i < mystrlen(s2); i++, j++)
    {
        s[j] = s2[i];
    }

    // 最后要补上一个结束符
    s[j] = '\0';
}

int main()
{
    int n;
    char s1[50] = {'\0'};
    char s2[50] = {'\0'};

    cout << "请输入字符串s1: ";
    cin >> s1;

    cout << "请输入字符串s2:";
    cin >> s2;

    n = mystrlen(s1) + mystrlen(s2);
    char *s = new char[n + 1];
    if(s == NULL)
    {
        cout << "动态内存空间分配出错" << endl;
        return -1;
    }

    mystrcat(s1, s2, s);

    cout << "字符串s1拼接字符串s2后为:" << s << endl;

    return 0;
}

实验B结构实验

一、实验目的

1.掌握结构的概念;

2.学会通过结构成员来使用结构;

3.学会通过函数的参数使用结构;

4.学会结构变量成员值的输出。

二、实验设备与平台

1. 实验设备:计算机;

2. 平台:Windows操作系统,Visual C++ 6.0或Microsoft Visual Studio 2005/2008/2010/2012/2013/2015/2017/2019;或适合的C/C++编程环境。

三、实验内容

1、定义一个结构变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days函数,计算后将日子传递回主函数输出。

// 定义一个结构变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),
// 要求写一个函数days,实现上面的计算。
// 由主函数将年月日传递给days函数,计算后将日子传递回主函数输出。

#include <iostream>
using namespace std;

// 定义日期结构体
struct date
{
    int year;   // 年
    int month;  // 月
    int day;    // 日
};

// 判断是否是闰年,是返回1,否则返回0
int isLeap(int year)
{
    return (year % 4 == 0) || (year % 100 == 0 && year % 400 == 0); 
}

int days(date date1)
{
    int sum, flag;
    
    // 判断年份是否合法
    if(date1.year < 0)
    {
        return -1;
    }

    // 判断月份是否合法
    if(date1.month < 0 || date1.month > 12)
    {
        return -1;
    }

    // 判断天数是否合法
    if(date1.day < 0 || date1.day > 31)
    {
        return -1;
    }

    // 判断是否是闰年
    flag = isLeap(date1.year);

    // 额外判断二月份的天数
    if(date1.month == 2 && date1.day > 28 + flag)
    {
        return -1;
    }

    sum = 0;
    switch(date1.month - 1)
    {
        case 11:
            sum += 30;
        case 10:
            sum += 31;
        case 9:
            sum += 30;
        case 8:
            sum += 31;
        case 7:
            sum += 31;
        case 6:
            sum += 30;
        case 5:
            sum += 31;
        case 4:
            sum += 30;
        case 3:
            sum += 31;
        case 2:
            sum += 28 + flag;
        case 1:
            sum += 31;
        case 0:
            sum += date1.day;
    }

    return sum;
}

int main()
{
    int n = 0;
    date date1;
    cout << "请输入日期(如:1999 09 09 表示1999年9月9日):";
    cin >>date1.year>> date1.month >> date1.day;

    n = days(date1);
    if(n == -1)
    {
        cout << "输入日期有误" << endl;
    }
    else
    {
        cout << "该日在本年中为第" << n << "天" << endl;
    }

    return 0;
}

 

 

2、编写一个程序,用结构表示一个学生的信息,每个学生的信息包括:学号、姓名、三门成绩。要求从键盘输入学生的数据,并输出成绩表(包括每个学生的学号、姓名、三门成绩及平均分数),并输出平均分在前3名的学生的姓名及平均分。

#include <iostream>
using namespace std;

// 定义学生的信息结构体
struct student
{
    char NO[10];    // 学号
    char Name[10];  // 姓名
    int MT;         // 数学
    int EN;         // 英语
    int PH;         // 物理
    float avg;      // 平均分
};

// 初始化学生信息
void init(student *stu, int n)
{
    for(int i = 0; i < n; i++)
    {
        cout << "请依次输入学生的学号,姓名,数学,英语,物理:" << endl;
        cin >> stu[i].NO >> stu[i].Name >> stu[i].MT >> stu[i].EN >> stu[i].PH;
        stu[i].avg = (stu[i].MT + stu[i].EN + stu[i].PH) / 3.0;
    }
}

// 打印学生信息
void display(student *stu, int n)
{
    cout << "名次\t姓名\t学号\t数学\t英语\t物理\t平均分" << endl;
    for(int i = 0; i < n; i++)
    {
        cout << i+1 << '\t'<< stu[i].Name << '\t' << stu[i].NO << '\t' << stu[i].MT << '\t' 
            << stu[i].EN << '\t' << stu[i].PH << '\t' << stu[i].avg<< endl;
    }
}

// 按照总分高低排名, 方便起见,用选择排序
void sort(student *stu, int n)
{
    int i, j, max;
    student tmp;

    for(i = 0; i < n - 1; i++)
    {
        max = i;
        for(j = i + 1; j < n; j++)
        {
            if(stu[max].avg < stu[j].avg)
            {
                max = j;
            }
        }

        if(max != i)
        {
            tmp = stu[i];
            stu[i] = stu[max];
            stu[max] = tmp;
        }
    }
}


int main()
{
    int n;
    
    cout << "请输入班级人数:";
    cin >> n;

    student *stu = new student[n];

    if(stu == NULL)
    {
        cout << "动态分配内存空间失败" << endl;
        return -1;
    }

    init(stu, n);
    sort(stu, n);
    display(stu, n);

    cout << "平均分前三名学生信息: " << endl;
    display(stu, 3);

    return 0;
}

实验C 指针实验

一、实验目的

1.掌握指针的概念;

2.学会通过指针处理普通变量和一维数组;

3.学会通过指针处理动态分配的内存;

4.学会将一个问题提炼出数学模型,学会利用数学模型编写程序的方法。

二、实验设备与平台

1. 实验设备:计算机;

2. 平台:Windows操作系统,Visual C++ 6.0或Microsoft Visual Studio 2005/2008/2010/2012/2013/2015/2017/2019;或适合的C/C++编程环境。

三、实验内容

1、 要求使用指针处理下面的问题,输入四个整数,按由小到大的顺序输出;然后将程序改为:输入四个字符串,按由小到大顺序输出。(使用指针或指针数组)

#include <iostream>
using namespace std;

#define N 4

// 比较数组大小
void sort1(int *a, int n)
{
    int i, j, min,tmp;
    
    for(i = 0; i < n - 1; i++)
    {
        min = i;
        for( j = i + 1; j < n; j++)
        {
            if(*(a + min) > *(a + j))
            {
                min = j;
            }
        }

        if( min != i)
        {
            tmp = *(a + i);
            *(a + i) = *(a + min);
            *(a + min) = tmp;
        }
    }
}

// 计算字符串长度
int mystrlen(char *s)
{
    int i = 0;

    while(s[i])
    {
        i++;
    }

    return i;
}

// 复制字符串
void mystrcpy(char *src, char *dest)
{
    int i;
    for(i = 0; i < mystrlen(src); i++)
    {
        dest[i] = src[i];
    }

    dest[i] = '\0';
}

// 比较字符串大小, a>b 返回1,a==b 返回0,a<b 返回-1
int check(char *a, char *b)
{
    int i = 0;

    while(i <= mystrlen(a) && *(b+i))
    {
        if(*(a+i) < *(b+i))
        {
            return -1;
        }
        else if(*(a+i) == *(b+i))
        {
            i++;
        }
        else
        {
            return 1;
        }
    }

    if(*(b+i))  // 如果字符串b还有字符,而字符串a没有字符,即a<b
    {
        return -1 ;
    }

    if(i <= mystrlen(a))    // 如果字符串a还有字符,而字符串b没有字符,即a>b
    {
        return 1;
    }

    return 0;

}


// 比较字符串组大小
void sort2(char **s, int n)
{
    int i, j, min;
    char tmp[50];
    
    for(i = 0; i < n - 1; i++)
    {
        min = i;
        for( j = i + 1; j < n; j++)
        {
            if(check(*(s + j), *(s + min)) < 0)
            {
                min = j;
            }
        }

        if( min != i)
        {
            mystrcpy(*(s + i), tmp);
            mystrcpy(*(s + min), *(s + i));
            mystrcpy(tmp, *(s + min));
        }
    }
}

int main()
{
    int i, *p, a[N];
    char *b[N], c[N][50];

    cout << "请输入四个整数:";

    for(i = 0; i < N; i++)
    {
        cin >> a[i];
    }

    sort1(a, N);

    cout << "由小到大顺序输出:";
    for(i = 0; i < N; i++)
    {
        cout << a[i] << ' ';
    }

    cout << endl << "请输入四个字符串:" << endl;
    
    for(i = 0; i < N; i++)
    {
        cin >> c[i];
        b[i] = c[i];
    }

    sort2(b, N);

    cout << "由小到大顺序输出:";
    for(i = 0; i < N; i++)
    {
        cout << b[i] << ' ';
    }






    return 0;
}

2、 通过指针动态存储处理下面的问题:利用随机函数模拟产生300个1~12月出生的人数,统计本次运行得到的数据中,各个月的出生率是多少。

#include <iostream>
#include <ctime>
using namespace std;

#define N 300

int main()
{
    int i;
    int *a = new int[N];
    int b[12] = {0};

    srand(time(0));

    // 模拟产生300个1~12月出生的人数
    for(i = 0; i < N; i++)
    {
        *(a + i) = rand() % 12 + 1;
    }

    // 计算各个月的出生人数
    for(i = 0; i < N; i++)
    {
        (*(b + *(a + i) - 1))++;
    }

    // 计算各个月的出生率
    for(i = 0; i < 12; i++)
    {
       cout << i + 1 << "月出生率:" << *(b + i) / 3.0 << "%" << endl;
    }

    return 0;
}

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值