相同点:字符串接受结束后自动加'0'。例1:#include <stdio.h>main()(char ch1[10],ch2[10];scanf("%s",ch1);gets(ch2);)依次键入asd空格fg回车,asd空格fg回车,则ch1="asd0",ch2="asd fg0"。例2:#include <stdio.h>main()(char ch1[10],ch2[10],c1,c2;scanf("%s",ch1);c1=getchar();gets(ch2);c2=getchar();)依次键入asdfg回车,asdfg回车,则ch1="asdfg0",c1='n',ch2="asdfg0",c2需输入。scanf :当遇到回车,空格和tab键会自动在字符串后面添加'0',但是回车,空格和tab键仍会留在输入的缓冲区中。gets:可接受回车键之前输入的所有字符,并用'n'替代 '0'.回车键不会留在输入缓冲区中gets()用到读取字符串,用回车结束输入 scanf()可以读取所有类型的变量(t=z;x=z;x=t;)if(y>z)(t=z;y=z;z=t;)printf("small to big :%d %d %dn",x,y,z);}[程序6] 题目:用*号输出字母C的图案。 1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。 2.程序源代码:#include <stdio.h>main()(printf("Hello C-world!n");printf(" ****n");printf("*n");printf("*n");printf(" ****n");)[程序8] 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include <stdio.h>main()(int i,j,result;for(i=1;i<10;i++){for(j=1;j<10;j++){result=i*j;printf("%d*%d=%-3d",i,j,result);)printf("n");}}[程序12] 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 2.程序源代码:#include <stdio.h>#include <math.h>main()(int m,i,k,h=0,leap=1;printf("n");for(m=101;m<200;m++){k=sqrt(m+1);for(i=2;i<k;i++)if(m%i==0){leap=0;break;)if(leap)(printf("%-4d",m);h++;if(h%10==0){printf("n");)}leap=1;}printf("nThe total is %dn",h);}[程序13] 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序源代码:#include <stdio.h>main()(int i,j,k,n;printf("Water flower number is:");for(n=100;n<1000;n++){i=n/100;j=n%100/10;k=n%10;if(i*100+j*10+k==i*i*i*i+j*j*j+k*k*k){printf("%-5d",n);)}printf("n");}[程序14] 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.程序源代码:#include <stdio.h>main()(int n,i;printf("Please input a number:n");scanf("%d",n);printf("%d=",n);for(i=2;i<=n;i++){while(n!=i){if(n%i==0){printf("%d*",i);n=n/i;)elsebreak;}}printf("%dn",n);}[程序16] 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码(原理不清楚 只知道确实是可行的 背出来得了) #include <stdio.h>main()(int a,b,num1,num2,temp;printf("Please input two numbers:n");scanf("%d%d",num1,num2);if(num1<num2){temp=num1;num1=num2;num2=temp;)A. =num1; B. =num2; C. hile(b!=0) D. ( E. %b; F. =b; G. =temp;)n",a);n",num1*num2/a);}[程序17] 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'n'. 2.程序源代码: #include <stdio.h>in()(r c;ce=0,digit=0,others=0;printf("Please input some charactersn");r())!='n'){'c<='z'||c>='A'c<='Z')letters++;lse if(c==' ')ce++;lse if(c>'0'c<'9')igit++;lsehers++;)ll in all:char=%d space=%d digit=%d others=%dn",letters,space,digit,others);}[程序19] 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。 1. 程序分析:请参照程序<--上页程序14. 2.程序源代码: #include <stdio.h>in()([100];int i,j,n,s,t;or(j=2;j<1000;j++){n=-1;s=j;t=j;or(i=1;i<=j;i++){hile(j!=i){if(j%i==0){n++;s=s-i;[n]=i;j=j/i;)lsek;}}if(s==0)(printf("%d=",t);/ for(i=0;i<n;i++)[i]);)n=-1;}}[]的下标,因此每检验1个数字n都要复原到原来的值-1. 假如放在int i,j,n,s; 这样的话它在程序中只运行一次(由于在for循环体外面,for循环体里边的要运行997次,即要检验1000以内数的数) #include "stdio.h" void main() ( static int k[10];/ (这句是啥意思) 这句话申明k[10]是1个静态数组, int i,j,n,s; /(n= -1;为何不能加在这) 由于每回检验1个数字是不是完数先要把n=-1 for(j=2;j<1000;j++) { n=-1; /(为何能加在这) s=j; for(i=1;i<j;i++) { if((j%i)==0) { n++; s=s-i; k[n]=i; ) } if(s==0) ( printf("%d is a wanshu",j); for(i=0;i<n;i++) printf("%d,",k[i]); printf("%dn",k[n]); ) } } /j=6时,i=1,2,3的时候能被6除尽,因此s=j=6 要减去1,2,3这样最后s=0 则输出他是个完数 /请用例子说明一下程式的运行过程.例如j=6."[程序24]?题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。1.程序分析:请抓住分子与分母的变化规律。?2.程序源代码:h>in()(int n,number=20;t t,a=2,b=1,s=0;or(n=1;n<=number;n++){/b;;=a+b;=t;)n",s);}[程序25] 题目:求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码:h>in()(t n,s=0,t=1;or(n=1;n<=20;n++){t*=n;s+=t;)printf("1!+2!+3!+...+20!=%e",s);[程序26] 题目:利用递归方法求5!。 1.程序分析:递归公式:fn=fn_1*4! 2.程序源代码: #include <stdio.h>ct(int j)(int sum;if(j==0)sum=1;lsect(j-1);return sum;)in()(int i;or(i=0;i<=5;i++){n",i,fact(i));)}[程序37] 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。 2.程序源代码:h>N 10in()([N];printf("Please input ten numbers:n");N;i++){[%d]=",i);nf("%d",a[i]);n");)N;i++)[i]);n");N-1;i++)(min=i;N;j++){[min]>a[j])min=j;[i];[i]=a[min];[min]=temp;)}fter sortedn");N;i++)([i]);)n");}[程序70]in函数中输入字符串,并输出其长度。 1.程序分析: 2.程序源代码:h>r p[])(int n=0;0'){n++;p++;)return n;}in()(int len;r str[20];printf("Please input a string:n");nf("%s",str);h(str);tf("The string has %d characters.n",len);)[程序82] 题目:八进制[1]转换为十进制[2]h>in()(r a[20];r* p;int n=0;;printf("请输入一个八进制数:");ets(p);0'){n=n*8+*p-'0';p++;)n",n);}[程序96] 题目:计算字符串中子串[3]出现的次数h>h>in()(r str1[20],str2[20],*p1,*p2;int sum=0;printf("Please input two strings:n");nf("%s%s",str1,str2);p1=str1;p2=str2;0'){if(*p1==*p2){0'){p1++;p2++;)}lsep1++;0')sum++;p2=str2;}printf("%d",sum);h(); 这句代码不理解是什么意思}[程序97](谭浩强版P337) 题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。 1.程序分析: 2.程序源代码:h>h>in()(ILE* fp;r ch,filename[10];nf("%s",filename);me,"w"))==NULL){annot open the file!");xit(0);)r();/用于接收scanf操作中最后输入的回车符r();/接收输入的第一个字符hile(ch!='#')(h,fp);r(ch);r();)n");close(fp);}[程序98] 题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。 #include <stdio.h>h>h>in()(ILE* fp;r str[100],filename[10];int i=0;n("test","w"))==NULL){annot open the filen");xit(0);)printf("Please input a string:n");ets(str);[i]!='!')([i]>='a'str[i]<='z')[i]=str[i]-32;[i],fp);i++;)close(fp);p=fopen("test","r");gets(str,strlen(str)+1,fp);n",str);close(fp);}[程序99](有点小问题,出现了一个烫,说是未赋值) 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。 1.程序分析: 2.程序源代码:h>h>in()(ILE* fp;nt i,j,k,num,NUM;r c[160],t,ch;txt","r"))==NULL){cannote openannot be openedn");xit(0);)contents are:n");tc(fp))!=EOF;i++)/*一个字符一个字符读*/([i]=ch;r(c[i]);)num=i+1;close(fp);txt","r"))==NULL){annot be openedn");
相同点:
字符串接受结束后自动加'\0'。
例1:
#include <stdio.h>
main()
{
char ch1[10],ch2[10];
scanf("%s",ch1);
gets(ch2);
}
依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd fg\0"。
例2:
#include <stdio.h>
main()
{
char ch1[10],ch2[10],c1,c2;
scanf("%s",ch1);
c1=getchar();
gets(ch2);
c2=getchar();
}
依次键入asdfg回车,asdfg回车,则ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需输入。
scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,并用'\n'替代 '\0'.回车键不会留在输入缓冲区中
gets()用到读取字符串,用回车结束输入 scanf()可以读取所有类型的变量
{
t=z;x=z;x=t;
}
if(y>z)
{
t=z;y=z;z=t;
}
printf("small to big :%d %d %d\n",x,y,z);
}
[程序6] 题目:用*号输出字母C的图案。 1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。 2.程序源代码:
#include <stdio.h>
main()
{
printf("Hello C-world!\n");
printf(" ****\n");
printf("*\n");
printf("*\n");
printf(" ****\n");
}
[程序8] 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include <stdio.h>
main()
{
int i,j,result;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);
}
printf("\n");
}
}
[程序12] 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 2.程序源代码:
#include <stdio.h>
#include <math.h>
main()
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<200;m++)
{
k=sqrt(m+1);
for(i=2;i<k;i++)
if(m%i==0)
{
leap=0;break;
}
if(leap)
{
printf("%-4d",m);
h++;
if(h%10==0)
{
printf("\n");
}
}
leap=1;
}
printf("\nThe total is %d\n",h);
}
[程序13] 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序源代码:
#include <stdio.h>
main()
{
int i,j,k,n;
printf("Water flower number is:");
for(n=100;n<1000;n++)
{
i=n/100;
j=n%100/10;
k=n%10;
if(i*100+j*10+k==i*i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("\n");
}
[程序14] 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 2.程序源代码:
#include <stdio.h>
main()
{
int n,i;
printf("Please input a number:\n");
scanf("%d",n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d\n",n);
}
[程序16] 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码(原理不清楚 只知道确实是可行的 背出来得了) #include <stdio.h>
main()
{
int a,b,num1,num2,temp;
printf("Please input two numbers:\n");
scanf("%d%d",num1,num2);
if(num1<num2)
{
temp=num1;
num1=num2;
num2=temp;
}
A. =num1;B. =num2;
C. hile(b!=0)
D. {
E. %b;
F. =b;
G. =temp;
}
\n",a);
\n",num1*num2/a);
}
[程序17] 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 2.程序源代码: #include <stdio.h>
in()
{
r c;
ce=0,digit=0,others=0;
printf("Please input some characters\n");
r())!='\n')
{
'c<='z'||c>='A'c<='Z')
letters++;
lse if(c==' ')
ce++;
lse if(c>'0'c<'9')
igit++;
lse
hers++;
}
ll in all:char=%d space=%d digit=%d others=%d\n",letters,space,digit,others);
}
[程序19] 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。 1. 程序分析:请参照程序<--上页程序14. 2.程序源代码: #include <stdio.h>
in()
{
[100];
int i,j,n,s,t;
or(j=2;j<1000;j++)
{
n=-1;
s=j;
t=j;
or(i=1;i<=j;i++)
{
hile(j!=i)
{
if(j%i==0)
{
n++;
s=s-i;
[n]=i;
j=j/i;
}
lse
k;
}
}
if(s==0)
{
printf("%d=",t);
// for(i=0;i<n;i++)
[i]);
}
n=-1;
}
}
[]的下标,因此每检验1个数字n都要复原到原来的值-1. 假如放在int i,j,n,s; 这样的话它在程序中只运行一次(由于在for循环体外面,for循环体里边的要运行997次,即要检验1000以内数的数) #include "stdio.h" void main() { static int k[10];// (这句是啥意思) 这句话申明k[10]是1个静态数组, int i,j,n,s; //(n= -1;为何不能加在这) 由于每回检验1个数字是不是完数先要把n=-1 for(j=2;j<1000;j++) { n=-1; //(为何能加在这) s=j; for(i=1;i<j;i++) { if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf("%d is a wanshu",j); for(i=0;i<n;i++) printf("%d,",k[i]); printf("%d\n",k[n]); } } } //j=6时,i=1,2,3的时候能被6除尽,因此s=j=6 要减去1,2,3这样最后s=0 则输出他是个完数 //请用例子说明一下程式的运行过程.例如j=6."
[程序24]?题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。1.程序分析:请抓住分子与分母的变化规律。?2.程序源代码:
h>
in()
{
int n,number=20;
t t,a=2,b=1,s=0;
or(n=1;n<=number;n++)
{
/b;
;
=a+b;
=t;
}
\n",s);
}
[程序25] 题目:求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码:
h>
in()
{
t n,s=0,t=1;
or(n=1;n<=20;n++)
{
t*=n;
s+=t;
}
printf("1!+2!+3!+...+20!=%e",s);
[程序26] 题目:利用递归方法求5!。 1.程序分析:递归公式:fn=fn_1*4! 2.程序源代码: #include <stdio.h>
ct(int j)
{
int sum;
if(j==0)
sum=1;
lse
ct(j-1);
return sum;
}
in()
{
int i;
or(i=0;i<=5;i++)
{
\n",i,fact(i));
}
}
[程序37] 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。 2.程序源代码:
h>
N 10
in()
{
[N];
printf("Please input ten numbers:\n");
N;i++)
{
[%d]=",i);
nf("%d",a[i]);
\n");
}
N;i++)
[i]);
\n");
N-1;i++)
{
min=i;
N;j++)
{
[min]>a[j])
min=j;
[i];
[i]=a[min];
[min]=temp;
}
}
fter sorted\n");
N;i++)
{
[i]);
}
\n");
}
[程序70]
in函数中输入字符串,并输出其长度。 1.程序分析: 2.程序源代码:
h>
r p[])
{
int n=0;
\0')
{
n++;
p++;
}
return n;
}
in()
{
int len;
r str[20];
printf("Please input a string:\n");
nf("%s",str);
h(str);
tf("The string has %d characters.\n",len);
}
[程序82] 题目:八进制[1]转换为十进制[2]
h>
in()
{
r a[20];
r* p;
int n=0;
;
printf("请输入一个八进制数:");
ets(p);
\0')
{
n=n*8+*p-'0';
p++;
}
\n",n);
}
[程序96] 题目:计算字符串中子串[3]出现的次数
h>
h>
in()
{
r str1[20],str2[20],*p1,*p2;
int sum=0;
printf("Please input two strings:\n");
nf("%s%s",str1,str2);
p1=str1;
p2=str2;
\0')
{
if(*p1==*p2)
{
\0')
{
p1++;
p2++;
}
}
lse
p1++;
\0')
sum++;
p2=str2;
}
printf("%d",sum);
h(); 这句代码不理解是什么意思
}
[程序97](谭浩强版P337) 题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。 1.程序分析: 2.程序源代码:
h>
h>
in()
{
ILE* fp;
r ch,filename[10];
nf("%s",filename);
me,"w"))==NULL)
{
annot open the file!");
xit(0);
}
r();//用于接收scanf操作中最后输入的回车符
r();//接收输入的第一个字符
hile(ch!='#')
{
h,fp);
r(ch);
r();
}
\n");
close(fp);
}
[程序98] 题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。 #include <stdio.h>
h>
h>
in()
{
ILE* fp;
r str[100],filename[10];
int i=0;
n("test","w"))==NULL)
{
annot open the file\n");
xit(0);
}
printf("Please input a string:\n");
ets(str);
[i]!='!')
{
[i]>='a'str[i]<='z')
[i]=str[i]-32;
[i],fp);
i++;
}
close(fp);
p=fopen("test","r");
gets(str,strlen(str)+1,fp);
\n",str);
close(fp);
}
[程序99](有点小问题,出现了一个烫,说是未赋值) 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。 1.程序分析: 2.程序源代码:
h>
h>
in()
{
ILE* fp;
nt i,j,k,num,NUM;
r c[160],t,ch;
txt","r"))==NULL)
{
cannot
e open
annot be opened\n");
xit(0);
}
contents are:\n");
tc(fp))!=EOF;i++)/*一个字符一个字符读*/
{
[i]=ch;
r(c[i]);
}
num=i+1;
close(fp);
txt","r"))==NULL)
{
annot be opened\n");
题目解答
答案
【程序 17 】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1. 程序分析:利用 while 语句 , 条件为输入的字符不为 '\n'. 2. 程序源代码: #include <stdio.h> main() { int k[100]; int i,j,n,s,t; for(j=2;j<1000;j++) { n=-1; s=j; t=j; for(i=1;i<=j;i++) { while(j!=i) { if(j%i==0) { n++; s=s-i; k[n]=i; j=j/i; } else break; } } if(s==0) { printf("%d=",t); // for(i=0;i<n;i++) // printf("%d",k[i]); } n=-1; } } " 解答你的补充问题 : 首先你要搞清楚 n 的作用 , 它是用标记能被 j 整除的数组 k[] 的下标 , 因此每检验 1 个数字 n 都要复原到原来的值 -1. 假如放在 int i,j,n,s; 这样的话它在程序中只运行一次 ( 由于在 for 循环体外面 ,for 循环体里边的要运行 997 次 , 即要检验 1000 以内数的数 ) #include "stdio.h" void main() { static int k[10];// ( 这句是啥意思 ) 这句话申明 k[10] 是 1 个静态数组 , int i,j,n,s; //(n= -1; 为何不能加在这 ) 由于每回检验 1 个数字是不是完数先要把 n=-1 for(j=2;j<1000;j++) { n=-1; //( 为何能加在这 ) s=j; for(i=1;i<j;i++) { if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf("%d is a wanshu",j); for(i=0;i<n;i++) printf("%d,",k[i]); printf("%d\n",k[n]); } } } //j=6 时, i=1,2,3 的时候能被 6 除尽 , 因此 s=j=6 要减去 1,2,3 这样最后 s=0 则输出他是个完数 // 请用例子说明一下程式的运行过程 . 例如 j=6." 【程序 70 】 题目:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。 1. 程序分析: 2. 程序源代码: 【程序 82 】 题目:八进制转换为十进制 #include <stdio.h> main() { char a[20]; char* p; int n=0; p=a; printf(" 请输入一个八进制数 :"); gets(p); while(*p!='\0') { n=n*8+*p-'0'; p++; } printf(" 十进制数为 %d\n",n); } 【程序 96 】 题目:计算字符串中子串出现的次数 【程序 97 】 ( 谭浩强版 P337) 题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个 # 为止。 1. 程序分析: 2. 程序源代码: 【程序 98 】 题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件 “test” 中保存。输入的字符串以!结束。 【程序 99 】(有点小问题,出现了一个烫,说是未赋值) 题目:有两个磁盘文件 A 和 B, 各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。 1. 程序分析: 2. 程序源代码: