C++规范设计简易教程思维训练答案精品文档34页

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章答案
1简答题
(1)自顶而下,逐步求精,模块设计,结构编程
(2)函数
(3)模块是内容,文件是载体
(4) main
(5)主模块,自定义模块,自定义模块说明
(6)包含是为了引用sqrt函数
(7)需要连接
(8)方案一更好。

原因是命名规范,注释清楚
(9) 5
(10)图如下:
2选择题
C D A B B
A A ABCD A A
3判断题
图形表达式
int getAverage(int data1,int
data2){...}
int getSquareVol(int l,int w,int
h){...}
float getBallArea(float r){...}
void textOut(int x,int y,char *
content){...}
float getCentigrade(float
fah){...}
6,7,8同型题参与教材相关代码和图形
9答辩题部分代码
int getPolyValue(int x)
return x*x*x+3*x+1;
10答辩题部分代码
int getMax(int a,int b)
if (a>b)
return a;
else
return b;
int getCube(int x)
return x*x*x;
11答辩题部分代码
float getCircleArea(float r)
return 3.14*r*r;
12
(1)升旗仪式:取旗,奏国歌,升旗,行礼,降旗
(2)写论文:写题纲,找资料,写作,修改
(3)炸碉堡:取炸药包,掩护,埋包,退回,引爆
(4)旅游策划:确定目的地,定路线,订宾馆,订机票等。

第二章答案
1简答题
(1)编译出错:通过出错信息,定位并改正语法错误;连接出错:检查申明和源码之间是滞匹配等;运行出错:单步调试或者断点调试等,检查变量的状态。

(2) F10/F11交替使用单步调试,使用变量窗口和查看窗口查看数据状态。

(3)最关键的是cpp源码文件和h声明文件。

如主模块所在cpp源码文件,自定义模块所在cpp源码文件,自定义模块的h声明文件。

拷贝一个项目两种方法:一是拷贝整个项目;二是拷贝cpp和h文件。

(4)放在章节目录下,如第一章程序位置:c:\c++\chapt1
(5)新建项目、拷贝核心文件(源码和声明)、项目中添加核心文件
(6)随机值,因为编译时,会将变量赋一个随机值
(7)错误信息:c没有被定义
(8)在相应位置设置断点(F9),运行至断点(F5)即可通过变量窗口查看此时值(9)三种常用函数:绝对值函数fabs(3) 正弦函数sin(4) 求平方根函数sqrt(2)。

