江苏省计算机等级考试(二级C语言)考点分析
一、宏定义
二级考试必考的,必须让学生明白:宏替换只是原样替换。
(1)2002年秋填空第7题
#define N 3
#define Y(n) ((N+1)*n)
则执行语句“z=2*(N+Y(5+1));”后,z的值是_______。
替换时原样替换后的式子为:z=2*(3+((3+1)*5+1));
(2)2005年春填空第10题
#include #define ADD(x,y) x+y
main()
{int a=15,b=10,c=20,d=5;
printf(“%d\\n”,ADD(a,b)/ADD(c,d));
上面程序输出结果为_________。
二、递归应用
(1) 2000年秋填空第5题
main()
{ int s, p[9]={1,2,3,4,5,6,7,8,9};
printf(“\\n%d”, add(p,5));
}
add(int *p, int n)
{ if(n==1) return *p;
else return *p+add(p+1,n-1);
}
程序输出结果是________。
结果为:15
(2) 2000年秋填空第8题
fun(int n, int *s)
{ int f1,f2;
if(n==1||n==2) *s=1;
else
{fun(n-1,&f1); fun(n-2, &f2);
*s=2*f1+f2+1; printf(“\\n%d,%d”,f1,f2);
}
}
main()
{ int x;
fun(4,&x); printf(“\\n x=%d”,x);
}
程序运行时输出的第一行是_________,第二行是________,最后一行是________。
答案:1,1 4,1 x=10
(3) 2001年春填空第4题
以下程序输出结果是________
main()
{ printf(“%d”, fun(5)); }
fun( int n)
{ if(n==1) return 1;
return n-fun(n-1);
}
结果为:3
(4) 2001年春填空第12题
以下程序实现将a数组中后8个元素从大到小排序的功能
void sort(int *x, int n)
main()
{ int a[12]={5,3,7,4,2,9,8,32,54,21,6,43}, k;
sort(______, 8);
for(k=0; k<12; k++) printf(“%d”,a[k]);
}
void sort(int *x, int n)
{int j,t;
if(n==1) return;
for(j=1; jif(_______){ t=x[0]; x[0]=x[j]; x[j]=t; }
sort(x+1, ________);
}
本题结合了冒泡排序法,第一个空填:a+4 ;第二个空填:x[0](5) 2001年春填空第8题以下程序运行时第一行输出________,第二行输出________。
void rev(int *p, int n)
{ int t;
if(n>1)
{t=p[0]; [0]=p[n-1]; p[n-1]=t; rev(p+1,n-2); }
}
main()
{ int j,a[5]={1,2,3,4,5};
rev(a+1,4);
for(j=0; j<5; j++) printf(“%d”,a[j]);
printf(“\\n”;
rev(a,3);
for(j=0; j<5; j++) printf(“%d”,a[j]);
}
输出结果:15432 45132
(6) 2002年秋填空题第11题(P7-11)
main()
{ int a[3][3],i,j;
numlist(&a[0][0],9);
for(i=0; i<3; i++)
{ for(j=0; j<3; j++) printf(“%d,”, a[i][j]);
printf(“\\n”);
}
}
numlist(int *p, int n)
{ int i;
for(i=0; i}num(int n);
{ if(n==0) return 1;
return num(n-1)*2+1;
}
程序运行时输出的第一行是: 1,3,7
(7) 2003年春填空题第11题(P17-11)
long func(long x)
{ if(x<100) return x%10;
else return func(x/100)*10+x%10;
}
main()
{ printf(“The result is : %ld \\n”,func(1325)); }
程序运行结果是 The result is : 365
(8) 2003年秋填空题第11题(P26-11)
void fun(int *p1, int *p2);
main()
{ int i, a[6]={1,2,3,4,5,6};
fun(a,a+5);
for(i=0; i<5; i++) printf(“%2d”,a[i]);
}
void fun(int *p1, int *p2)
{ int t;
if(p1{ t=*p1; p1=*p2; *p2=t; fun(p1+=2, p2-=2); }}
程序运行结果是 6 2 4 3 5 1
(9) 2004年春(P37-11)
#include void f(int a[], int n, int x, int *c);
main()
{ int a[10]={1,3,5,2,3,5,3,7,4,1},t=0;
f(a,10,5,&t); printf(“%d”,t);
}
void f(int a[], int n, int x, int *c)
{ if(n==0) return;
if(a[0]>=x) (*c)++;
f(a+1,n-1,x,c);
}
程序运行结果是 3
(10) 2004年秋(P52-14)
本例结合了二分法求方程的根。见“方程求根”
(11) P68-14
本例结合了牛顿迭代法求方程的根。见“方程求根”
三、二维数组
(1) 2004年秋填空第12题(P51-12)
以下程序运行时输出结果的第一行是________,第二行是______,第三行是________。
#define N3
main()
{ int i,j,k=1,a[N][N]={0};
for(i=0;i{for(j=0; j<=i; j++) a[j][i-j]=k++; }for(; i<2*N; i++)
{for(j=i+1-N; j<=N-1; j++) a[j][i-j]=k++; }
for(i=0;i{for(j=0; jprintf(“\\n”);}
}
答案:1 2 4 3 5 7 6 8 9
(2) 2005年春填空第12题(P66-12)
以下程序运行时输出结果的第二行为______,第四行为______,第六行_______。
#include void change(int s[3][3], int d)
{ int i,j,k;
if(d==0)
{for(i=0; i<3; i++)
for(j=i+1;j<3;j++) {k=s[i][j]; s[i][j]=s[j][i]; s[j][i]=k; }
}
else
for(i=0; i<3; i++)
for(j=0;j<3-i;j++) {k=s[i][j]; s[i][j]=s[2-j][2-i]; s[2-j][2-i]=k; }
}
main()
{ int s[3][3]={1,2,3,4,5,6,7,8,9},i,j,k,n;
change(s,0);
for(i=0; i<3; i++)
{ for(j=0;j<3;j++) printf(“%4d”,s[i][j]);
printf(“\\n”);
}
change(s,1);
for(i=0; i<3; i++)
{ for(j=0;j<3;j++) printf(“%4d”,s[i][j]);
printf(“\\n”);
}
}
输出结果:2 5 8 9 8 7 3 2 1
四、链表应用
(1) 2003年秋填空第17题(P30-17)
设有一个线性单链表的结点定义如下:
struct node
{ int d;
struct node *next;
};
函数int copy_dellist(struct node *head, int x)的功能是:将head指向的单链表中存储的所有整数从小到大依次复制到x指向的整形数组中并撤消该链表;函数返回复制到x数组中的整数个数。算法:找出链表中数值最小的结点,将其值存储到x数组中,再将该结点从链表中删除,重复以上操作直到链表为空为止。
int copy_dellist(struct node *head, int x)
{struct noe *pk, *pj, *pm, *pn;
int data, k=0;
while(head!=0)
{pk=head; data=pk->d; pn=pk;
while(________!=0)
{ pj=pk->next;
if(_______d; pm=pk; pn=pj; }pk=pj;
}
x[k++]=pn->d;
if(_________) pm->next=pn->next;
else head=pn->next;
free(pn);
}
_____________;
}
答案:pk->next pj->d pn!=head return k
(2) 2004年春填空第17题(P41-17)
设某链表上每个结点的数据结构为:
typedef struct node
{ int d;
struct node *next;
}NODE;
函数NODE *invert(NODE *head)的功能是:将head指向的单链表逆置,即原链表最后一个结点变为第一个结点,原来倒数第二个结点变成第二个结点,以此类推。在逆置过程中不建立新的链表。
NODE *invert(NODE *head)
{ NODE *p, *q, *r;
if(head==0||__________) return head;
p=head;
q=p->next;
while(q!=0)
{ r=__________;
q->next=p; p=q; q=r;
}
__________=0;
head=__________;
return head;
}
答案:head->next==0 q->next head->next p
(3) 2004年秋填空第13题P51-13
以下程序运行时输出结果的第一行是________,第二行是________,第三行是_________。
#include #include typedef struct node
{ int d;
struct node *next;
}NODE;
NODE *insert(NODE *head, int x, int key)
{NODE *s, *p, *q;
s=(NODE *)malloc(sizeof(NODE));
s->d=key; s->next=NULL;
if(head==NULL) {head=s; return head; }
if(head->d==x) {s->next=head; head=s; return head; }
else
{ q=head; p=q->next;
while((p->d!=x)&&(p->next!=NULL)) {q=p; p=p->next; }
if(p->d==x) {s->next=p; q->next=s; }
else { s->next=NULL; p->next=s; }
return head;
}
}
void print(NODE *head);
{ if(head==NULL) return;
while(head->next!=NULL)
{ printf(“%d,”, head->d); head=head->next; }
printf(“%d\\n”,head->d);
}
main()
{ NODE *head=NULL;
head=insert(head,0,3); print(head);
head=insert(head,3,1); print(head);
head=insert(head,4,5); print(head);
}
答案:3 1,3 1,3,5
(4) 2005年春填空题第13题(P66-13)
以下程序运行时输出结果的第一行为________,第二行为_________,第三行为__________。
#include #include struct node
{ int d;
struct node *next;
}
struct node *create(void)
{ struct node *head=NULL,*p, *q=NULL;
int i;
for(i=2; i<=9; i++)
{ p=(struct node *)malloc(sizeof(struct node));
p->d=i; p->next=NULL;
if(head==NULL) head=p;
else q->next=p;
q=p;
}
return head;
}
void print(struct node *head);
{ if(head==NULL) return;
while(head->next!=NULL)
{ printf(“%d,”, head->d); head=head->next; }
printf(“%d\\n”,head->d);
}
struct node *delst(struct node *head, int *n)
{ int count=0; struct node *p, *q, *r;
p=r=head;
while(p!=NULL)
{ q=p->next;
while(q!=NULL)
{ if((q->d)%(p->d)==0)
{r->next=q->next; free(q); count++; q=r->next; }
else {r=q; q=q->next; }
}
p=p->next;
}
*n=count; return head;
}
void main()
{ int y;
struct node *head;
head=creat();
print(head);
head=delst(head,&y);
print(head);
printf(“%d”,y);
}
答案:2,3,4,5,6,7,8,9 2,3,5,7 4
五、字符串处理
(1) 2003年春填空第10题(P16-10)
以下程序运行时输出第一行是_______,第二行是________。
#include int convert(char s1[],char s2[])
{ int i=0,j,s;
char tab[8][4]={“000”,”001”,”010”,”011”,”100”,”101”,”110”,”111”};
for(i=0,j=0; s1[i]!=’\\0’; i++,j=j+3)
strcpy(&s2[j],tab[s1[i]-‘0’]);
for(i=0,s=0;ireturn s;}
main()
{ char ss1[]=”15”,ss2[80]; int y;
y=convert(ss1,ss2); printf(“%d\\n%s”,y,ss2);
}
分析:本程序将八进制数字组成的字符串ss1转换成二进制字符串和十进制数。
答案:13 001101
(2) 2003年春填空第12题(P17-12)
函数loop(s,m,n,str)的功能是:对字符串str中,从下标为s的字符开始的所有间隔为m的字符进行循环左移,即:str[s]←s[s+m], str[s+m]←s[s+3m], str[s+2m]←s[s+3m],…, str[s+(k-1)m]←s[s+km], str[s+km]←s[s](k为整数,下标s+km不越界),共做n次。
例如,调用loop(1,2,1,str)前后str中数据的变化情况如下:
str中初始数据:A B C D E F G H I J K
移位后str数据:A D C F E H G J I B K
#include #include void loop(int s,int m,int n, char *str);
main()
{char buf[81];
strcpy(buf,”ABCDEFGHIJK”); puts(buf);
loop(1,2,2,buf); puts(buf);
}
void loop(int s,int m,int n, char *str)
{char c; int k,i,len;
len=strlen(str);
for(i=0; i{k=________; c=str[k];while(k+m<________)
{ str[k]=str[k+m]; k=________; }
__________=c;
}
}
答案:s len k+m str[k]
(3) 2004年秋填空第16题(P40-16)
以下程序中函数strmerge的功能是:合并a和b两个有序的字母字符串(字典序)而产生一个新的字符串,在合并的过程中删除重复出现的字符,合并后的字符串仍然保持原序并保存到c指向的数组中,函数返回在合并过程中删除的字符个数。main函数中输出合并后的字符串“copy”以及在合并过程中删除的字符个数3。
#include int strmerge(char *a, char *b, char *c)
{int i=0,j=0,k=0; char t;
while(a[i]!=’\\0’&&__________)
{if(a[i]==b[j]) {t=a[i]; i++; __________; }
else if(a[i]else t=b[j++];if(t!=c[k-1]) ________=t;
}
while(a[i])
if(a[i]!=c[k-1] c[k++]=a[i++];
else i++;
while(b[j])
if(b[j]!=c[k-1] c[k++]=b[j++];
else j++;
c[k]=’\\0’;
return _________;
}
main()
{static char s1[10]=””,s2[10]=”oppy”,s3[20];
int n;
n=strmerge(s1,s2,s3);
puts(s3);
printf(“%d”,n);
}
答案:a[j]!=’\\0’ j++ c[k++] i+j-k
(4) 2004年秋填空第6题(P49-6)
以下程序运行时输出结果是________。
#include main()
{ char *s, *s1=”Here”;
s=s1;
while(*s1) s1++;
printf(“%d\\n”,s1-s);
}
分析:本程序是求指针s1所指向的字符串的长度。答案:4
(5) 2004年秋填空第11题(P50-11)
以下程序运行时输出结果的第一行是_______,第二行是______。
#include #include void process(char *s1, char *s2, char *s3, int d)
{ int i=0,j=0,len1=strlen(s1), len2=strlen(2),len3=0;
while(i{if(d==1&&s1[i]s2[j])s3[len3++]=s2[i++];
else
s3[len3++]=s2[j++];
}
void main()
{char s1[]=”bl”,s2[]=”el”,s3[]=”lb”,s4[]=”le”,s[20];
process(s1,s2,s,1); puts(s);
process(s3,s4,s,2); puts(s);
}
分析:函数process()完成的功能:(1)当d==1时,从s1、s2两字符串中依次取最小的字符放入s3中,直到有一个字符串结束,最后将未结束的字符串中剩余的字符加到s3的后面;(2)当d==2时,从s1、s2两字符串中依次取最大的字符放入s3中,直到有一个字符串结束,最后将未结束的字符串中剩余的字符加到s3的后面。
答案:bell lleb
(6) 2005年秋填空第11题(P65-11)
以下程序运行时输出结果的第一行为_______,第二行为______。
#include #include int process(char *s1,char *s2, char *s3)
{ int i=0, j=0, len1=strlen(s1), len2=strlen(s2), len3=0;
for(i=0; i{ for(j=0; jif(s1[i]==s2[i]) break;if(j>=len2) s3[len3++]=s1[i];
}
s3[len3]=’\\0’;
return len1-len3;
}
void main()
{ char s1[]=”bilker”, s2[]=”lr”,s3[20];
int n;
n=process(s1,s2,s3); puts(s3); printf(“\\n%d”,n);
}
分析:本程序中的函数process()完成的功能是:将字符串s1中有而s2中无的字符放入s3中。并返回在s1中有且s2中也有的字符个数。
答案:bike 2
(7) 2005年春填空第17题(P70-17)
以下程序中函数str_count的功能是:统计字符串s2在字符串s1中出现的次数并得到第一次出现的位置。子串出现的次数通过指针型形参变量返回给调用函数,函数返回值为子串第一次出现的位置下标。Main函数中输出这些信息。
#include #include int str_count(char s1[], char s2[], int *count)
{ int i=0,j=0, flag=0, len1, len2, pos=0, ct=0;
char tmp[100];
len1=strlen(s1); len2=strlen(s2);
while(i<=len1-len2)
{for(j=0; jtmp[j]=s1[i+j]; tmp[j]=’\\0’;
if(_________)
{ if(flag==0)
{ pos=i; flag=1; }
ct++; i=i+j;
}
else ___________;
}
*count=ct;
return pos;
}
void main()
{ char s1[]=”habcdefabcdghij”,s2[]=”abc”;
int count=0, first=0;
first=str_count(s1,s2, ________);
if(count)
printf(“%s appears %d times in %s.\\n first pos is %d.\\n”,s2,count,s1,first);
else printf(“%s not be found in %s!\\n”,s2,s1);
}
str_count()函数算法分析:依次从s1中取与s2长度相同的字符串放入tmp字符串中,将s2与tmp进行比较,如果相等则(1)存下位置,计数器ct++;(2)开始位置后移i=i+j。
答案:strcmp(s2,tmp)==0 i=i+1 &count
六、递推法
分析:递推法最关键的是找到前后项的区别。即怎样由前一项得到后一项。
(1) 2004年秋填空题第15题(P53-15)
以下程序采用递推法计算 的值,即求 的值。其中x为键盘输入的一个任意的单精度实数。
#include main()
{ int i,sign=1; float x,s,t;
scanf(“%f”,&x);
s=_________;
t=x;
for(i=1;i<=10; i++)
{ sign=-sign;
t=t*sign*________;
s+=t;
}
printf(“s=%6.2f”,s);
}
(2) 2005年春填空题第15题(P69-15)
以下程序的功能是:计算 的值。
#include #include double f(int n)
{ int i,j,sign=1;
double term,sum=0.0;
for(i=1; i<=n; i++)
{term=0;
for(j=0; ________; j++) term+=i*pow(10,j);
sum=sum+sign*________;
sign=-sign;
}
return sum;
}
void main()
{ printf(“\\nThe sum= %f \\n”,f(6)); }
答案:j七、穷举法
(1) 2004年春填空题第14题(P39-14)
如果一个两位整数是质数,将组成它的两个数字交换位置后形成的整数仍为质数,则称这样的数为绝对质数。例如,13就是一个绝对质数。以下程序用于找出所有两位绝对质数。
#include int a_prime(int n)
{ int j,k,m[2];
m[0]=n;
m[1]=________;
for(j=0; j<2; j++)
for(k=m[j]/2; k>1; k--)
if(__________) return 0;
return 1;
}
main()
{ int i;
for(i=10;I<100;I++) if(a_prime(i)) printf(“%d”,i);
}
答案:n/10+n%10*10 m[j]%k==0
(2) 2004年秋填空题第16题(P54-16)
定理:对于任意一个正整数都可以找到至少一串连续奇数,它们的和等于该正整数的立方。例如,33=27=7+9+11,43==1+3+5+7+9+11+13+15。以下程序用[2,20]之间的所有正整数验证该定理。
#include main()
{ long n,i,k,j,p,sum;
for(n=2; n<=20; n++)
{ k=n*n*n;
for(i=1; i{ for(j=i,sum=0; __________; j+=2) sum+=j;if(sum==k)
{ printf(“\\n %ld*%ld*%ld = %ld= “,n,n,n,sum);
for(p=i; p<__________; p+=2) printf(“%ld+”,p);
printf(“%ld”,p);
break;
}
}
if(i>=k/2) printf(“\\n Error!”);
}
}
答案:sum(3) 2005年春填空题第16题(P69-16)以下程序的功能是:寻找并输出11至999之间所有的整数m,满足条件m、m2、m3均为回文数(所谓回文数,是指其各位数字左右对称的整数。例如,121、12321都是回文数)。
#include int f(long n)
{ int i=0,j=0,a[10];
while(n!=0)
{ a[j++]=n%10;
n=_________;
}
j--;
while(________)
{ if(a[i]==a[j]) i++,j--;
else return 0;
}
return 1;
}
main()
{ long m;
for(m=11; m<1000; m++)
if(f(m)&&f(m*m)&&f(m*m*m))
printf(“m=%ld, m*m=%ld, m*m*m=%ld\\n”,m,m*m,m*m*m);
}
分析:函数f()主要完成的功能是:判断n是否是回文数,如果是返回1,否则返回0。算法实现方式:将整数n的各位数字存放到整型数组a[10]中,再对数组下标为0的元素与最后一个元素进行对比,如果相同,再对比下标为1的元素与倒数第二个元素是否相等,依次类推,如果全部相同,则为回文数。
答案:n/10 i八、静态变量/变量作用域(1) 2004年春填空题第9题(P36-9)
以下程序运行时输出结果的第一行是______,第二行是______。
int c;
void f1(int x, int *sum)
{ static int y;
x++; y++; c=c+y;
*sum=(x+y)/c;
}
main()
{ int a,b=100;
for(a=0;a<2;a++)
{ f1(a,&b); printf(“%d%d%d \\n”,a,b,c); }
}
答案:考点:静态变量。 0 2 1 1 1 3
(2) 2004年秋填空题第9题(P50-9)
以下程序运行时输出结果为:__________。
#include void num()
{ extern int x,y;
int a=15,b=10;
x=a-b; y=a+b;
}
int x,y;
main()
{int a=7,b=5;
x=a+b; y=a-b;
num();
printf(“%d,%d\\n”,x,y);
}
答案:本题考点:变量的作用域。 5,25
(3) 2005年春填写题第7题(P-7)
以下程序运行时输出结果为:__________。
#include int func(int a)
{ static int c=1;
c*=a; return c;
}
void main()
{ int b=1,i;
for(i=2; i<4; i++) b=b+sunc(i);
printf(“\\n %d”,b);
}
答案:考点:静态变量。9
九、方程求根
(1)2004年秋(P53-14)二分法
#include #include double f(double x)
{ return x*x-x-2; }
double root(double a,double b)
{ double m=(a+b)/2, fo=f(a), x=0;
if(fabs(f(m))<1e-6) x=_________;
else
{ if(fo*f(m)>0) a=m;
else b=m;
x=root(__________);
}
return x;
}
main()
{ printf(“\\n One root is %lf \\n”,root(1,4)); }
第一个空填:m ;第二个空填:a,b
(2)2005年春(P68-14)牛顿迭代法
#include #include double f(double x)
{ return x*x-x-2; }
double f1(doube x)
{ return 2*x-1; }
double root(double x)
{ double y;
if(fabs(f(x))<1e-6) y=_________;
else
y=root(__________);
return y;
}
main()
{ printf(“\\n One root is %lf \\n”,root(1.0)); }
第一个空填:x ;第二个空填:x-f(x)/f1(x)
十、查找、排序
(1) 2003年春填空题第15题(P19-15)
本题考点:选择排序和结构体应用。
以下程序对一组点坐标(x,y)按升序进行排序。要求:先按x的值排序,若x的值相同,则按y的值排序。排序算法为选择法。
#include #define N 5
typedef struct
{ int x,y; }POINT;
void point_sort(_____ *x, int n)
{ POINT t;
int i,j,k;
for(i=0; i{ __________;for(j=______; jif((x[k].x)>(x[j].x)) k=j;else if(________&&x[k].y>x[j].y) k=j;
if(k!=I) t=x[i], x[i]=x[k], x[k]=t;
}
}
main()
{ POINT a[N]={0};
int i=0;
while(i{ scanf(“%d%d”, &a[i].x, &a[i].y); i++; }point_sort(a,N);
for(i =0; i printf(“\\n %d, %d”, a[i].x, a[i].y);}
答案:k=i i+1 x[k].x==x[j].x
(2) 2005年春填空题第18题(P71-18)
本题考点:选择排序和结构体应用。
以下程序按结构成员grade的值从大到小对结构数组pu的全部元素进行排序,并输出经过排序后的pu数组全部元素的值。排序算法为选择法。
#include _________ struct {
int id;
int grade;
}STUD;
void main()
{ STUD pu[10]={{1,4},{2,9},{3,1},{4,5},{5,3},{6,2},{7,8},{8,6},{9,5},{10,2}},temp;
int i,j,k;
for(i =0; i <9; i++)
{ k=_________;
for(j= i +1; j<10; j++)
if(_________) k=j;
if(k!=i)
{ temp=pu[i]; pu[i]=pu[k]; pu[k]=temp; }
}
for(i =0; i <10; i ++)
printf(“\\n %2d: %d”, pu[i].id, pu[i].grade);
printf(“\\n”);
}
答案: i pu[j].grad>pu[k].grade
十一、结构体应用
(1) 2004年秋填空题第18题(P55-18)
以下程序统计结构数组pu中grade的每一个分值档次的人数,若程序正确,输出结果应为:
grade numbers of person
2 2
1 2
3 1
#include typedef struct {
int id;
int grade;
}STUD;
void main()
{ _________ pu[5]={{18,2},{19,2},{17,1},{21,1},{22,3}},*p;
int i, gd[5], ct[5]={0}, tmp, count;
count=1;
gd[0]=pu[0].grade;
ct[0]=1;
for(p=pu+1; p{ tmp=_________;for(i=0; if(gd[i]==tmp) break;if(i>=count)
{ gd[count]=tmp;
ct[count]=1;
count++;
}
else
___________;
}
printf(“grade numbers of person”);
for(i=0; iprintf(“\\n”);}
十二、求定积分(梯形法)
下次可能考。
例如:用复化梯形法求定积分
即a=0,b=1,f(x)=e-x。
C程序如下:
#include #include main()
{ int n,k;
double a=0.0,b=1.0,h,T,p,x;
printf("Please input n:");
scanf("%d",&n); /*输入等分数*/
h=(b-a)/n;
T=h*(exp(-a)+exp(-b))/2; /*用梯形公式计算积分近似值*/
p=0.0;
for(k=1;k{x=a+k*h; p=p+exp(-x); }T=T+p*h; /*将积分近似值与修正值之作为复化梯形公式求得的积分值*/
printf("T=%f\\n",T);
}
在程序执行时,提示
Please input n:
此时要求从键盘输入等分数n,如果输入100,则输出结果为
T=0.632126
如果输入10,则输出结果为 : T=0.6327