西安交大C--程序设计第六章作业DOC
- 格式:doc
- 大小:944.34 KB
- 文档页数:24
西安交通大学实验报告课程计算机程序设计实验名称指针与函数第 1 页共 25 页系别实验日期 2014 年 4月 18日专业班级组别实验报告日期 2014 年 4 月 19日姓名学号_ _报告退发 ( 订正、重做 )同组人教师审批签字一、实验目的学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容(一)第一题:1、(必做题)使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k>0) ,计算。
1.源程序代码:<>;( k)递归函数用于计算x^k(){x;k;<<"请输入实数x:";>>x;<<"请输入正整数k:";>>k;(k<=0)判断输入的k是否满足要求,若否则提示输入错误并重新输入{<<"您的输入有误!请输入正整数:";>>k;}<<"计算结果是:"<<x<<"^"<<k<<"="<<()<<输出运算结果0;}( k){(1)1时不再进行循环,输出值为xx;{*(1)对于k大于1的情况,进入下一循环s;}}2.实验结果:(1)输入X正实数:(2)输入X正整数:(3)输入x为负数:(4)输入k为负数:3.问题分析:该函数的循环方式是:x^*x^(1).设f()^k,那么就有f()(1)*x.而其结束递归的条件是1,此时有f(x,1),由此给出初值。
(二)第二题:使用递归算法编写求斐波那契数列的第 n 项的函数,并编出主函数进行验证。
1.源程序代码:<>;( n)递归函数,计算斐波那契数列的第n项{(0)对于0不再进行递归,返回值00;{(1)1对于1不再进行递归,返回值1{(1)(2)将计算第n项归为计算第1和2项s;}}}(){n;<<"请输入要计算的项数(非负整数):"提示输入项数,首项为第0项>>n;(n<0)对于不符合要求的输入值重新输入{<<"输入有误,请输入非负整数:";>>n;}<<"计算结果是:["<<n<<"]="<<(n)<<输出计算结果0;}2.实验结果:(1)输入项数正确(0或正整数):(2)输入项数有误(负数):3.问题分析:该题的递归方式:第n项为之前两项之和,即:(n)(1)(2),由此递归至(1)和(2)时结束递归,而(1)和(2)已知。
西安交大c++程序设计第六章作业Document number:NOCG-YUNOO-BUYTT-UU986-1986UT西安交通大学实验报告课程__计算机程序设计__实验名称__指针与函数__第 1 页共 25 页系别____ _______ 实验日期 2014 年 4月 18日专业班级__ ____组别_____________ 实验报告日期 2014 年 4 月 19日姓名___ _______学号_ _报告退发 ( 订正、重做 )同组人_________________________________ 教师审批签字一、实验目的学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容(一)第一题:1、(必做题)使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k>0) ,计算 Xk 。
1.源程序代码:#include<iostream>using namespace std;double yunsuan(double x,int k);验结果:(1)输入X正实数:(2)输入X正整数:(3)输入x为负数:(4)输入k为负数:3.问题分析:该函数的循环方式是:x^k=x*x^(k-1).设f(x,k)=x^k,那么就有f(x,k)=f(x,k-1)*x.而其结束递归的条件是k=1,此时有f(x,1)=x,由此给出初值。
(二)第二题:使用递归算法编写求斐波那契数列的第 n 项的函数,并编出主函数进行验证。
1.源程序代码:#include<iostream>using namespace std;int fib(int n)验结果:(1)输入项数正确(0或正整数):(2)输入项数有误(负数):3.问题分析:该题的递归方式:第n项为之前两项之和,即:fib(n)=fib(n-1)+fib(n-2),由此递归至fib(1)和fib(2)时结束递归,而fib(1)和fib(2)已知。
习题及实验解答第六章一、选择题1、应为4(无正确选项)2、D3、B C4、D5、A6、A7、C8、B9、A 10、A二、程序填空1、stu[i].score k=j p[k]=p[i] p[i]=temp2、p!=NULL p->data p->next3、struct node * s->data=ch r=s NULL三、编程题1、#include "iostream.h"struct staff{char num[6];char name[8];float salary[3]; //分项工资float gs; //实得工资}s[100];void main( ){int i,j,n;cin>>n; /*输入职工人数*/for(i=0;i<n;i++){cin>>s[i].num>>s[i].name;for(j=0;j<3;j++)cin>>s[i].salary[j];}cout<<"NO. salary\n";for(i=0;i<n;i++){s[i].gs= s[i].salary[0]+ s[i].salary[1]- s[i].salary[2] ;cout<<s[i].num<<'\t'<<s[i].gs<<endl;}}2、#include "iostream.h"#include "stdio.h"struct str{char ch;struct str *next;};void main(){char s[100];int i=0,num=0;struct str *insert,*head=NULL,*p;gets(s);while(s[i]!='\0'){insert=new str;insert->ch=s[i];if(head==NULL){head=insert ;head->next=NULL;}else{insert->next=head ;head=insert;}i++;}p=head;while(p!=NULL){if(p->ch>='A'&&p->ch<='Z')num++;cout<<p->ch;p=p->next;}cout<<endl<<"num="<<num<<endl; }3、#include "iostream.h"#include "stdio.h"struct node{char ch;int count;struct node *next;};void main( ){struct node *head,*p1,*p2,*insert;char c;head=NULL;while((c=getchar())!='\n'){p1=head;while(p1!=NULL&&c>p1->ch){p2=p1;p1=p1->next;}if(p1==NULL){insert=new node;insert->ch=c;insert->count=1;if(head==NULL){insert->next=head;head=insert;}else{insert->next=NULL;p2->next=insert;}}else if(c==p1->ch)p1->count++;else{insert=new node;insert->ch=c;insert->count=1;if(p1==head){insert->next=head;head=insert;}else{insert->next=p1;p2->next=insert;}}}p1=head;while(p1!=NULL){cout<<p1->ch<<' '<<p1->count<<'\t';p1=p1->next;}}4、#include "stdio.h"#include "iostream.h"struct node{int coef;int expn;struct node *next;};struct node *creat(){struct node *head,*tail,*p;int c,e;head=NULL;cin>>c>>e;while(c!=0) //约定以输入系数为0作为多项式的结束{p=new node;p->coef=c;p->expn=e;if(head==NULL)head=p;elsetail->next=p;tail=p;cin>>c>>e;}tail->next=NULL;return head;}void print(struct node *h){struct node *p;p=h;while(p!=NULL){if(p->next!=NULL)cout<<p->coef<<'x'<<p->expn<<'+';else{if(p->coef!=0&&p->expn!=0)cout<<p->coef<<'x'<<p->expn<<endl;else if(p->coef!=0)cout<<p->coef<<endl;elsecout<<endl;}p=p->next;}}void main(){struct node *h1,*p1,*h2,*p2,*h3,*p3,*newnode,*t3;h1=creat();print(h1);h2=creat();print(h2);p2=h2;h3=NULL;p1=h1;p2=h2;p3=h3;t3=h3;while(p1!=NULL&&p2!=NULL){newnode=new node;if(p1->expn>p2->expn){newnode->coef=p1->coef;newnode->expn=p1->expn;p1=p1->next;}else if(p1->expn<p2->expn){newnode->coef=p2->coef;newnode->expn=p2->expn;p2=p2->next;}else{newnode->coef=p2->coef+p1->coef;newnode->expn=p2->expn;p2=p2->next;p1=p1->next;}if(h3==NULL){h3=newnode;t3=newnode;}elset3->next=newnode;t3=newnode;}if(p1==NULL)t3->next=p2;elset3->next=p1;print(h3);}第七章一、选择题1、D2、B3、B4、A5、B6、A7、D8、B9、C 10、B二、程序填空1、fname, “w”(ch=getchar())!=’#’count++2、(c=fgetc(fp)) length++ length=03、”wb”&emp, sizeof(employer),1,fp fclose(fp) “rb”&emp, sizeof(employer),1,fp三、编程题1、#include "iostream.h"#include "stdlib.h"#include "stdio.h"void main(){FILE *fp1,*fp2;char ch;fp1=fopen("f1.txt","a");if(fp1==NULL){cout<<"can't open f1.\n";exit(1);}if((fp2=fopen("f2.txt","r"))==NULL){cout<<"can't open f2.\n";exit(1);}while(1){ch=fgetc(fp2);if(feof(fp2))break;cout<<ch;fputc(ch,fp1);}fclose(fp1);fclose(fp2);}2、#include "iostream.h"#include "stdlib.h"#include "stdio.h"void main(){FILE *fp;int a[10],i,j;if((fp=fopen("d1.dat","w"))==NULL){cout<<"can't open d1.\n";exit(1);}for(i=0;i<10;i++)a[i]=rand();for(i=0;i<9;i++)for(j=0;j<9-i;j++)if(a[j]<a[j+1]){int t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i<10;i++)fprintf(fp,"%d\t",a[i]);fclose(fp);}3、#include "iostream.h"#include "stdlib.h"#include "stdio.h"#include "string.h"void main(){FILE *fp;char s[100];int a[26]={0},i;if((fp=fopen("f.txt","r"))==NULL){cout<<"can't open f.\n";exit(1);}fgets(s,100,fp);strlwr(s);i=0;while(s[i]!='\0'){if(s[i]>='a'&&s[i]<='z')a[s[i]-'a']++;i++;}for(i=0;i<26;i++)cout<<(char)('a'+i)<<":"<<a[i]<<endl;fclose(fp);}4、#include "iostream.h"#include "stdlib.h"#include "stdio.h"struct student{char num[8];char name[20];double s[3],ave;}st[5];void main(){student stu[5];FILE *fp;int i;if((fp=fopen("stu","wb"))==NULL){cout<<"can't open stu.\n";exit(1);}for(i=0;i<5;i++){cin>>stu[i].num>>stu[i].name>>stu[i].s[0]>>stu[i].s[1]>>stu[i].s[2];stu[i].ave=(stu[i].s[0]+stu[i].s[1]+stu[i].s[2])/3;}fwrite(stu,sizeof(student),5,fp);fclose(fp);}第八章一、选择题1、A2、A3、C4、C5、6、D7、B8、D9、C 10、B11、D 12、A 13、B 14、D 15、D二、阅读程序写结果1、con1 calledcon2 calledcon3 calleda=0,b=0a=10,b=10a=10,b=202、0 51 52 53 54 53、4564、10,106,67,95、x=0x=10x=7三、编程题1、#include "iostream.h"#include "string.h"class Cat{private:int age;double weight;char color[10];public:void set(int a,double w,char c[10]){age=a;weight=w;strcpy(color,c);}void print(){cout<<"age:"<<age<<"\tweight:"<<weight<<"\color:"<<color<<endl;}int getage(){return age;}double getweight(){return weight;}char *getcolor(){return color;}};void main(){Cat c1;int a;double w;char c[10];cin>>a>>w>>c;c1.set(a,w,c);c1.print();}2、#include "iostream.h"#include "string.h"#include "stdio.h"class Mystring{private:char *str;public:Mystring(){ }Mystring(char *s){str=new char[100];strcpy(str,s);}void set(char *s){str=new char[100];strcpy(str,s);}void print(){cout<<str<<endl;}int length( ){int i=0;while(str[i]!='\0')i++;return i;}char *stringcat(Mystring s2){int i=0,j=0;while(str[i]!='\0')i++;while(s2.str[j]!='\0')str[i++]=s2.str[j++];str[i]='\0';return str;}};void main(){Mystring s1;char s[100];gets(s);s1.set(s);s1.print();gets(s);Mystring s2(s);s2.print();cout<<s1.stringcat(s2);}3、#include "iostream.h"#include "string.h"#include "stdio.h"class Point{private:double x,y;public:Point(){ }Point(double x1,double y1){x=x1;y=y1;}void set(double x1,double y1){x=x1;y=y1;}void move(double x1,double y1){x=x+x1;y=y+y1;}void print(){cout<<"("<<x<<","<<y<<")"<<endl;}double getx(){ return x;}double gety(){ return y;}};class Circle:public Point{private:double r;public:void set(double x1,double y1,double r1){Point::set(x1,y1);r=r1;}void print(){Point::print();cout<<r<<endl;}double getr(){ return r;}double s(){ return 3.14*r*r;}};void main(){Point p1;Circle c1;double x1,y1,r1;cin>>x1>>y1;p1.set (x1,y1);p1.print ();cin>>x1>>y1;p1.move (x1,y1);p1.print ();cin>>x1>>y1>>r1;c1.set (x1,y1,r1);c1.print ();cout<<c1.s()<<endl;}4、#include "iostream.h"class Point{private:int x,y;public:Point(){ }Point(int x1,int y1){ x=x1; y=y1;}friend Point operator+(Point &p1,Point &p2){Point p(p1.x+p2.x,p1.y+p2.y);return p;}void print(){cout<<"("<<x<<","<<y<<")"<<endl;}};void main(){Point p1(1,2),p2(2,3),p3;p3=p1+p2;p3.print();}5、#include "iostream.h"#include "stdio.h"#include "string.h"class Teacher{private:char name[20];public:void virtual input(){cout<<"input name:";cin>>name;}virtual double wage()=0;void virtual print(){cout<<name<<'\t';}};class Professor:public Teacher{private:int cnum; //课时数public:void input(){Teacher::input ();cout<<"input cnum:";cin>>cnum;}double wage(){return (3000+40*cnum);}void print(){Teacher::print ();cout<<wage()<<endl;}};class ViceProfessor:public Teacher {private:int cnum; //课时数public:void input(){Teacher::input ();cout<<"input cnum:";cin>>cnum;}double wage(){return (2500+30*cnum);}void print(){Teacher::print ();cout<<wage()<<endl;}};class Lecture:public Teacher{private:int cnum; //课时数public:void input(){Teacher::input ();cout<<"input cnum:";cin>>cnum;}double wage(){return (2000+25*cnum);}void print(){Teacher::print ();cout<<wage()<<endl;}};void main(){Teacher *t;Professor *p;ViceProfessor *vp;Lecture *l;char ptitle[20],ch;//职称do{cout<<"input ptitle(professor,viceprofessor or lecture):"<<endl;gets(ptitle);if(!strcmp(ptitle,"professor")){p=new Professor;t=p;}else if(!strcmp(ptitle,"viceprofessor")){vp=new ViceProfessor;t=vp;}else{l=new Lecture;t=l;}t->input ();t->print ();cout<<"continue(y/n)?";cin>>ch;}while(ch=='y');}。
在下列代码中,有(B )处实现了拆箱。
int score=5;object o= score;o=10;score =(int)o;object oScore = score;A.2B.1C.0D.32单选(2分)下面控制对成员访问描述错误的是(B )A.如果一个类试图去使用另一个类的私有成员,则编译器会产生错误消息,提示这些私有成员无法访问B.如果类的成员没有用访问修饰符声明,则默认为共有的C.类的私有变量、属性和方法时类的对象无法直接访问的D.访问修饰符public和private控制着对类的变量、方法和属性的访问3单选(2分)有关this引用访问当前对象成员的描述正确的是(D)A.调用特定对象的的非静态方法时,方法体会显式用this引用这个对象的实例变量、其他方法和属性B.如果方法包含与字段同名的局部变量,则方法将引用字段而不是局部变量C.方法中的参数名或局部变量名应尽可能和字段名保持一致,方便阅读D.每个对象都可以用关键字this引用自己4单选(2分)有关构造函数的说法,错误的是()A.要重载构造函数,只需提供具有不同签名的多个构造函数声明B.每个类都必须至少有一个构造函数C.当实现类的方法时,应使用类的属性来访问类的私有数据,这样可以减少代码维护的工作量,降低出错的可能性D.不管是否显式的声明了构造函数,编译器都会创建默认的构造函数5单选(2分)有关析构函数和内存回收的描述正确的是(B)A.在内存回收期回收对象的内存之前,析构函数由内存回收期调用,执行终止清理工作。
析构函数和构造函数类似,可以重载B.析构函数没有任何修饰符、没有任何参数、也不返回任何值C.析构函数的名字由符号“~”加类名组成,其中“~”可以省略D.析构函数可以被自动调用,也可以主动显示的调用下面对readonly和const修饰的实例变量不正确的是(D )A.动态常量(readonly)的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。
Q6-6: a、0.11;b、0.56;c、0.55Q6-9:就绪态表示该进程已经可以执行,等待CPU调度等待态表示该进程的执行条件还不满足,还在等待I/O或其他进程的数据,或触发其运行的定时器尚未期满等Q6-12:进程超周期。
a、10;b、20;c、60Q6-13: 进程超周期为200增加一个P1示例后的CPU利用率= 4/200+4/200+1/10+2/40+6/50=0.31远没有达到RMS的CPU利用率的最小上界0.69,可以增加P1的另一个示例。
Q6-14:进程超周期为100,则 CPU利用率=0.1+0.18+0.1+0.1+x/25,如按5个任务的RMS的利用率的最小上界~74.3%计算x<(0.69-0.48)*25=6.5, P5的最大执行时间可选为6。
Q6-17应用RMS调度的时序图根据RMS的优先级定义,优先级P1>P2>P3,超周期为12EDF调度(该题的EDF和RMS的调度一样)Q6‐18第三个进程截止时限改为8,进程超周期为24采用RMS调度,优先级P1>P2>P3 ,具体调度如下图如果采用EDF调度,如进程距离截止时限一样近,则优先级按P1>P2>P3顺序 ,具体调度如下表所示:时间 运行中的进程 截止时限0 P11 P22 P3 P13 P1 P24 P25 P3 P16 P17 idle P2 ,P38 P2 P19 P110 P311 P3 P1,P212 P113 P214 idle P115 P1 P2,P316 P217 P3 P118 P119 P3 P220 P2 P121 P122 idle23 idle P1,P2,P3Q6‐21使用RMS调度,优先级顺序为P5 P1 P2 P4 P3,进程超周期为120时间 运行中的进程0 P51 P12 P13 P24 P25 P26 P27 P48 P49 P410 P411 P412 P313 P314 P315 P516 P317 P318 P319 P330 P531 P132 P140 P241 P242 P243 P245 P560 P561 P162 P163 P464 P465 P466 P467 P475 P580 P281 P282 P283 P291 P192 P1105 P5若增加上下文切换时间为1,则时间 运行中的进程0 P51 P52 P13 P14 P15 P26 P27 P28 P29 P210 P411 P412 P413 P414 P415 P516 P517 P418 P419 P320 P321 P322 P323 P324 P325 P326 P330 P531 P532 P133 P134 P140 P241 P242 P243 P244 P246 P560 P561 P562 P163 P164 P165 P466 P467 P468 P469 P470 P475 P576 P581 P282 P283 P284 P285 P290 P591 P592 P193 P194 P1105 P5106 P5Q6‐22使用RMS调度,超周期为100。
第1章 C++语言简介1.在计算机上调试运行本章的所有例题,熟悉实验环境和方法。
2.仿照例1-3,编写一个计算矩形面积的程序。
3.乘法计算器程序:可以根据例1-4自行改编。
4.修改例1-5的生日卡程序,使其能够输入和显示日期。
5.使用梯形法计算下式定积分的值。
⎰-+11sin dx e x x积分区域等分数可取为200,并将计算结果和手算结果相比较。
提示:e x 用math.h 中得库函数exp(x)表示。
第2章 控制结构1.编写计算阶乘 n!的程序。
2.编写程序求斐波那契数列的第n 项和前n 项之和。
斐波那契数列是形如0, 1, 1, 2, 3, 5, 8, 13, ...其通项为:F 0 = 0;F 1 = 1;F n = F n -1+F n -2。
3.编程求 ...)12()!(2)!2(...5423132arcsin 221252++++⋅⋅⋅⋅+⋅+≈+n n x n x x x x n n ,其中1<x 。
提示:结束条件可用 ε<u ,其中u 为通项。
4.求解猴子吃桃问题。
猴子在第一天摘下若干个桃子,当即就吃了一半,又感觉不过瘾,于是就多吃了一个。
以后每天如此,到第10天时,就只剩下了一个桃子。
请编程计算第一天猴子摘的桃子个数。
5.用弦截法求一元方程0)(=x f 在区间[]10,x x 之间的一个根。
提示:考虑当区间[]10,x x 足够小,在此区间中方程0)(=x f 仅有一个单根的情况,如图2.14所示。
图2.14 弦截法求方程的解此时如)(0x f 和)(1x f 异号,则可用两点间直线公式求出x 2:)()()(0101002x f x f x f x x x x ---= 然后用x 2代入原式求出f (x 2),判断f (x 2)与f (x 1)和f (x 0)中的哪一个同号,就用x 2和f (x 2)代替之,即如果f (x 2)和f (x 0)同号,就用x 2和f (x 2)代替x 0和f (x 0),反之用x 2和f (x 2)代替x 1和f (x 1),然后再继续上述过程直至|x 2-x 0|或|x 2-x 1|小于给定的误差控制值。
西安交通大学18年9月课程考试《程序设计基础(高起专)》作业考核试题work Information Technology Company.2020YEAR(单选题) 1: 要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是()。
A: fopen("A.\user\abc.txt","r")B: fopen("A.\\user\\abc.txt","r+")C: fopen("A.\user\abc.txt","rb")D: fopen("A.\\user\\abc.txt","w")正确答案:(单选题) 2: 语句while(!E);中的表达式!E等价于()。
A: E==0B: E!=1C: E!=0D: E==1正确答案:(单选题) 3: 若执行fopen函数时发生错误,则函数的返回值是()。
A: 地址值B: 0C: 1D: EOF正确答案:(单选题) 4: 以下说法错误的是()A: C语言函数分为由系统提供的标准库函数和由程序员自己定义的函数B: 在主函数main()中可以调用其他函数,其他函数之间不可以相互调用C: C语言的程序是由一个函数或多个函数组成的D: 对于一个很大的任务,一般把它分解成若干源文件,分别编写和调试正确答案:(单选题) 5: 已知int j,i=1;执行语句“j=i++;”后,变量i的值是( )A: 1B: 2C: -1D: -2正确答案:(单选题) 6: 变量的指针,其含义是指该变量的()。
A: 值B: 地址C: 名D: 一个标志正确答案:(单选题) 7: 关于建立函数的目的,以下正确的说法是()。
A: 提高程序的执行效率B: 提高程序的可读性C: 减少程序的篇幅D: 减少程序文件所占内存正确答案:(单选题) 8: 以下对C语言函数的描述中,正确的是()。
题目1
C语句: int (* pa)[5]; 中,pa 表示的是一个()
A. 指针数组的名称
B. 指向整型变量的指针
C. 指向函数的指针
D. 指向包含5个整型元素的一维数组的指针正确
正确答案是:指向包含5个整型元素的一维数组的指针
题目2
两个指针变量不能()
A. 比较
B. 相加正确
C. 相减
D. 指向同一地址
正确答案是:相加
题目3
C 语句int *func(); 中,func 表示的是()
A. 指向整型变量的指针
B. 指向函数的指针
C. 指向数组的指针
D. 返回值为指针的函数名称正确
正确答案是:返回值为指针的函数名称
题目4
若C程序中作char str1[10], str2[10], *strp;说明,则交换str1和str2中的内容可用语句strp= str1; str1=str2; str2=strp;实现。
a. 对
b. 错正确
正确答案是:错
题目5
C语言用数组名表示数组的首地址,其值在程序运行期间固定不变。
a. 错
b. 对正确
正确答案是:对。
西安交通大学实验报告课程__计算机程序设计__实验名称__指针与函数__第 1 页共 25 页系别____ _______ 实验日期 2014 年 4月 18日专业班级__ ____组别_____________ 实验报告日期 2014 年 4 月 19日姓名___ _______学号_ _ 报告退发 ( 订正、重做 )同组人_________________________________ 教师审批签字一、实验目的学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容(一)第一题:1、(必做题)使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k>0) ,计算 Xk 。
1.源程序代码:#include<iostream>using namespace std;double yunsuan(double x,int k);//递归函数用于计算x^kint main(){double x;int k;cout<<"请输入实数x:";cin>>x;cout<<"请输入正整数k:";cin>>k;while(k<=0)//判断输入的k是否满足要求,若否则提示输入错误并重新输入{cout<<"您的输入有误!请输入正整数:";cin>>k;}cout<<"计算结果是:"<<x<<"^"<<k<<"="<<yunsuan(x,k)<<endl;//输出运算结果return 0;}double yunsuan(double x,int k){if(k==1)//k=1时不再进行循环,输出值为xreturn x;else{double s=x*yunsuan(x,k-1);//对于k大于1的情况,进入下一循环return s;}}2.实验结果:(1)输入X正实数:(2)输入X正整数:(3)输入x为负数:(4)输入k为负数:3.问题分析:该函数的循环方式是:x^k=x*x^(k-1).设f(x,k)=x^k,那么就有f(x,k)=f(x,k-1)*x.而其结束递归的条件是k=1,此时有f(x,1)=x,由此给出初值。
(二)第二题:使用递归算法编写求斐波那契数列的第 n 项的函数,并编出主函数进行验证。
1.源程序代码:#include<iostream>using namespace std;int fib(int n) //递归函数,计算斐波那契数列的第n项{if(n==0)//对于n=0不再进行递归,返回值0return 0;else{if(n==1)return 1;//对于n=1不再进行递归,返回值1else{int s=fib(n-1)+fib(n-2);//将计算第n项归为计算第n-1和n-2项return s;}}}int main(){int n;cout<<"请输入要计算的项数(非负整数):";//提示输入项数,首项为第0项cin>>n;while(n<0)//对于不符合要求的输入值重新输入{cout<<"输入有误,请输入非负整数:";cin>>n;}cout<<"计算结果是:fib["<<n<<"]="<<fib(n)<<endl;//输出计算结果return 0;}2.实验结果:(1)输入项数正确(0或正整数):(2)输入项数有误(负数):3.问题分析:该题的递归方式:第n项为之前两项之和,即:fib(n)=fib(n-1)+fib(n-2),由此递归至fib(1)和fib(2)时结束递归,而fib(1)和fib(2)已知。
(三)第三题:重载判断两个数值大小的函数 max ,这些数值可能是整型数、实型数和字符型,函数的返回值为两个数值中的最大值。
1.源程序代码:#include<iostream>using namespace std;double zhuanhuan(char *c)//为了避免语句的重复,将字符与数值转换部分作为函数{int i=0;double x=0;if(c[0]=='-'||c[0]=='+')//若首字符为‘-’或者‘+’则跳过i++;while(c[i]!='\0'&&c[i]!='.')//对于整数部分逐位累加,直至遇到小数点或者数字结束{x=x*10+(c[i]-'0');i++;}if(c[i]=='.')//对于小数部分进行累加{double s;//s用来反映数字所在位置是小数点后第几位,就用该数乘以的负几次方(s)i++;//从小数点后的一位开始循环for(s=0.1;c[i]!='\0';i++){x=x+s*(c[i]-'0');s=s/10;}}if(c[0]=='-')//若为负数,则在上述计算基础上乘以-1得到最终值x=-x;return x;//返回x作为char c的对应的数值}int imax(int a,int b)//对整型数进行处理{if(a>=b)return a;return b;}double imax(double a,double b)//对实数进行处理{if(a>=b)return a;return b;}double imax(char *c,char *d)//对字符型进行处理{double x=zhuanhuan(c);double y=zhuanhuan(d);return (x>=y?x:y);}int main(){int n;cout<<"请选择您要输入的数的类型,\n如果是整型请输入,实数型输入,字符型输入:";cin>>n;while(n!=1&&n!=2&&n!=3){cout<<"输入有误!重新选择:";cin>>n;}int a[2];double b[2];char c[12],d[12];if(n==1)//处理整型数{cout<<"请输入两个数:";cin>>a[0]>>a[1];cout<<"最大值为:"<<imax(a[0],a[1]);}else{if(n==2)//处理实数{cout<<"请输入两个数:";cin>>b[0]>>b[1];cout<<"最大值为:"<<imax(b[0],b[1]);}else//处理字符型{cout<<"请输入第一个数:";cin>>c;cout<<"请输入第二个数:";cin>>d;cout<<"最大值为:"<<imax(c,d);}}cout<<endl;return 0;}2.实验结果:(1)输入整数型:(2)输入为实数:(3)输入为字符:正数:(带正号):(不带正号):整数:负数:3.问题分析:该题的重点在于字符型的处理。
在实验报告中,采取了两个数字逐个分开输入的方法,因而主要只需要判断开头是否为负号、中间是否有小数点并区别小数点前后处理方法的不同这几个问题。
如果能够一次性输入两个数中间用空格隔开的话,就需要判断空格的位置,然后对空格之后的部分再进行与前半部分相同的判断方法,显得更加麻烦。
对字符型的处理思路:首先判断首字符是不是“-”或者“+”,如果是的话,先跳过从第二个字符开始处理,在最终的结果中再乘以-1即可;然后对于接下来的整数部分进行累加,直到遇见小数点,若没有小数点则一直执行到字符结束;如果有小数点的话,对于小数点后的部分再进行累加得到结果。
四、第四题:编写一个函数,用于去掉字符串前面的空格,其原型为 : char *myltrim(char *string);其中参数 string 为字符串,返回值为指向 string 的指针。
1.源程序代码:#include<iostream>using namespace std;char *myltrim(char *string){int i=0,j=0;while(*(string+i)==' ')i++;do{*(string+j)=*(string+i);i++;j++;}while(*(string+i-1)!='\0');return string;}int main(){char string[41];cout<<"请输入字符串:";cin.get(string,40);cout<<"去掉开头的空格之后为:\n"<<myltrim(string)<<endl;return 0;}2.实验结果:为验证处理空格时仅是将开头处理而不处理中间空格:(1)中间无空格:(2)中间有空格:3.问题分析:曾经出现的问题:起初运行时发现,即使没有判断开头空格的程序,输出结果也是没有空格的,后来检查发现是输入语句没有写为cin.get导致空格不被录入。
五、第五题:用牛顿迭代法求任意一元方程:anXn+an-1Xn-1+......+a1X1+a0 = 0 的根。
提示:迭代公式:Xn+1 = Xn + f(Xn) / f'(Xn)结束迭代过程的条件为(|f(Xn+1)|<ε)与(|Xn+1 - Xn|<ε)同时成立,其中ε为预先给定的精度要求。
1.源程序代码:#include<iostream>using namespace std;double cf(double x,int k)//乘方函数,输出结果为x的k次方{double s=1;while(k>0){s=s*x;k--;}return s;}double f(int n,double *a,double x)//计算函数值f(x)的函数{double sum=0;for(int i=0;i<n;i++){sum=sum+(*(a+i))*cf(x,i);}return sum;}double f_(int n,double *a,double x)//求导f_(x)函数{double sum=0;for(int i=1;i<n;i++){sum=sum+(*(a+i))*i*cf(x,i-1);}return sum;}double result(int n,double *a,double x) //求根函数{double u=0.00000001;//给定精确度double m;//设m为中间变量储存x,以便于进行循环条件的判断do{m=x;x=x-(f(n,a,x)/f_(n,a,x));}while(f(n,a,x)>=u||f(n,a,x)<=-u||x-m>=u||x-m<=-u);//循环直到达到精度return x;//返回最终计算结果}int main(){int n,i;cout<<"请输入最高项次数:";cin>>n;double *a=new double[n+1];//申请数组空间cout<<"请从低到高输入系数:";for(i=0;i<n+1;i++)cin>>*(a+i);double x=0;cout<<"计算结果为:"<<result(n+1,a,x)<<endl;delete a;//释放数组空间return 0;}2.实验结果:3.问题分析:思路分析:程序中用到的多个函数:乘方函数、计算f(x)、f_(x)的函数、自定义的求根的主体的函数、主函数。