c程序设计实例_第1页
c程序设计实例_第2页
c程序设计实例_第3页
c程序设计实例_第4页
c程序设计实例_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计实例

【例3.12】用下面公式求兀的近似值。加441-1/3+1/5-1/7+...直到最后一项的绝对值小于10-

7为止。根据给定的算法很容易编写程序如下:

#include<iostream>

#include<iomanip>

#include<cmath>

usingnamespacestd;

intmain()

k------------------

ints=l;

doublen=l,t=l,pi=0;

while((fabs(t))>le-7)

{-------------------------1

pi=pi+t;

n=n+2;

s二-s;_

t=s/n;

)

pi=pi*4;

return0;

)

运行结果为

pi=3.141592

注意:不要把n定义为整型变量,否则在执行“t=s/n;”时,得到t的值为0(原因是两个整数

相除)。

【例3.13】求Fibonacci数列前4()个数。这个数列有如下特点:第1、2个数为1、1,从第3

个数开始,每一个数是其前面两个数之和。即:

Fl=(n=l)

1(n=2)

Fn^Fn-l+Fn-2(n>3)

这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每一个月都生一对兔子,

小兔子长到第3个月后每一个月又生一对兔子,假设所有兔子都不死,问每一个月的兔

子总数为多少?

根据给出的每月兔子总数的关系,可编写程序如下:

#include<iostream>

#include<iomanip>

usingnamespacestd;

intmain()

(

longfl,f2;

inti;

fl=f2=l;

for(i=l;i<=20;i++)

=f--------------------------1

cout«setw(12)«fl«setw(l2)<<f2;〃设备

输出字段宽度为12,每次输出两个数

if(i%2==0)cout«endl;

//每输出完4个数后换行,使每行输出4个数

fl=fl+f2;

〃左边的fl代表第3个数,是第12个数之和

f2=f2+fl;

〃左边的f2代表第4个数,是第23个数之和}

return0;

)

【例3.14】找出100〜200间的全部素数。编写程序如下:

#include<iostream>

#includc<cmath>

#include<iomanip>

usingnamespacestd;

intmair)()

rf~--------1

bool附用力出发布尔变量prime

for(m=101;m<=200;m=m+2)〃判别m是否为素数,m由101变化到200增量为2

k---------------------------------------------------------------------------------------------------1

prime=true;〃循环开始时设prime为真,即先认为m为素数

k=int(sqrt(m));//用k代表根号m的整数部份

for(i=2;i<=k;i++)//此循环作用是将m被2〜根号m除,检查是否能整除

if(m%i=0)〃如果能整除,表示m不是素数

pnme=false;〃使prime变为假

break;〃终止执行本循环

)

if(prime)〃如果m为素数

J…一.....

cout<<setw(5J<<m;〃输出素数m,字段宽度为5

n=n+l;〃n用来累计输出素数的个数

if(n%10==0)cout«endl;〃输出1()个数后换行}

coul<vendl;//最后执行一次换行

return0;

}

【例3.15】译密码。

为使电文保密,往往按二定规律将电文转换成密码,收报人再按约定的规律将其译回原

文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其

后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。见图3.20,字母按上述规律

转换,非字母字符不变,如转换为。

输入一行字符,要求输出其相应的密码。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

c=c+4;

运行结果如下:

IamgoingtoBeijing!M

eqksmrkxsFimnmrk!

while语句中括号内的表达式有3个作用:I

从键盘读入二个字符,这是用getchar函数实现的;

将读入的字符赋给字符变量c:

判别这个字符是否为'’(即换行符)。如果是换行符就执行while语句中的复合

语句(即花括号内的语句),对输入的非换行符的字符进行转换处理。

按前面分析的思路对输入的字符进行处理,有一点请读者注意,内嵌的if语句不能写

成:

ifCo'Z'Ho'z')c=c-26;

因为所有小写字母都满足条件,从而也执行“c=c-26;”语句,这就会出错。因此

必须限制其范围为"c>Z&&c<=Z+4",即原字母为,W,到Z,在此范围以外的不是原

大写字母亚~2,不应按此规律转换。

请考虑:为什么对小写字母不按此处理,即写成c>N&&cv=N+4而只须写成即可。

计算拉格朗日插值的源程序

#includc<stdio.h>

#include<conio.h>

#include<stdlib.h>

//#include<alloc.h>

floatLagrange(float*x,float*y,floatxx,intn)

(

intij;

float*a,yy=0.0;

a=(float*)malloc(n*sizeof(float));

for(i=0;i<=n-l;i++)

(

a[i]=y[i];

for(j=0;j<=n-1;j++)

ifa!=i)a[i]*=(xx-xU])/(x[i]-xU]);

yy+=a[i];

}

free(a);

returnyy;

)

voidmain()

(

floatx[4]={0,56160,0.56280,0.56401,0.56521};

floaty[4]={0.82741,0.82659,0.82577,0.82495};

floatxx=O.5635,yy;

floatLagrange(float*,floatfloat,int);

yy=Lagrange(x,y,xx,4);

//clrscr();

getch();

}

编译原理词法分析器C++源程序

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#includc<conio.h>

#include<process.h>/本头文件本/

voidinit();

char*DchangeB(char*buf);

intscarch(char:i:buf,inttypc,intcommand);

voidintdeal(char*buffer);

