东南大学非电专业C++下学期上机作业题.docx
《东南大学非电专业C++下学期上机作业题.docx》由会员分享,可在线阅读,更多相关《东南大学非电专业C++下学期上机作业题.docx(85页珍藏版)》请在冰豆网上搜索。
![东南大学非电专业C++下学期上机作业题.docx](https://file1.bdocx.com/fileroot1/2023-7/12/55ac9f13-d669-47db-9e40-eb838492417f/55ac9f13-d669-47db-9e40-eb838492417f1.gif)
东南大学非电专业C++下学期上机作业题
C++上机作业题
第一次上机
1.以下语句描述了包含数学成绩的学生信息结构体及其数组a:
。
structstudent{ charname[20]; floatmath;};
studenta[10]={{"张三".90},{"李四",85}{"王五",73}};
intcount= 3;//数组中包含的学生数。
编写两个函数分别实现在a数组中添加和删除学生信息。
。
要求,。
1) 原数组已按数学成绩排序(降序),添加和删除学生信息后数组应仍为降序。
2)以下数据用于添加{"赵二".96},{"钱六",65},{"孙七",80}
3) 注意,添加,删除后count数据要相应变化。
#include
#include
usingnamespacestd;
structstudent
{
charname[20];
floatmath;
};
studenta[10]={{"张三",90},{"李四",85},{"王五",73}};
intcount=3;
voidAddStu()
{
charname[20];
floatmath;
cout<<"请输入学生姓名"<cin>>name;
cout<<"请输入学生数学成绩"<cin>>math;
//将新增的学生按数据成绩降序插入
intk=0;//记录新增学生应该的位置
for(inti=0;i{
if(math>a[i].math)k=i;
break;
}
//将数组a从第k个元素开始后移,并将新增学生作为第k个元素
for(intj=count;j>k;j--)
{
strcpy(a[j].name,a[j-1].name);//数组是从0开始的
a[j].math=a[j-1].math;
}
strcpy(a[k].name,name);
a[k].math=math;
count++;
}
voidDisplayStu(students[10],intk)
{
for(inti=0;i{
cout<<"姓名:
"<
"<
}
}
voidDelStu()
{
charname[20];
cout<<"请输入删除学生的姓名"<cin>>name;
intk=0;
for(inti=0;i{
if(strcmp(a[i].name,name)==0)
{
k=i;
break;
}
}
for(intj=k;j{
strcpy(a[j].name,a[j+1].name);
a[j].math=a[j+1].math;
}
count--;
}
voidmain()
{
AddStu();
DisplayStu(a,count);
}
voidseek(int*a,intn,int*pn)
{
ints=0,rem=25;//s为计数器,rem为剩余人数
inti=0;
while(rem>1)
{
if(a[i]!
=0)
{
s++;
if(s%n==0)//能被3整除的排除,当值设为0
{
a[i]=0;rem--;
}
}
i++;
if(i==25)i=0;
}
for(i=0;i<25;i++)
{
if(a[i]!
=0)break;//找到最后剩下的人
}
*pn=i+1;
}
voidmain()
{
intn=3;
intnum;
inta[25],*p=a;
for(inti=0;i<25;i++)p[i]=i+1;
seek(a,n,&num);
cout<}
第二次上机
1.编程题:
编程要求
1)编与还数intfun(long*x),找出所有满足以下特性的六位整数:
它是一个完全平方数(完全平方数是指该数是某个整数的平方);该数同时也是回文数(回文数是指该数等于它的反序数)。
例如,698896是836的平方并且98896是回文数,因此68896是满足所给条件的六位整数。
将所有满足上述条件的六位整数存入指向的数组中,函数返回x指向的数组中整数的个数。
。
2)编main函数,声明realt数组,调用fun函数将所有满足条件的六位整数存入result数组中,将result数组中的数据输出到屏幕。
intfun(int*x)
{
intk=0;//计数,共有多少个数满足
for(inti=111111;i<=999999;i++)
{
doublea=sqrt(i);
intb=a;
if(a==b)//判断是否为完全平方数
{
//通过将整数顺序反转,然后比较二者是否相等来判断是不是回文数。
如123321,反转后还是123321
inttmp=i,res=0;//tmp为临时变量,res为反转后的数
while(tmp)
{
res=res*10+tmp%10;
tmp=tmp/10;
}
if(res==i)//反转后与原数相等,是回文数
{
*x=i;
x++;
k++;
}
}
}
returnk;
}
voidmain()
{
intresult[100];
intk=fun(result);
for(inti=0;i{
cout<}
}
2.程序统计输入的字符串中含有多少个定冠词"the"。
假定字符串中宇母都小写,单词不跨行,每行不超过50个字符,以句 号”“结束,整个输入以“&“结束
主函数如下
#include
#include
#defineNUM2
voidmain()
{
chara[NUM][100],*p[2];
inti=0;
cout<<"输入字符串"<do{
cin.getline(a[i],100);
p[i]=a[i];
}while(strcmp(p[i++],"&")!
=0&&ifind(p);
}
要求编写出find(p)函数完成以上功能
voidfind(char*p[2])
{
stringstr1,str2="the";
intposition=0;//出现the的位置
intcount=0;//出现the的次数
for(inti=0;i{
count=0;//每次循环计数清0
str1=p[i];
//find函数是在一个字符串里,从某个位置找第二字符串,找到返回位置,找不到返回str1.npos
//如str1.find(str2,0),在str1里从0处(可以从其它位置开始)开始找str2
position=str1.find(str2,0);
while(position!
=str1.npos)
{
count++;
position=str1.find(str2,position+3);
}
cout<<"第"<
}
}
#include
#include
#defineNUM2
voidmain()
{
chara[NUM][100],*p[2];
inti=0;
cout<<"输入字符串"<do{
cin.getline(a[i],100);
p[i]=a[i];
}while(strcmp(p[i++],"&")!
=0&&ifind(p);
}
第三次上机
1.n个人围成一圈,他们的序号依次为1~n,从第一个开始顺序报数1、2、…m…,报到m或m的倍数者退出圈子,并输出退出圈子的人的序号。
用一个环形链表模拟围成一圈的人。
下面是环形链表的结构,其中head指向第一个人。
structnode{intx;node*next;};
1.函数node*creat(intn)用来创建个有n个节点的环开链表,他们的序号依认为1~n,函数返回头结点;
2.函数voiddel(node*h。
intm)实现从第一个人开始顺序报数1、2.……报到m或m的倍数者退出圈子,并输出退出圈子的人的序号。
接着再顺序报数,直到圈子中留下一个人为止。
3.主函数要求从键盘输入m.n的值,并调用函数creat函数完成建立环形链表,和del函数依次输出退出圈子的人的序号,找出圈子中留下的最后一个人。
#include
usingnamespacestd;
structnode{
intx;node*next;
};
node*creat(intn)
{
node*head=newnode();//先生成一个头
head->x=1;
node*p=head;//申明一个中间变量
for(inti=2;i<=n;i++)
{
node*pnew=newnode();
pnew->x=i;
p->next=pnew;
p=pnew;
}
p->next=head;//将最后一个指向头
returnhead;
}
voiddel(node*h,intm)
{
intk,rem=10;//k是计数,rem是剩余人数
while(rem>1)
{
h=h->next;
if(h->x!
=0)
{
k++;
if(k%m==0)//也可以直接删除节点,此处是将节点的x置为0代表删除
{
cout<x<<'\t';
h->x=0;
rem--;
}
}
}
}
voidmain()
{
intn,m;
cout<<"请输入圈子总人数及退出序号"<cin>>n>>m;
node*pHead=creat(n);
del(pHead,m);
}
2.建立一条无序链表,并输出这条链表上个节点的值。
设计一函数,将这条链表构成一条新的逆序链表,即将链表头当尾,链表尾当头。
输出这条新链表上节点的值。
用下面数组验证程序正确性
学号
C++成绩
英语成绩
38
98
90
45
90
80
49
75
63
50
86
49
#include"stdafx.h"
#include
#include
usingnamespacestd;
structstudent
{
public:
longnum;//学号
stringname;//姓名
intcppScore;//c++成绩
intengScore;//英语成绩
student*next;
};
student*creat(intn)
{
student*head,*p,*p0;
head=p=p0=newstudent;
for(inti=0;i{
cout<<"请输入学号与姓名:
"<cin>>p->num>>p->name;
cout<<"请输入c++成绩与英语成绩:
"<cin>>p->cppScore>>p->engScore;
p0=p;
p=p->next=newstudent;
}
p0->next=NULL;
returnhead;
}
voidPrint(student*p)
{
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"c++"<<'\t'<<"英语"<while(p->next!
=NULL)
{
cout<num<<'\t'<name<<'\t'<cppScore<<'\t'<engScore<p=p->next;
}
cout<num<<'\t'<name<<'\t'<cppScore<<'\t'<engScore<}
student*Reverse(student*head)//链表逆序
{
if(head==NULL||head->next==NULL)
returnhead;
student*p1=head;
student*p2=p1->next;
student*p3=p2->next;
p1->next=NULL;
while(p3!
=NULL)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head=p2;
returnhead;
}
voidmain()
{
student*stu1=creat(3);
Print(stu1);
student*stu2=Reverse(stu1);
Print(stu2);
}
第四次上机
1.编写一个类CNums,实现如下功能:
某数列的第一项是0,第二项是1,从第三项起,凡奇数项是其前两项之和,偶数项是其前两项之差(前项减后项,生成数列的100项存入数组,统计共有多少个-1,0,1;,
1)类定义的要求如下:
私有数据成员,floatnum[100]
公有函数成员,
●generate()函数生成的100项数列值存入数组(类的数据成员);。
●show()函数显示出所有项数据,以及-1,0.1三个数值在数列中的个数:
用以下主函数进行测试
voidmain(){CNumsnum;num.generate();mum.show();}
构成完整程序,即完成该类成员函数的定义和测试程序的设计
#include
#include
usingnamespacestd;
classCNums
{
private:
floatnum[100];
public:
voidgenerate()//生成的100项数列值存入数组
{
num[0]=0;num[1]=1;//先设置两个初始值
for(inti=2;i<100;i++)
{
if(i%2==0)//如果是偶数
num[i]=num[i-2]-num[i-1];
else
num[i]=num[i-2]+num[i-1];
}
}
voidshow()//显示出所有项数据
{
intc1=0,c2=0,c3=0;//c1,c2,c3分别记-1,0,1的个数
intn;
for(inti=2;i<100;i++)
{
n=num[i];
switch(n)
{
case-1:
c1++;break;
case0:
c2++;break;
case1:
c3++;break;
}
}
cout<<"-1共"<}
};
voidmain(){
CNumsnum;
num.generate();
num.show();
}
2.n个人围成一圈,他们的序号依次为1~n,从第一个人开始顺序报数1、2、报到m或m的倍数者退出圈子,并输出退出圈子的人的序号。
用一个环形链表模拟围成一圈的人。
见第三次上机第一题
3.建立一个student类来实现如下功能:
查找考试成绩在80分以上的学生及其编号,并统计这些学生的总人数。
考试成绩在调用input函数时输入,调试程序可用以下10个成绩数据输入:
79859264739188816683。
类定义的要求如下,
私有数据成员。
intn——存储学生的编号,学生编号最小为1。
float*stu——储存考试成绩,数组要求动态生成
intcount——统计符合条件的总人数。
公有函数成员
input(intm)——输入学生成绩,并统计满足条件的人数存入count变量:
voidstat()——查找符合条件的编号、成绩,并调用成员函效show
voidshow()——输出符合条件的编号、成绩
voidprint()——输出符合条件的总人数
构成完整程序,即完成该类成员函效的定义和测试程序的设计。
#include
#include
usingnamespacestd;
classstudent
{
private:
intn;
float*stu;
intcount;
public:
voidinput(intm)//输入学生成绩,并统计满足条件的人数存入count变量
{
n=m;
count=0;
stu=newfloat[m];
cout<<"请输入"<"<<'\n';
for(inti=0;i{
cin>>stu[i];
if(stu[i]>80)count++;
}
}
voidshow()
{
cout<<"考试成绩80分以上的学生编号及成绩如下:
"<cout<<"编号\t成绩"<for(inti=0;i{
if(stu[i]>80)
cout<
}
}
voidprint()
{
cout<<"考试成绩80分以上的学生总人数为:
"<}
};
voidmain()
{
studentst;
st.input(5);
st.print();
st.show();
}
第五次上机
1.建立一个矩阵类Array,存储一个n×n矩阵并能完成矩阵转置运算。
要求如下:
(1)私有成员数据
int*x:
指向存储一个nXn矩阵值的内存区域(二维数组作为一维数组存储)。
Intn:
存储矩阵行数。
(2)公有成员函数
构造函数:
用参数指定的值或缺省值3初始化n,并用n的值为矩阵动态申请内存空间:
析构函数:
释放对象存储矩阵时占用的内存空间,
voidinput(int*a):
将一个矩阵赋值给对象中的数组。
voidprint():
按行输出矩阵的值。
voidchange():
转置矩阵。
编写一个程序测试该类。
定义对象A,将一个矩阵存入A中,并输出矩阵的值,转置对象A中的矩阵并输出。
说明:
因二维数组长度与维数都不是固定的,所以题要求使用指针int*x来表示数组。
那么由指针x这样的一维数组怎么翻译成二维数组呢?
假设x共有nXn个元索,索引i从0到nXn-1,那么i/n就表示二维数组的行,i%n就表示二维数组的列。
这样显示、转置时就比较方便了。
#include
#include
usingnamespacestd;
classArray
{
private:
intn;//nXn数组的维数
int*x;//指向nXn数组
public:
Array(intlen=3)//构造函数
{
n=len;
}
~Array()//析构函数
{
delete[]x;
}
voidinput(int*a)
{
cout<<"请输入"<for(inti=0;icin>>a[i];
x=a;
}
voidprint()//按行列显示
{
inti=0;
for(intr=0;r{
for(intc=0;c{
cout<i++;
}
cout<}
}
voidchange()//将二维数组行列转换
{
//注意:
当数组i从0开始遍历时,根据规则计算出当前行r=i/n,当前列c=i%n
//根据当前行列数计算出需要互换的下标k=c*n+r
//为避免换过的再换,如3X3数组,当i=1,k=3,二者互换,当i=3时,k=1,此时就不能再换
intr=0,c=0;//r,c分别