使用数学函数,要加#include <math.h>
(10)项目名为:ThreeMaxMinProj,项目下建立3个文件,模型图如下:
2选择题
B B A A A
A B ABC C A
3选择题
4改错题
(1)正确答案
#include <iostream.h>
int getPoly3Value(int x);
int main(){
int x,y ;
cin>>x;
y=getPoly3Value(x);
cout<<y;
return 0;
int getPoly3Value(int x){
return x*x*x+2*x*x+1;
(2)正确答案
#include <iostream.h>
void swap(a,b);
int main(){
int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<b;
return 0;
void swap(int a,int b){
int temp;
temp=a;a=b;b=temp;
(3)主模块中调用getSquareSum,但并没有声明。

修改:将Int.h中将getSquare改为getSquareSum
(4)清单文件中声明是getSquareSum模块,但源码文件提供是getSquare模块,不匹配,故连接出错。

修改:将Int.cpp中将getSquare改为getSquareSum
5调试题
aa, bb, cc的值是3,4,5
图形表达式
int getCommDiv(int data1,int data2)
int getCommMult(int data1,int
data2)
char* strCat(char* str1,char* str2)
int getSeriesN(int n)
int getMax(int a,int b,int c)
void printMax(int a,int b,int c)
void printAllInt(void)
8答辩题-模块代码
int findMax(int aa,int bb,int cc)
if(aa>bb&&aa>cc) return aa;
if(bb>aa&&bb>cc) return bb;
if(cc>aa&&cc>aa) return cc;
9答辩题-模块代码
#include <math.h>
float getDeposit(float capital,float rate,int year)//可归属于Finance float deposit;
deposit=capital*pow(1+rate,year);
return deposit;
10编程题(提高)-模块代码
#include <iostream.h>
#include "Finance"
int main(){
float capital,rate;
int year;
float result1,result21,result22;
//不转存情况
capital=10000;rate=0.03;year=5;
result1=getDeposit(capital,rate,year);
cout<<"不转存情况"<<result1<<endl;
//转存,先求前三年,在此基础上,求后两年
capital=10000;rate=0.02;year=3;
result21=getDeposit(capital,rate,year);
capital=result21;rate=0.04;year=2;
result22=getDeposit(capital,rate,year);
cout<<"转存情况"<<result22<<endl;
第三章答案
1简答题
(1)假如整形变量a,则(int)a强制转成小数
(2)算术>关系>逻辑
(3)大于小于等于不等于等
(4)字符常量用单引号,字符串常量用双引号。

如’a’与”a”
(5)三步骤:定义,声明,使用
(6)’a’是字符a,其码值是97;’\a’是字符响铃,其码值是7。

’0’是字符0,其码值是48;’\0’是不可见字符,其码值是0。

(7) void
(8)假如整形变量a,通过sizeof(a)可知道分配多少单元
(9)小数表示法,科学计数法
(10)-2147483648 --- 2147483647
(11)假如整形变量a,则一个整数得到最后一位方法:a%10;去除最后一位方法:a/10
2选择题
C C A A B
B A A A A A 注:第7题题目答案有改变
3计算题
(1)25 (2)12.5 (3)18
char getChangedChar(char ch) return ch+5;
第四章答案
1简答题
(1)在传递的模块中改变自身的值
(2)传地址、类型匹配、间接操作
(3) sizeof(指针变量)
(4)随机地址
(5)不能直接赋值,需要强制转成整形地址后再赋值。

int *p;p=(int *)0x12ff7c;
(6) pC++表示指针移动1个字节;pI++表示指针移动4个字节
void setMaxMin(float a,float b,float *pMax,float *pMin){ if (a>b) {
*pMax=a;*pMin=b;
else {
*pMax=b;*pMin=a;
5编程题
int getMax(int data1,int data2,int data3)
int max;
if (data1>data2&&data1>data3) max=data1;
if (data2>data1&&data2>data3) max=data2;
if (data3>data1&&data3>data1) max=data3;
return max;
int getMin(int data1,int data2,int data3)
int min;
if (data1<data2&&data1<data3) min=data1;
if (data2<data1&&data2<data3) min=data2;
if (data3<data1&&data3<data1) min=data3;
return min;
#include <iostream.h>
int main()
int data1,data2,data3,max,min;
cin>>data1>>data2>>data3;
max=getMax(data1,data2,data3);
min=getMin(data1,data2,data3);
cout<<max<<min;
return 0;
6编程题
void setMaxMin(int data1,int data2,int data3,int *pMax,int *pMin) if (data1>data2&&data1>data3) *pMax=data1;
if (data2>data1&&data2>data3) *pMax=data2;
if (data3>data1&&data3>data1) *pMax=data3;
if (data1<data2&&data1<data3) *pMin=data1;
if (data2<data1&&data2<data3) *pMin=data2;
if (data3<data1&&data3<data1) *pMin=data3;
#include <iostream.h>
int main()
int data1,data2,data3,max,min;
cin>>data1>>data2>>data3;
setMaxMin(data1,data2,data3,&max,&min);
cout<<max<<min;
return 0;
7编程题
void setMaxMin(int data1,int data2,int data3,int &aMax,int &aMin) if (data1>data2&&data1>data3) aMax=data1;
if (data2>data1&&data2>data3) aMax=data2;
if (data3>data1&&data3>data1) aMax=data3;
if (data1<data2&&data1<data3) aMin=data1;
if (data2<data1&&data2<data3) aMin=data2;
if (data3<data1&&data3<data1) aMin=data3;
#include <iostream.h>
int main()
int data1,data2,data3,max,min;
cin>>data1>>data2>>data3;
setMaxMin(data1,data2,data3,max,min);
cout<<max<<min;
return 0;
8编程题
(1)welcome模块
void welcome(void)
cout<<"*********************************************************" ;
cout<<"* 欢迎使用本程序*";
cout<<"* 本程序是将三个整数进行排序*";
cout<<"* 作者:李祎 *";
cout<<"*********************************************************" ;
(2)sort模块
void sort(int *pA,int *pB,int *pC)
int temp;
if (*pA>*pB){temp=*pA;*pA=*pB;*pB=temp;}
if (*pA>*pC){temp=*pA;*pA=*pC;*pC=temp;}
if (*pB>*pC){temp=*pB;*pB=*pC;*pC=temp;}
(3)main模块
#include <iostream.h>
int main()
int a,b,c;
welcome();
cin>>a>>b>>c;
sort(&a,&b,&c);
cout<<a<<b<<c;
return 0;
第五章答案
1简答题
(1)通过调用模块的返回值给本模块的的变量赋值;将本模块变量的地址传递过去,在调用模块中通过间接方式修改本模块的变量值;将本模块变量的
名传递过去,在调用模块中通过引用名修改本模块的变量值;
(2)模块设计指的是将所要实现的功能写成一个独立的单元,这个单元的名字叫模块或者叫函数;结构编程指的是模块内部编程时,只有一个入口和一
个出口的顺序、选择、循环三种结构代码,不能够在三种结构里随意地跳转。

(3)一般情况下,switch用于离散值的选择,根据输入的几个特定的值去选择分支走向,如菜单的制作;if/else用于较复杂的选择环境。

(4)对齐格式用setiosflags(ios::对齐格式)来控制,具体小数的位数用
setprecision(小数位数)控制,总长度用setw(总长度)控制,另外总长度需要每次输出时都明确。

(5)赋值是对一个已经定义的变量传值,而克隆是在定义变量的同时传值。

5编程题
#include <iostream.h>
void prtGrade(float score){
char grade;
if (score>=85) grade='a';
else if (score>=70) grade='b';
else if (score>=60) grade='c';
else grade='d';
cout<<"grade is:"<<grade<<endl;
6编程题
void prtByGrade(char grade){
switch(grade){
case 'a':cout<<"85-100\n";break;
case 'b':cout<<"70-84\n";break;
case 'c':cout<<"60-69\n";break;
case 'd':cout<<"<60\n";break;
default:cout<<"输入有错";break;
7编程题
char getGrade(float score){
char grade;
if (score>=85) grade='a';
else if (score>=70) grade='b';
else if (score>=60) grade='c';
else grade='d';
return grade;
8编程题
bool isLeapYear(int year){
bool flag;
if (year%4==0&&year%100!=0||year%400){
flag=true;
else{
flag=false;
return flag;
9编程题
第六章答案
1简答题
(1)循环初始值、循环条件、循环变量的改变
(2) while(1)
(3)找到第n项的项值
(4)执行一次,执行多次
(5)递推:从低项推出高项,递归:从高项调用低项
(6) break中断整个循环,continue中断本次循环
(7)一个是中断选择,一个是中断循环
(8)设置指针、关联文件、读写数据、关闭
(9)死循环使整个程序处于可控制交互状态,可用break或continue来非正常中断
(10)rand()/(b-a+1)+a;
ERROR1:int sumFromA2B (int m, int n);
ERROR2: if(a>b)
ERROR3: for(int i=m;i<=n;i++)
(1)bool isPrime(int x)
(2)bool isSXH(int x)
(3)int getSum(int a,int b) 及int getAverage(int a,int b)
(4)bool saveData(FILE *pF,float f)
(5)char* getCharAddress()
(6)void welcome(void)
(7)int getDigit(int a)
(8)void setABCounts(FILE *pF,int *pACounts,int *pBCounts)
(9)double getValue(double m1,double m2,double distance)
(10)int getSum(int a,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)
7编程题
#include <iostream.h>
int main(){
int s=0,a=4,i=1;
while(i<=20){
s=s+a;
a=a+3;
i=i+1;
cout<<s;
8编程题
int main(){
int i;
float s=0,nu=2,de=3,sign=1;
while(i<=100) {
s=s+sign*nu/de;
nu=nu+2;
de=de+4;
sign=-sign;
i++;
cout<<s;
9编程题
#include <iostream.h>
void displayFomatNum(){
int counts=0;
for (int i=1;i<=100;i++){
cout<<i<<" ";
counts++;
if (counts%3==0){
cout<<endl;
10编程题
void displayPrimeNum(int a,int b)
int counts=0;
for (int i=a;i<=b;i++)
if (isPrime(i))
cout<<i<<" ";
counts++;
if (counts%3==0)
cout<<endl;
11编程题
void display(int a,int b){
int counts=0;
for (int i=a;i<=b;i++)
if (i%3==0&&i%4==1)
cout<<i<<" ";
counts++;
if (counts%3==0)
cout<<endl;
12编程题
long int getProgSum(int n){
long int s=0,a=1;
for (int i=1;i<=n;i++)//循环n次s=s+a;
a=a*(i+1);
return s;
int getSumDivsion37(int n)
int s=0;
for (int i=1;i<n;i++)
if (i%21==0)
s=s+i;
return s;
15编程题
int main()
for (int i=1;i<=20;i++)
for (int j=1;j<=33;j++)
int k=100-i-j;
if (i*5+j*3+k/3==100)
cout<<i<<j<<k;
16编程题
#include <stdio.h>
#include <math.h>
float getPolMaxX(int m,int n)
float max=-9999.00;
int x,y,cx;
for (x=m;x<=n;x=x++)
y=x-sin(x);
if (y>max)
cx=x;
max=y;
printf("x is:%d,y is:%d\n",cx,max);
return cx;
17编程题
int getRevertInt(int num){
int end,newNum=0;
do
end=num%10;
newNum=newNum*10+end;
num=num/10;
}while(num!=0);
return newNum;
18编程题
#include <iostream.h>
int main(){
int s=0,x,y;
while(1){
//person part
do{
cout<<"请输入火柴数[1-5]:";
cin>>x;
if(x>5||x<1) cout<<"您输入的数字有误";
}while(x>5||x<1);
//computer part
y=6-x;
cout<<"计算机给出的选择:"<<y<<endl;
//current s
s=s+x+y;
//current cirmos
cout<<"两方已选总数:"<<s<<" 剩下数:"<<25-s<<endl;
//end
if(s==24){
cout<<"您输了,您只能输入1了:";
break;
第七章答案
1简答题
(1)数组名a,其实质是一个固定地址
(2) 0至n-1
(3)第1个元素(标号从0开始)
(4) a[i]或*(a+i)
(5)头地址和长度
(6) int *p[4];一维指针数组可表示二维数组
(7) int *p=new int[10];
p[0]=1;//操作第1个数据
(8) int **p=new int*[4];
for (int i=0;i<4;i++) p[i]=new int[10];
p[0][0]=1;//操作第1个数据
(9)因为二维数组的空间是连续的
(10)i*n+j
1 2
5编程题
float getMin(float *pArray,int n){
float min=pArray[0];
for (int i=1;i<n;i++){
if (pArray[i]<min){
min=pArray[i];
return min;
6编程题
void sort(float *pArray,int n){
float t;
for (int i=0;i<=n-2;i++){
int maxNo=i;
for(int j=i+1;j<=n-1;j++){
if (pArray[maxNo]<pArray[j]){
maxNo=j;
if (i!=maxNo) {
t=pArray[i];pArray[i]=pArray[maxNo];pArray[maxNo]=t; 7编程题
void arrayCpy(int *pDes,int *pSrc,int n){
for (int i=0;i<=n-1;i++){
pDes[i]=pSrc[i];
int main(){
int a[3]={3,4,5},b[3];
arrayCpy(b,a,3);
8编程题
void arrayRevert(int *pArray,int n){
int t;
for (int i=0;i<=(n-1)/2;i++){
t=pArray[i];
pArray[i]=pArray[n-1-i];
pArray[n-1-i]=t;
9编程题
void delScore(float *pScore,int n,int no){
for(int i=no;i<=NUM-1;i++){
pScore[i-1]=pScore[i];
10编程题
void delScore(float *pScore,int n,int no,int *pNum){ for(int i=no;i<=*pNum-1;i++){
pScore[i-1]=pScore[i];
(*pNum)--;
11编程题
void getFabN(int *pFab,int n){
pFab[0]=pFab[1]=1;
for (int i=2;i<n;i++){
pFab[i]=pFab[i-1]+pFab[i-2];
12编程题
void arrayCopyRevert(int *pDes,int *pSrc,int n){
for (int i=0;i<=n-1;i++){
pDes[i]=pSrc[n-1-i];
int getDays(int year,int month,int day){
int days[13]={0,31,28,31,30,31,30,31,30,31,30,31,30};
int sum=0;
for (int i=0;i<month;i++){
sum+=days[i];
if (year%4==0&&year%100!=0||year%400==0){
sum+=1;
sum+=day;
return sum;
15编程题
void insertSequenceArray (int *pA,int n,int *pNum,int data){ for (int i=0;i<*pNum;i++){
if (data<=pA[i]){
break;
for (int j=*pNum;j>=i;j++){
pA[j+1]=pA[j];
pA[i]=data;
(*pNum)++;
16编程题
一个是作普通指针传递,一个作数组指针传递,两者使用时注意寻址方式不同17编程题
第八章答案
1简答题
(1)头地址
(2) a[i] 或者*(a+i)
(3)char name[]=”wangwu”是初始化给字符串,字符串名name;
char name[10];name=”wangwu”;是错误的,name是固定地址,不能赋值
(4) p是随机地址,不能在其中赋值或交互输入
(5) 0
(6)什么都不显示,因为字符串的第一个字符是0,表示字符串结束之意(7)整数3的码值是3,字符‘3’的码值是51
(8)因为标准字符串的末尾固定是0,以此可以确定字符串的长度
(9) char str[10]="china";cout<<str;//输出字符串cout<<str+2;//从第2个字符输出字符串
(10) char *p[10]={"c/c++","basic","data structure"};
cout<<p[0]<<endl;//显示第一本书
cout<<p[2]<<endl;//显示第三本书
cout<<p[2]+2<<endl;//显示第三本书自第三个字符开始的所有字符
cout<<p[2][2]<<endl;//显示第三本书的第三个字符
(11)name是固定地址,不能赋值,而pName是指针变量,可以赋值
(12)liming☆乱码
(13)因为至少包括了0这个结束标记
2选择题
1 2 3 4 5 6 7 8 9 10
C C A B
D B A C AB BD
3判断题
1 2 3 4 5 6 7 8 9 10 11
√√√√×√√√√√√
4画图题
模块图形式及归属
形式:void strRevert(char *pStr)
归属:String
形式:void strAdd(char *pDes,char
*pSrc)
归属:String
形式:void subStrCopy(char
*pDes,char *pSrc)
归属:String
形式:int getWordNums(char *pStr)
归属:String
形式:int getDiffWords(char
**pp,char *pStr)
归属:String
(1)/*$ERROR1$*/ i=0; /*$ERROR2$*/ s[i]!='\0'; /*$ERROR3$*/ j++; (2)/*$ERROR1$*/ <iostream.h> /*$ERROR2$*/ #include "string.h"
/*$ERROR3$*/ int main( ); /*$ERROR4$*/ i=0;
/*$ERROR5$*/ while(i<k) /*$ERROR6$*/ if(m>n)
(3)/*$ERROR1$*/ pa[i]!=0||pb[i]!=0 /*$ERROR2$*/ i++;
6读程序
(1)英翻汉或者汉翻英
(2) strcspn (str1,str2)的作用是在str1中找出出现str2中字符的位置,本例子位置4
7编程题
void strEncrypt(char *pDes,char *pSrc)
int i=0;
while (pSrc[i]!=0)
pDes[i]=pSrc[i]+4;
pDes[i]=0;
8编程题
int main(){
char *p[10];
for (int i=0;i<10;i++){
p[i]=new char[21];//书名长度定为20
cin>>p[i];
cout<<p[i];
void displayChrNums(char *pStr)
int i=0,lowerNums=0,upperNums=0,otherNums=0;
while (pStr[i]!=0)
if (pStr[i]>='a'&&pStr[i]<='z')
lowerNums++;
else if (pStr[i]>='A'&&pStr[i]<='Z')
upperNums++;
else
otherNums++;
cout<<"小写字母个数:"<<lowerNums<<endl;
cout<<"大写字母个数:"<<upperNums<<endl;
cout<<"其他字母个数:"<<otherNums<<endl;
13编程题
#include <assert.h>
#include <string.h>
void strLeft(char *pSub,char *pSrc,int n) assert(n<=strlen(pSrc));
int i=0;
while (i<n)
pSub[i]=pSrc[i];
i++;
pSub[i]=0;
14编程题
#include <assert.h>
#include <string.h>
void strRight(char *pSub,char *pSrc,int n) assert(n<=strlen(pSrc));
int i=0;
while (i<n)
pSub[i]=pSrc[strlen(pSrc)-1-i];
i++;
pSub[i]=0;
15编程题
char * getSubStr(char *pStr,int m,int n) int len=m-m+1+1;
int *p=new char[len];
int j=0;
for (int i=m-1;i<=n-1;i++)
p[j]=pStr[i];
j++;
p[j]=0;
return p;
16编程题
void delChFromStr(char *pDes,char *pSrc,char ch) int i=0,j=0;
while (pSrc[i]!=0)
if (pSrc[i]==ch)
continue;
pDes[j]=pSrc[i];
j++;
i++;
pDes[j]=0;
17编程题
void revertStr(char *pDes,char *pSrc){
int i=strlen(pSrc)-1,j=0;
while (i!=0)
pDes[j]=pSrc[i];
j++;
i--;
pDes[j]=pSrc[i];
pDes[j+1]=0;
if (pA[i]==c1)
{
int len=strlen(pA);
for (int j=len-1;j>=i;j--)
{
pA[j+1]=pA[j];
}
pA[i]=c2;
pA[len+1]=0;
i++;
}
i++;
}
}
char c1='a',c2='z';
addChar(a,c1,c2);
cout<<a;
return 0;
}
模块设计思路:遍历数组,找到待删除字符后,将此后字符前移一位。

效率较低的原因是:每找到一个待删除字符,都要做一个循环。

调整思路:一次循环可将每个非删除的字符的位置记入数组,再用一次循环拷贝标记字符
20编程题(程序阅读)
21编程题(程序阅读)
22编程题(程序阅读)
extraceWordsNo模块main模块
//a是存放单词标号的数组,n是数组长度,*pNums是实际长度
void extraceWordsNo(char *pSrc,int a[],int n,int *pNums) {
int i=0,j=0,k=0;//a数组里记入单词头尾位置
bool
spaceFlag=true,charFlag=false;
*pNums=0;
for(;pSrc[i]!=0;i++)
{
//记单词前、后位,两种情况,记单词头部和尾部
//尾部:当前是空格,肯定要跳,跳之前判断前位是否是字符,记位置i-1
if (pSrc[i]==' ')
{
spaceFlag=true;
if (charFlag)
{
a[(*pNums)++]=i-1;
charFlag=false;
}
continue;
} #include <iostream.h>
int main()
{
char src[40]="i love you",b[40];
int a[100],nums;
extraceWordsNo(src,a,100,&nums);
for (int i=0;i<nums;i++)
{
cout<<a[i]<<" ";
}
}
运行结果:
26编程题(程序阅读) 27编程题(程序阅读)
第九章答案
1简答题
(3)表示第i个同学两种方法:scoreAll[i] 或 *(scoreAll+i)
表示第i个同学的学号有三种方法:scoreAll[i].fNo;(*(scoreAll+i)).fNo;(scoreAll+i)->fNo;
(4)两个结构体变量可直接赋值。

克隆发生在初始化变量的时候(如传递参数(5)结构体类型定义时,某字段是指针变量
(6)三个方面优化:函数重载、函数模板、参数默认值
(7)只需要传递一个地址(4B),而无需传递整个结构体的数据,效率高(8)自右向左设置默认值
(9)静态函数的作用域只限于定义文件,可有防止多人合作时的函数重名现象(10)插入、删除等动作中效率高
原始值:2 aaa 2 调用后:2 bbb 2
5改错题
ERROR1:void searchScore(Score *pScoreAll, int n)
ERROR2: char *name=new char[20];
ERROR3: if (strcmp(name,pMove->fName)==0)
ERROR4: void searchNoPassScore(Score *pScoreAll, int n)
ERROR5: pScoreEnd=pScoreAll+n-1;
6编程题
float getScoreSum(Score *pS)
return pS->fScoreC+pS->fScoreE+pS->fScoreP;
void scoreCopy(Score *pDes,Score *pSrc,int n) for (int i=0;i<n;i++)
pDes[i]=pSrc[i];
void sortScore(Score *pScoreAll,int n,int num) for (int i=0;i<=num-2;i++)
for (int j=i+1;j<=num-1;j++)
if (pScoreAll[i].fScore>pScoreAll[j].fScore)
Score t;
t=pScoreAll[i];
pScoreAll[i] =pScoreAll[j];
pScoreAll[j] =t;
11编程题
void searchByName(Score *pScoreAll, int n,char *pName) Score *pScoreBeg,*pScoreEnd,*pMove;
bool flag=false;
pScoreBeg=pScoreAll;pScoreEnd=pScoreAll+n-1;
for(pMove=pScoreBeg;pMove<=pScoreEnd;pMove++)
if (strcmp(pName,pMove->fName)==0)
flag=true;
break;
if (flag==true)
cout<<pMove->fName<<"|"<<pMove->fScore;
else{
cout<< "没有找到此人";
return flag;
void sortScore(Score *pScoreAll,int n,int num)//根据姓名排序for (int i=0;i<=num-2;i++)
for (int j=i+1;j<=num-1;j++)
if (strcmp(pScoreAll[i].fName,pScoreAll[j].fName)>0)
Score t;
t=pScoreAll[i];
pScoreAll[i] =pScoreAll[j];
pScoreAll[j] =t;
int getBestNo(Score *pScoreAll,int n,int num)//求成绩最好学生的学号int no=0;
float best=pScoreAll[0].fScore;
for (int i=1;i<num;i++)
if (pScoreAll[i].fScore>best)
best=pScoreAll[i].fScore;
no=i;
return no;
14编程题
结构定义和主模块,及程序运行结果两个自定义模块
#include <iostream.h>
struct Score{
int fNo;
char fName[10];
float fScore;
};
struct Node
{
Score s;
Node *link;
};
int main(){
Node *first=NULL;//链表的头
int n=0;//当前真实结点个数
//可能改变first,需将first的地址传过来
Score s1={1,"liyi",90};
insert(&first,-1,&s1,&n);
Score s2={2,"liming",93};
insert(&first,0,&s2,&n);
Score s3={3,"lizhi",99};
insert(&first,1,&s3,&n);
display(first);
}
程序运行结果:bool insert(Node **pFirst,int
i,Score *pS,int *pN){
if (i<-1 || i>*pN-1){
cout<< "Out Of Bounds"; return false;
}
//产生一个新结点t用来插入
Node *t=new Node; t->s=*pS;
//定位重要,即找到第i个元素的
位置p
Node *p=*pFirst;
for (int j=0; j<i; j++)
p=p->link;
//i>-1插在表里,i=-1是插在表头
if(i>-1){
t->link=p->link; //新结点t
插在p后
p->link=t;
}
else{
t->link=*pFirst; //新结点t
成为新头
*pFirst=t;
}
(*pN)++;
return true;
}
void display(Node *first){
Node *p=first;
while(p) {//与while(p!=NULL)等

cout<<(p->s).fNo<<" ";
cout<<(p->s).fName<<" ";
cout<<(p->s).fScore<<endl;
p=p->link;
}
}
(1)文件结构
按模块化程序设计思想:应该将BOOK写在文件Book里,将print写在BookManager文件里,而将主模块写在BookMain文件里。

(2)模块结构
应该将排序部分单独写成一个模块。

(3)预处理(文件包含和宏定义)
#include "iostream.h"应该写成#include <iostream.h>
#define n 6应该写成#define N 6
(4)命名规则
BOOK结构体命名应为Book
(5)代码行的书写规范
if (!count)应该写成if (count!=0)
for语句后应该加{}
(6)程序效率
效率低,因为结构体数组元素的整体交换浪费时间,可以设计书的地址的数组,然后地址数组交换。

1简答题
(1)文件种类包括:键盘、显示器、磁盘文件、内存
(2)两种方式:文件指针和流对象。

思路是:定义文件指针或流对象;与具体文件关联;通过相应函数或方法来操作数据;关闭文件指针或流对象。

(3) FILE *p;
(4)键盘和显示器
(5)通过函数或方法的返回值来判断是否文件结束。

如fgetc,fscanf,fread等函数能读出具体数据个数,或feof返回值为真---文件指针方案
如read等方法能读出具体数据个数,或eof方法返回值为真---流对象方案(6)文本文件是无格式文件,而二进制文件是格式文件。

读写两种文件,使用的函数不同。

文件指针方案中:读写文本文件用fscanf/fprintf,读写
a b
5编程题
#include <stdio.h>
void writeChar2File(){
FILE *p;
p=fopen("a.txt","w");
for (int i=1;i<=5;i++) {
char ch;
ch=getchar();
fputc(ch,p);
fflush(stdin);
fclose(p);
6编程题
#include <stdio.h>
void writeInt2File(){
FILE *p;
p=fopen("a.txt","w");
for (int i=1;i<=5;i++) {
int a;
scanf("%d",&a);
fprintf(p,"%d ",a);
fclose(p);
7编程题
void readScore(int *pScore,int n) FILE *p;
p=fopen("score.txt","r");
int i=0;
while (fscanf(p,"%d",pScore[i])==1) i++;。

相关文档
最新文档