voidchardcal(char"buffer);

voidenordeal(charenor,intlineno);

voidscanner();

voidinit()

char

/*C语言所有关键字/

binary=newchar[2];

binary[O]=,O,;

binary[l]=70,;

rcturn(binary);

n

i=0:

while(value!=O)

(

temp[i++]=value%2;

value/=2;

)

temp[i]=701;

binary=newchar[i+l];

for(j=0;j<=i-l;j++)

binary|j]=(char)(temp[i-j-1J+48);

binary[i]=70*;

rcturn(binary);/*十进制转化为二进制*/

intscarch(char*buf,inttypejntcommand)

{intnumbcr=0;

fstreamoutfile;

charch;

chartemp[30];

inti=0;

switch(type)

)

outfile.get(ch);

while(ch!=EOF){

while(ch!=7n')

(

tcmp[i+4-]=ch;

outfile.get(ch);

F

temp[i]=70,;

i=0;

number+4-;

if(strcmp(temp,buf)==O)

{

outfile.close();

returnnumber;/*若找到,返回在相应表中的序号*/

)

else

outfile.get(ch);

1〃结束外层while循环

if(command==1)

I

outfile.close();

relum0;户找不到,当只需查表,返回0,否

则还需造表*/

)

switch(typc)

}

outfile«buf;

outfile.close();

returnnumber+1;

voidintdeal(char*buffer){

fstreamoutfilc;

intresult;

result=search(buffer,1,1);/*先查关键字表*/

if(result!=O)

outfile«buffer«result«endl;/*若找到,写入输出文件*/

else

result=search(buffer,2,2);

/*若找不到,则非关键

字,查标识符表,还找不到则造入标识符*表/

outfile<<buffer<<resulK<endl;

}

写入输出文件*/

outfilc.closc();

voidchardeal(char*buffer)

(fstreamoutfile;

intresult;

result=search(buffer,1,1);/*先杳关键字表*/

if(result!=0)

outfile<<buffer<<resulK<endl;/*若找到,写入输出文件*/

else

result=search(buffer,2,2);/*若找不到,则非关键

字,查标识符表,还找不到则造入标识符*表/

outfile<<buffer<<result<<endl;

)

写入输出文件*/

outfile.close();

)

voiderrordeal(charerror,intlineno)

(

}

voidscanner()

(fstreaminfile,outfile;

charfilcnamc[20];

charch;

interr=0;

inti=0,linc=l;

intcount,result,erromo=0;

chararray[30];

char*word;

eel;

infile.open(filename,ios::nocreate|ios::in);

while(!infile)

(

thefile

infile.open(filename,ios::nocreate|ios::in);err++;

if(crr==3)

exit(0);)

)

infile.get(ch);

while(ch!=EOF)

/*按字符挨次扫描源程序,直至结束*/

i=();

iR((ch>=,A')&&(ch<=,Z,))11((ch>=,a')&&(ch<=,z,))11(ch='J)){/*

以字母开头*/

while(((ch>='A,)&&(ch<='Z,))11((ch>=,a')&&(ch<='z,))||(ch='_,)ll

((ch>=0)&&(chv=9)))

(

array[i++]=ch;

infile.get(ch);

)

word=newchar[i+lj;

memcpy(word,array,i);

word[i]='/0,;

intdeal(word);

if(ch!=EOF)

infile.seekg(-1,ios::cur);

_______________

elseif(ch>='0'&&ch<=,9')

{/*以数字开头*/

while(ch>—'0'&&ch<-'9')

(

array[i++]=ch;

infile.get(ch);

)

word=newchar[i+l];

mcmcpy(word,anay,i);

word[i]=70,;

intdeal(word);

if(ch!=EOF)

infile.seekg(-1,ios::cur);

)]

elseif((ch==',)11(ch=7t*))

;/*消除空格符和水平制表符刃

elseif(ch==7n')

line++;/*消除回车并记录行数*/

elseif(ch==7')

{/*消除注释*/

infile.get(ch);

if(ch二二七)

/*判断是否为'/='符号*/

outfile.close();

)

elseif(ch!-**)

/*若为除号,写入输出文件

*/

::叩p);

outfile.close();

outfile.seekg(-1,ios::cur);

)

elseif(ch=二'*')

{/*若为注释的开始,消除包含在里面的所有字符

*/

count=0;

infile.get(ch);

while(count!=2)

{/*当扫描到‘*’且紧接着下

一个字符为'/'才是注释的结束*/

count=();

while(ch!-**)

infile.gel(ch);

count++;

infile.get(ch);

if(ch=7)

count++;

else

infile.get(ch);

}

}

I

f/*消除包含在双引号中的字符串常量*/

outfile.close();

infile.get(ch);

infile.close();

1

else

{/*首字符为其它字符,即运算限界符或者非法字

*/符

array[0]=ch;

infile.get(ch);/*再读入下一个字符,判断

是否为双字符运算、限界符*/

if(ch!=EOF)

{/*若该字符非文件结束符*/

array!1]=ch;

word=newchar[3];

memcpy(word,array,2);

word[2]='/0';

result=search(word,4,1);/*先检索

是否为双字符运算、限界符*/M、

if(result==O)

/*若不是*/

word=newchar⑵;

memcpy(word,array,1);

wordf11=70';

result=search(word,4,1);/*检索是否为单字符运算、限界符

*/

if(result==O)

(

/*若还不是,则为非法字符*/

errordeal(arrayf01Jine);

crrorno++;

infile.seekg(-l,ios::cur);

1

else

{/*若为单字符运算、限界符,写入输出文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论