东南大学非电专业C++下学期上机作业题.docx

上传人:b****5 文档编号:28438409 上传时间:2023-07-13 格式:DOCX 页数:85 大小:64.68KB
下载 相关 举报
东南大学非电专业C++下学期上机作业题.docx_第1页
第1页 / 共85页
东南大学非电专业C++下学期上机作业题.docx_第2页
第2页 / 共85页
东南大学非电专业C++下学期上机作业题.docx_第3页
第3页 / 共85页
东南大学非电专业C++下学期上机作业题.docx_第4页
第4页 / 共85页
东南大学非电专业C++下学期上机作业题.docx_第5页
第5页 / 共85页
点击查看更多>>
下载资源
资源描述

东南大学非电专业C++下学期上机作业题.docx

《东南大学非电专业C++下学期上机作业题.docx》由会员分享,可在线阅读,更多相关《东南大学非电专业C++下学期上机作业题.docx(85页珍藏版)》请在冰豆网上搜索。

东南大学非电专业C++下学期上机作业题.docx

东南大学非电专业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&&i

find(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&&i

find(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;i

cin>>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分别

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1