东南大学非电专业C++下学期上机作业题.docx
- 文档编号:28438409
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:85
- 大小:64.68KB
东南大学非电专业C++下学期上机作业题.docx
《东南大学非电专业C++下学期上机作业题.docx》由会员分享,可在线阅读,更多相关《东南大学非电专业C++下学期上机作业题.docx(85页珍藏版)》请在冰豆网上搜索。
东南大学非电专业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< 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< p=p->next; } cout< } 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分别
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东南大学 专业 C+ 下学 上机 作业题
![提示](https://static.bdocx.com/images/bang_tan.gif)