广州大学学生实验报告
开课学院及实验室:计算机学院/电子信息楼 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; }