c程序设计 第13章 文件 答案解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三章例13.1 程序为:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
ch=getchar();
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);putchar(ch);
ch=getchar();
}
putchar(10);
fclose(fp);
}
例13.2 程序为:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *in, *out;
char ch,infile[10],outfile[10];
printf("Enter the infile name:\n");
scanf("%s",infile);
printf("Enter the infile name:\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
if((out=fopen(outfile,"w"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
while(!feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
注:在该程序的运行中,每复制一次就会产生一个乱码置于最后,并依次叠加。
这不是个优秀的程序。
13.5.1 rewind函数:
#include <stdio.h>
void main()
{
FILE *fp1,*fp2;
fp1=fopen("file1.c","r");
fp2=fopen("file2.c","w");
while(!feof(fp1)) putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1)) putc(getc(fp1),fp2);
fclose(fp1);fclose(fp2);
}
例13.5
#include<stdlib.h>
#include<stdio.h>
struct student_type
{
char name[10];
int num;
int age;
char sex;
}stud[10];
void main()
{
int i;
FILE *fp;
if((fp=fopen("file22.c","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<10;i+=2)
{
fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%s %d %d %c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);
}
fclose(fp);
}
注:这个程序是对的,但常用于处理二进制文件,因为文本文件要发生字符转换,计算位置时常发生混乱。
习题
13.1 对c文件操作有些什么特点?什么是缓冲文件系统?什么是非缓冲文件系统?这两者的缓冲区有什么区别?
答:c语言把文件看作是一个字符的序列级,即由一个一个字符的数据顺序组成。
根据数据的组织形式,可以分为:ASCII文件(文本文件)和二进制文件。
一个c文件是一个字节流或二进制流(流式文件)。
它允许对文件存取一个字符,这就增加了处理的灵活性。
缓冲文件系统:是指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区中去。
非缓冲文件系统:是指系统不自动开辟确定大小的缓冲区,而有程序为每个文件设定缓冲区。
用缓冲文件系统进行的输入输出又称高级磁盘输入输出,用非缓冲文件系统进行的输入输出又称为低级输出输入系统。
ANSI C标准不采用非缓冲文件系统,而只采用缓冲文件系统,即既用缓冲文件系统处理文本文件,也用它处理二进制文件,也就是将缓冲文件系统扩充为可以处理二进制文件。
13.2 什么是文件型指针?通过文件型指针访问文件有什么好处?
答:缓冲文件系统中,关键的概念是“文件指针”。
每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字,文件的状态及文件当前位置等)。
这些信息是保存在一个结构体变量中的。
该结构体类型是由系统定义的,取名为FILE。
这和一般使用指针变量的好处是一样的。
13.3 对文件的打开和关闭的含义是什么?为什么要打开和关闭文件?
答:打开的含义:带回指向a1文件的指针赋给fp,这样fp就和文件a1联系上了。
或者说,fp指向a1文件。
在使用完一个文件后应该关闭它,以防止它再被误用。
“关闭”就是文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。
13.4 程序为:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
char ch,filename[10];
printf("please input the name of the file:\n");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
printf("please a string:\n");
ch=getchar();
if('a'<=ch&&ch<='z')
ch=ch-32;
while(ch!='!')
{
fputc(ch,fp);putchar(ch);
ch=getchar();
if('a'<=ch&&ch<='z')
ch=ch-32;
}
putchar(10);
fclose(fp);
}
13.5 程序为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
FILE *fp;
char a[100];
if((fp=fopen("test.c","r"))==NULL)
{
printf("文件打开错误");
exit(0);
}
int i=0;
a[i]=fgetc(fp);
while(a[i]!=EOF)
{
putchar(a[i]);
i++;
a[i]=fgetc(fp);
}
putchar('\n');
fclose(fp);
if((fp=fopen("test1.c","r"))==NULL)
{
printf("文件打开错误");
exit(0);
}
while(a[i]!=EOF)
{
putchar(a[i]);
i++;
a[i]=fgetc(fp);
}
a[i]='\0';
putchar('\n');
fclose(fp);
int n=i;
int k;
char t;
for(i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(a[k]>a[j]) k=j;
}
if(k!=i)
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
if((fp=fopen("test2.c","w"))==NULL) {
printf("文件打开错误");
exit(0);
}
i=0;
while(i<n)
{
fputc(a[i],fp);
putchar(a[i]);
i++;
}
fclose(fp);
putchar('\n');
}
注:这个程序将处理数组的排序问题和文件读取的问题结合起来了。
从而解决了这个题目。
13.6 程序为:(这个程序不难,自己编的,对其中文件类型和它和结构体数组之间信息的转换有了较深的认识)
#include<stdio.h>
#define SIZE 5
struct student_type
{
int num;
char name[10];
float score1;
float score2;
float score3;
float avg;
}stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_list.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(student_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void main()
{
FILE *fp;
int i;
for(i=0;i<SIZE;i++)
{
scanf("%d%s%f%f%f",&stud[i].num,stud[i].name,&stud[i].score1,&stud[i].score2,&stud[i].s core3);
stud[i].avg=(stud[i].score1+stud[i].score2+stud[i].score3)/3;
}
save();
fp=fopen("stu_list.c","rb");
for(i=0;i<SIZE;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
printf("%-4d %-10s %-10.2f %-10.2f %-10.2f %-10.2f\n",stud[i].num,stud[i].name,stud[i].sc ore1,stud[i].score2,stud[i].score3,stud[i].avg);
}
}
13.7 程序为:
#include<stdio.h>
#define SIZE 5
struct student_type
{
int num;
char name[10];
float score1;
float score2;
float score3;
float avg;
}stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_sort.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(student_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void main()
{
FILE *fp;
int i,j;
struct student_type temp;
fp=fopen("stu_list.c","rb");
for(i=0;i<SIZE;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
}
for(i=0;i<SIZE-1;i++)
for(j=i+1;j<SIZE;j++)
{
if(stud[i].avg>stud[j].avg)
{
temp=stud[i];
stud[i]=stud[j];
stud[j]=temp;
}
}
save();
fp=fopen("stu_sort.c","rb");
for(i=0;i<SIZE;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
printf("%-4d %-10s %-10.2f %-10.2f %-10.2f %-10.2f\n",stud[i].num,stud[i].name,stud[i].sc ore1,stud[i].score2,stud[i].score3,stud[i].avg);
}
}
13.9程序为:(这个题的程序要建立在前面那些程序的基础之上)
#include<stdio.h>
#define SIZE 5
struct student_type
{
int num;
char name[10];
float score1;
float score2;
float score3;
float avg;
}stud[SIZE+1];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_sort.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE+1;i++)
if(fwrite(&stud[i],sizeof(student_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void main()
{
FILE *fp;
int i,j;
struct student_type temp,another;
scanf("%d%s%f%f%f",&another.num,,&another.score1,&another.score2,&another.s core3);
another.avg=(another.score1+another.score2+another.score3)/3;
fp=fopen("stu_list.c","ab");
fwrite(&another,sizeof(student_type),1,fp);
fclose(fp);
fp=fopen("stu_list.c","rb");
for(i=0;i<SIZE+1;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
}
for(i=0;i<SIZE;i++)
for(j=i+1;j<SIZE+1;j++)
{
if(stud[i].avg>stud[j].avg)
{
temp=stud[i];
stud[i]=stud[j];
stud[j]=temp;
}
}
fclose(fp);
save();
fp=fopen("stu_sort.c","rb");
for(i=0;i<SIZE+1;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
printf("%-4d %-10s %-10.2f %-10.2f %-10.2f %-10.2f\n",stud[i].num,stud[i].name,stud[i].sc
ore1,stud[i].score2,stud[i].score3,stud[i].avg);
}
fclose(fp);
}
13.8 程序为:(由上题易得该程序,这里建立的新文件的名字为:students.c)
#include<stdio.h>
#define SIZE 5
struct student_type
{
int num;
char name[10];
float score1;
float score2;
float score3;
float avg;
}stud[SIZE+1];
void save()
{
FILE *fp;
int i;
if((fp=fopen("students.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE+1;i++)
if(fwrite(&stud[i],sizeof(student_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void main()
{
FILE *fp;
int i,j;
struct student_type temp,another;
scanf("%d%s%f%f%f",&another.num,,&another.score1,&another.score2,&another.s core3);
another.avg=(another.score1+another.score2+another.score3)/3;
fp=fopen("stu_list.c","ab");
fwrite(&another,sizeof(student_type),1,fp);
fclose(fp);
fp=fopen("stu_list.c","rb");
for(i=0;i<SIZE+1;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
}
for(i=0;i<SIZE;i++)
for(j=i+1;j<SIZE+1;j++)
{
if(stud[i].avg>stud[j].avg)
{
temp=stud[i];
stud[i]=stud[j];
stud[j]=temp;
}
}
fclose(fp);
save();
fp=fopen("students.c","rb");
for(i=0;i<SIZE+1;i++)
{
fread(&stud[i],sizeof(student_type),1,fp);
printf("%-4d %-10s %-10.2f %-10.2f %-10.2f %-10.2f\n",stud[i].num,stud[i].name,stud[i].sc ore1,stud[i].score2,stud[i].score3,stud[i].avg);
}
fclose(fp);
}
13.10 程序为:
#include<stdio.h>
#define SIZE 1
struct employee_type
{ char name[10];
int num;
int age;
char sex[5];
char health[10];
int salary;
char adress[10];
char edu[10];
}emp[SIZE];
struct wage_type
{
char name[10];
int salary;
}emp1[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("employee_list.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&emp[i],sizeof(employee_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void save1()
{
FILE *fp;
int i;
if((fp=fopen("employee_list1.c","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&emp1[i],sizeof(wage_type),1,fp)!=1)
printf("file write error");
fclose(fp);
}
void main()
{
FILE *fp;
int i;
for(i=0;i<SIZE;i++)
{
scanf("%s%d%d%d%s%s%s%s",emp[i].name,&emp[i].num,&emp[i].age,&emp[i].salary,em p[i].adress,emp[i].edu,emp[i].health,emp[i].sex);
printf("%s %d %d %d %s %s %s %s\n",emp[i].name,emp[i].num,emp[i].age,emp[i].salary,e mp[i].adress,emp[i].edu,emp[i].health,emp[i].sex);
}
save();
fp=fopen("employee_list.c","rb");
for(i=0;i<SIZE;i++)
{
fread(&emp[i],sizeof(employee_type),1,fp);
for(int j=0;j<10;j++)
emp1[i].name[j]=emp[i].name[j];
emp1[i].salary=emp[i].salary;
}
save1();
for(i=0;i<SIZE;i++)
{
fread(&emp1[i],sizeof(wage_type),1,fp);
printf("%s %d\n",emp1[i].name,emp1[i].salary);
}
}
注意:这个程序的编写不难,主要是在于用scanf函数读入数据时的一些细节问题。
13.11 这个程序在上题的基础上比较简单,只需在从文件把数据到数组时,删掉一个即可(略)。
13.12 程序为:
#include<stdio.h>
void main()
{
int i,flag;
char str[80],c;
FILE *fp;
fp=fopen("text","w");
flag=1;
while(flag==1)
{
printf("Input string:\n");
gets(str);
fprintf(fp,"%s",str);
printf("Continue?");
c=getchar();
if((c=='N')||(c=='n'))
flag=0;
getchar();
}
fclose(fp);
fp=fopen("text","r");
while(fscanf(fp,"%s",str)!=EOF)
{
for(i=0;str[i]!='\0';i++)
if((str[i]>='a')&& (str[i]<='z'))
str[i]-=32;
printf("\n%s\n",str);
}
fclose(fp);
}
注:这个程序很简单,不用费多大功夫,只需关注这个程序的风格就行了。
一个笔试中常见的程序:
#include<iostream>//是指标准库中输入输出流的头文件, cout就定义在这个头文件里
using namespace std;
int main()
{
int count=1;
label: //标记label标签
cout<<count++<<" ";
if(count<=100)
goto label;//如果count的值不大于100则转到1abel标签处开始执行程序cout<<endl;
return 0;
}
注意:整个程序中没有for,while,do...wihle语句,但却实现了循环。
用C++编写程序,完成从键盘录入学生成绩的同时,计算班级平均成绩和及格学生平均成绩。
程序为:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
float score[10];
float sum1=0;
float sum2=0;
float avg1,avg2,count1=0;
for(int i = 0;i < 10;i++)
{
cout<<"请输入学生成绩:"<<endl;
cin>>score[i];
sum1+=score[i];
if (score[i]<60 ) //若score[i]不及格则退出本次循环
continue;
sum2+=score[i];
count1+=1;
}
avg1 = sum1/10;
avg2 = sum2/count1;
cout<<"班级学生平均成绩为:"<<avg1<<endl;
cout<<"及格学生平均成绩为:"<<avg2<<endl;
return 0;
}
自己编的一个程序:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
int i,renshu,n=0,m=0;
float sum1=0,sum2=0,score,aver1,aver2;
cout<<"请输入学生人数:";
cin>>renshu;
cout<<"请依次输入学生成绩:"<<endl;
for(i=0;i<renshu;i++)
{
cin>>score;
if(score>=60)
{
sum1+=score;
n++;
}
sum2+=score;
m++;
}
aver1=sum1/n;
aver2=sum2/m;
cout<<"及格学生的人数和平均成绩:"<<n<<","<<aver1<<endl<<"全体学生的人数和平均成绩:"<<m<<","<<aver2<<endl;
return 0;
}
功能和上面那个程序是一样的!
基于C++的简单计算器程序:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
double displayed_value; //设置显示当前值变量
double new_entry; //定义参与运算的另一个变量
char command_character; //设置命令字符变量,用来代表+、-、*、/运算
displayed_value = 0; //设置当前值为0
cout << "简单计算器程序" << endl<< "----" << endl;
cout << "在'>' 提示后输入一个命令字符"<< endl; //输出提示信息
cout << "Value : " << displayed_value << endl; //输出当前值
cout << "command>";
cin >> command_character; //输入命令类型如+、-、*、/、C、Q
while (command_character != 'Q')
{ //当接收Q命令时终止程序运行
switch(command_character)
{ //判断switch语句的处理命令
case 'C':
displayed_value = 0; //当输入命令为“C”时,表示清除命令设置当前值为0
break; //转向switch语句的下一条语句
case '+':
cout << "number>"; //当输入命令为“+”时,执行如下语句
cin >> new_entry; //输入一起运算的第二个数
displayed_value += new_entry; //进行加法运算
break; //转向switch语句的下一条语句
case '-': //当输入命令为“-”时,执行如下语句
cout << "number>"; //输入一起运算的第二个数
cin >> new_entry;
displayed_value -= new_entry; //进行减法运算
break; //转向switch语句的下一条语句
case '*': //当输入命令为“*”时,执行如下语句
cout << "number>";
cin >> new_entry; //输入一起运算的第二个数
displayed_value *= new_entry; //进行乘法运算
break; //转向switch语句的下一条语句
case '/': //当输入命令为“/”时,执行如下语句
cout << "number>";
cin >> new_entry; //输入一起运算的第二个数
displayed_value /= new_entry; //进行除法运算
break; //转向switch语句的下一条语句
cout << "无效输入,请重新输入命令类型!"<<endl; //当输入命令为其他字符时,执行如下语句
cin.ignore(100,'\n'); //在计数值达到100之前忽略提取的字符
} //结束switch语句
cout << "Value : " << displayed_value << endl;
cout << "command>";
cin >> command_character; //输入命令类型如+、-、*、/、C、Q
} //结束while循环语句
return 0;
}
算法举例2——求和:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
int num,sum=0;
cout<<"请输入整数,(直到输入0时结束)"<<endl;
cin>>num;
while(num!=0)
{
sum+=num;
cin>>num;
}
cout<<"\n这些整数的总和为:"<<sum<<endl;
return 0;
}
算法举例1——求和:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
int x,y,z,temp;
cout<<"请输入三个整数:"<<endl;
cin>>x>>y>>z;
if(x<y)
{
temp=y;
y=x;
x=temp;
}
{
temp=z;
z=x;
x=temp;
}
if(y<z)
{
temp=z;
z=y;
y=temp;
}
cout<<"把这三个数按从大到小排序后为:"<<x<<" "<<y<<" "<<z<<endl;
return 0;
}
输出矩阵对角线上的元素和,程序为:
#include <iostream> //是指标准库中输入输出流的头文件, cout就定义在这个头文件里using namespace std;
int main()
{
int a[4][4],i,j,input_a=1,sum_diag1=0,sum_diag2=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=input_a++;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(i==j)
sum_diag1+=a[i][j];
if(i+j==3)
sum_diag2+=a[i][j];
}
cout<<"主对角线上的元素和为:"<<sum_diag1<<endl;
cout<<"次对角线上的元素和为:"<<sum_diag2<<endl;
return 0;
}
矩阵为:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
MATLAB程序:用来清除插值分析中龙格现象的方法(chebyshev方法)程序为:
N=4;
>> k=[0:N];
>> x=cos((2*N+1-2*k)*pi/(2*(N+1)));
>> y=1./(1+8*x.^2);
>> c=newtonp(x,y);
>> xx=[-1:0.02:1];
>> yy=1./(1+8*xx.^2);
>> yy1=polyval(c,xx);
>> plot(xx,yy,'k-',x,y,'o')
>> plot(xx,yy,'k-',x,y,'o')
>> hold on
>> plot(xx,yy1,'b','Linewidth',1.5)
>> %计算4阶插值分析
>> N=8;
>> k=[0:N];
>> x=cos((2*N+1-2*k)*pi/(2*(N+1)));
>> y=1./(1+8*x.^2);
>> c1=newtonp(x,y);
>> yy2=polyval(c1,xx);
>> plot(x,y,'*')
>> plot(x,y,'r*')
>> plot(xx,yy2,'m','Linewidth',1.5)
>> %计算8阶插值分析
>> N=10;
>> k=[0:N];
>> x=cos((2*N+1-2*k)*pi/(2*(N+1)));
>> y=1./(1+8*x.^2);
>> c2=newtonp(x,y);
>> yy3=polyval(c2,xx);
>> hold on
>> plot(x,y,'d')
>> plot(x,y,'gd')
>> hold on
>> plot(xx,yy3,'g','Linewidth',1.5)
>> plot(xx,yy3,'r','Linewidth',1.5)
>> plot(xx,yy3,'g','Linewidth',1.5)
>> grid on
>> title('Chebyshev Interpolation')
>> figure
>> plot(xx,yy1-yy,'b','Linewidth',1.5),hold on
>> plot(xx,yy2-yy,'m','Linewidth',1.5),hold on
>> plot(xx,yy3-yy,'g','Linewidth',1.5),hold on
>> grid on
>> title('The error of Chebyshev Interpolation')
>> legend('4阶','8阶','10阶')
>> %根据上面的实例结果可以看出,当前用户使用Chebyshev方法来选择基础数据点时,可以十分有效的清除Runge现象,提高插值效率
函数main()参数的使用
程序为:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int i=0; //声明变量
cout<<"main参数:"<<endl;
cout<<"argc="<<argc<<endl; //输出参数的个数
for(i=0;i<argc;i++) //遍历每个参数
cout<<"argv["<<i<<"]="<<argv[i]<<endl;//输出各个参数的内容
return 0;
}
内联函数的使用的例子
程序为:
#include <iostream>
using namespace std;
inline int max(int ,int); //声明内联函数
int main(int argc, char* argv[])
{
int a[10],i; //声明数组和变量
cout<<"输入10个数据:"<<endl;
for(i=0;i<10;i++) //循环10次
{
cin>>a[i];
} //为元素输入数据
int temp=a[0]; //temp保存第一个元素的值
for( i=0;i<10;i++) //循环10次
{
temp=max(temp,a[i]);
} //调用max函数
cout<<"10个数据中的最大数为:"<<temp<<endl;
return 0;
}
inline int max(int x,int y) //即使没有inline,仍然视为内联函数{
return x>=y?x:y; //返回大数
}
C++程序(计算两个整数的最大公约数和最小公倍数)
#include "stdafx.h"
#include <iostream.h>
int main(int argc, char* argv[])
{
int gy(int n1,int n2);
int gb(int n1,int n2);
int n1,n2,m1,m2;
cout<<"请依次输入两个整数:n1,n2"<<endl;
cin>>n1>>n2;
m1=gy(n1,n2);
m2=gb(n1,n2);
cout<<"这两个数的最大公约数是:"<<m1<<endl
<<"这两个数的最小公倍数是:"<<m2<<endl;
return 0;
}
int gy(int n1,int n2)
{
int i,z=1;
for(i=2;i<=n1 && i<=n2;i++)
if(n1%i==0 && n2%i==0 && i>z)
z=i;
return z;
}
int gb(int n1,int n2)
{
int z;
z=(n1*n2)/gy(n1,n2);
return z;
}
包含数学思想的程序:
#include "stdafx.h"
#include <iostream.h>
int leasemul;//定义全局变量
void mul(int m,int n)
{
int temp;//定义局部变量
if(m<n)
{
mul(n,m);//函数的嵌套调用
}
else
{
while(n!=0)//不为0则循环
{
temp=m%n;//取余数
m=n;
n=temp;
}
leasemul=m;//设置全局变量的值
}
}
int divisor(int m,int n)
{
int temp=m*n;//m与n的积
temp=temp/leasemul;//引用全局变量
return temp;//返回全局变量的值
}
int main(int argc, char* argv[])
{
int m,n;//定义局部变量
cout<<"输入两个数据:";
cin>>m>>n;//输入两个数据
mul(m,n);//调用函数
cout<<m<<"与"<<n<<"最大公约数是:";
cout<<leasemul<<endl;//使用全局变量
int j=divisor(m,n);//调用函数求最小公倍数
cout<<m<<"与"<<n<<"最小公倍数数是:"<<j<<endl; return 0;
}
C++primer:
1.21 第一次用类写的程序:
#include "stdafx.h"
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book[5];
for(int i=0;i<5;i++)
std::cin>>book[i];
for(i=0;i<5;i++)
std::cout<<book[i]<<std::endl;
return 0;
}
3.2节中的例子:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string s("Hello world!!!");
string::size_type punct_cnt=0;
//count number of punctuation characters in s
for(string::size_type index=0;index!=s.size();++index) if(ispunct(s[index]))
++punct_cnt;
cout<<punct_cnt
<<" punctuation characters in "<<s<<endl;
//convert s to lowercase
for(index=0;index!=s.size();++index)
s[index]=toupper(s[index]);
cout<<s<<endl;
return 0;
}
3.13 的程序为:
#include <iostream>
//#include <string>
#include <vector>
//#include <cctype>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout<<"Please enter some integrated numbers(end to Ctrl+Z):"<<endl;
while(cin>>ival)
{
ivec.push_back(ival);
}
if(ivec.size()==0)
{
cout<<"No element?!"<<endl;
return -1;
}
cout<<"Sum of each pair of counterpart elements in the vector is:"<<endl;
for(vector<int>::size_type cnt1=0,cnt2=ivec.size()-1;cnt1<ivec.size()/2;cnt1++,cnt2--)
{
cout<<ivec[cnt1]+ivec[cnt2]<<' ';
}
if(ivec.size()%2==1)
{
cout<<endl<<"The middle number has not been summed and it's value is:"<<ivec[ivec.size()/2]<<endl;
}
cout<<endl;
return 0;
}
习题3.17 的程序:
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main()
{
vector<string> svec;
string str;
cout<<"Enter numbers(end to Ctrl+Z)"<<endl;
while(cin>>str)
svec.push_back(str);
if(svec.size()==0)
{
cout<<"No elements?!"<<endl;
return -1;
}
cout<<"Transformed elements in the vector are:"<<endl;
vector<string>::size_type cnt=0;
for(vector<string>::iterator iter=svec.begin();iter<svec.end();++iter) {
for(string::size_type index=0;index<(*iter).size();index++)
if(islower((*iter)[index]))
(*iter)[index]=toupper((*iter)[index]);
cout<<*iter<<" ";
cnt++;
if(cnt%8==0)
cout<<endl;
}
cout<<endl;
return 0;
}
习题5.18 答案
#include <iostream>
//#include <cstring>
#include <string>
//#include <ctime>
#include <vector>
//#include <bitset>
//#include <cctype>
using namespace std;
int main()
{
vector<string*> spvec;
string str;
cout<<"Enter strings:(Ctrl+Z to end)"<<endl;
while(cin>>str)
{
string *pstr=new string;
*pstr=str;
spvec.push_back(pstr);
}
vector<string*>::iterator iter=spvec.begin();
while(iter!=spvec.end())
{
size_t k=(*iter)->size();
string stri(**iter);
cout<<k<<" "<<stri<<endl;
iter++;
}
iter=spvec.begin();
while(iter!=spvec.end())
{
delete *iter;
iter++;
}
return 0;
}
用不同的方法处理边界:
#include <iostream>
//#include <cstring>
//#include <string>
//#include <ctime>
//#include <vector>
//#include <bitset>
//#include <cctype>
using namespace std;
int sum1(const int *begin,const int *end) {
int sum=0;
while(begin!=end)
{
sum+=*begin++;
}
return sum;
}
int sum2(const int ia[],size_t size)
{
int sum=0;
for(int ix=0;ix!=size;ix++)
{
sum+=ia[ix];
}
return sum;
}
int sum3(int *begin,size_t size)
{
int sum=0;
int *p=begin;
while(p!=begin+size)
{
sum+=*p++;
}
return sum;
}
int main()
{
int ia[]={1,2,3,4};
cout<<"summation from sum1():"<<sum1(ia,ia+4)<<endl <<"summation from sum2():"<<sum2(ia,4)<<endl
<<"summation from sum3():"<<sum3(ia,4)<<endl;
return 0;
}。