- 1./*教材p.97*/
- #include <stdio.h>
- main()
- {
- int *p,m,n;
- scanf("%d%d",&m,&n);
- if(m>n)
- p=&n;
- else
- p=&m;
- printf("%d/n",*p);
- }
- /*用指针指向两个变量,通过指针运算选出最小数*/
- **************************************************************************
- 2./*教材p.100*/
- #include <stdio.h>
- void order (int *a,int *b);
- main()
- {
- int m,n;
- order(&m,&n);
- printf("%d/n%d/n",m,n);
- }
- void order (int *a,int *b)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- if(x<y)
- {
- *a=x;
- *b=y;
- }
- else
- {
- *a=y;
- *b=x;
- }
- }
- /*使调用函数中的第一个实参总是存放两个数中的较小的数,第二个存放较大的*/
- **************************************************************************
- 3./*教材p.101*/
- #include <stdio.h>
- int * max (int *);
- main()
- {
- int x,y;
- y=max(&x);
- printf("%d/n",y);
- }
- int * max (int *a)
- {
- int m,n;
- scanf("%d%d",&m,&n);
- if(m>n)
- *a=m;
- else
- *a=n;
- return *a;
- }
- /*输入两个数输出最大数*/
- **************************************************************************
- 4./*教材p.108*/
- #include <stdio.h>
- main()
- {
- int i,j,n=-1,x=0,y=0,a[30];
- for(i=0;i<=29;i++)
- {
- n+=2;
- a[i]=n;
- x++;
- if(x%10!=0)
- printf("%4d",a[i]);
- else
- {
- printf("%4d",a[i]);
- printf("/n");
- }
- }
- printf("/n");
- for(j=29;j>=-1;j--)
- {
- y++;
- if(y%10!=0)
- printf("%4d",a[j]);
- else
- {
- printf("%4d",a[j]);
- printf("/n");
- }
- }
- }
- /*给数组赋奇数,先每行10个正序输出,再每行10个逆序输出*/
- **************************************************************************
- 5./*教材p.112*/
- #include <stdio.h>
- int * sr (int *p)
- {
- int i=0;
- do
- {
- scanf("%d",p);
- i++;
- }
- while(*p>=0);
- return i;
- }
- main()
- {
- int n,a[100],j=0;
- j=sr(a);
- for(n=0;n<j;n++)
- printf("%4d",a[n]);
- }
- /*输入大于等于0的数,负数结束,并输出它们。*/
- **************************************************************************
- 6./*教材p.113*/
- #include <stdio.h>
- void gb (char *p);
- main()
- {
- int i;
- char s[10];
- for(i=0;i<10;i++)
- s[i]=getchar();
- gb(s);
- }
- void gb (char *p)
- {
- int i;
- for(i=4;i<10;i++)
- *(p+i)='*';
- for(i=0;i<10;i++)
- printf("%c",p[i]);
- printf("/n");
- }
- /*对有10个元素的字符型数组,从下标4开始,全部变为"*",其他不变.*/
- **************************************************************************
- 7./*教材p.117*/
- #include <stdio.h>
- #define M 8
- void dx ( int * );
- main()
- {
- int a[M]={10,20,30,40,50,60,70,80};
- dx(a);
- }
- void dx ( int *a)
- {
- int i,j,t,n;
- for(i=0;i<M-1;i++) /*处理好i和j初值与上界能使算法复杂度变小*/
- for(j=i+1;j<M;j++)
- if(a[i]<a[j])
- {
- t=a[i];
- a[i]=a[j];
- a[j]=t;
- }
- for(n=0;n<M;n++)
- printf("%d/n",a[n]);
- }
- /*逆序输出数组a*/
- /*此题应用冒泡排序,不能用首尾比较交换*/
- **************************************************************************
- 8./*教材p.118*/
- #include <stdio.h>
- #include <stdlib.h>
- #define N 50
- #define M 10
- void tjgs ( int * );
- main()
- {
- int str[N],i;
- for(i=0;i<N;i++)
- str[i]=rand()%10;
- tjgs(str);
- }
- void tjgs ( int *str)
- {
- int i,k,j=0;
- for(k=0;k<M;k++)
- {
- for(i=0;i<N;i++)
- if(str[i]==k)
- j++;
- printf("%d:%d/n",k,j);
- j=0; /*j为记数的东西,所以当次记完后应重新赋值0,以便下次记数*/
- }
- }
- /*整形数组中的值在0至9范围内,统计每个整数个数*/
- **************************************************************************
- 9./*教材p.121*/
- #include <stdio.h>
- #define N 6
- int *px (int *);
- void sc (int *,int );
- main()
- {
- int m=0,a[N]={5,7,4,2,8,6};
- m=px(a);
- sc(m,N);
- }
- int *px(int *a)
- {
- int i,k,t;
- for(k=0;k<N-1;k++) /*此处应正确给出k,i的初值及上界,才能使算法复杂度最小*/
- for(i=k+1;i<N;i++)
- if(a[k]>a[i])
- {
- t=a[k];
- a[k]=a[i];
- a[i]=t;
- }
- return a;
- }
- void sc(int a[],int n)
- {
- int i;
- for(i=0;i<n;i++)
- printf("%4d",a[i]);
- printf("/n");
- }
- /*把数组中数由小到大排列*/
- **************************************************************************
- 10./*教材p.126*/
- #include <stdio.h>
- main()
- {
- int a[2][3],i,j;
- for(i=0;i<2;i++)
- for(j=0;j<3;j++)
- scanf("%d",&a[i][j]);
- for(i=0;i<2;i++)
- {
- for(j=0;j<3;j++)
- printf("%4d",a[i][j]);
- printf("/n");
- }
- }
- /*输出:1 2 3 10 20 30 <CR>时
- 输出是否为:1 2 3
- 10 20 30*/
- **************************************************************************
- 11./*教材p.132*/
- #include <stdio.h>
- #define M 7
- #define N 7
- main()
- {
- int m,n,a[M][N];
- for(m=0;m<M;m++)
- a[m][0]=1;
- for(n=0;n<N;n++)
- a[n][n]=1;
- for(m=2;m<M;m++)
- for(n=1;n<m;n++)
- a[m][n]=a[m-1][n-1]+a[m-1][n];
- for(m=0;m<M;m++)
- {
- for(n=0;n<=m;n++)
- printf("%4d",a[m][n]);
- printf("/n");
- }
- }
- /*打印出杨辉三角:
- 1
- 1 1
- 1 2 1
- 1 3 3 1
- 1 4 6 4 1
- 1 5 10 10 5 1
- 1 6 15 20 15 6 1 */
- **************************************************************************
- 12./*教材p.133*/
- #include <stdio.h>
- #include <stdlib.h>
- #define M 10
- #define N 10
- main()
- {
- int m,n,t,k,a[M][N];
- for(m=0;m<M;m++)
- {
- for(n=0;n<N;n++)
- {
- a[m][n]=rand()%50;
- printf("%4d",a[m][n]);
- }
- printf("/n");
- }
- for(n=0;n<N;n++)
- {
- t=a[0][n];
- for(m=0;m<M;m++)
- if(a[m][n]<t)
- {
- t=a[m][n];
- k=m;
- }
- printf("min(%d):%d/n",t,k);
- }
- }
- /*找出方阵每列中最小元素,及所在行号*/
- **************************************************************************
- 13./*教材p.87*/
- #include <stdio.h>
- #include <ctype.h>
- int tj (int );
- main()
- {
- int x=0,y=0;
- y=tj(x);
- printf("y=%d/n",y);
- }
- int tj (int i)
- {
- char ch;
- do
- {
- ch=getchar();
- switch(ch)
- {
- case ' ':i++;break;
- case '/n':i++;break;
- case '/t':i++;break;
- }
- }
- while(ch!='@');
- return i+1;
- }
- /*统计文章单词数,出现'@'时结束统计*/
- **************************************************************************
- 14./*教材p.149*/
- #include <stdio.h>
- #define M 1000
- int slength();
- main()
- {
- char a[M];
- int x=0;
- scanf("%s",a);
- x=slength(a);
- printf("%d/n",x);
- }
- int slength(char *s)
- {
- int m=0;
- while(1) /*使用while的永真循环,但return使循环结束.*/
- if(*(s+m)=='/0')
- return m;
- else m++;
- }
- /*利用编写的函数,使函数返回指针所指字符串长度*/
- /*注意:输入时别越界,越界系统并不包错,且照常统计,但如果再实现其他功能,则会影响结果。输入时空格是间隔符,使程序停止统计,且空格本身不被统计。*/
- **************************************************************************
- 15./*自己出的*/
- #include <stdio.h>
- main()
- {
- char a;
- while(a!='/n')
- {
- scanf("%c",&a);
- if(a>='A'&&a<='Z')
- printf("%c",a+32);
- else
- if(a>='a'&&a<='z')
- printf("%c",a-32);
- else
- if(a!='/n') /*如果此处不加这个条件,那么输出时总有"Error!"*/
- printf("Error!");
- else
- printf("/n");
- }
- }
- /*把文中的大小写字母相互转换,不是字母时输出错误提示*/
- **************************************************************************
- 16./*自己出的*/
- #include<stdio.h>
- #define M 100
- #define N 10
- main()
- {
- int i=0,k,m,t,x,y,a[M],b[N][N],c[N]={0},E=0,F=0,J=0;
- float d[N]={0.0};
- for(k=1;k<1000;k++)
- {
- for(m=2;m<=k/2;m++)
- if(k%m==0)
- {
- t=0;
- break;
- }
- else
- t=1;
- if(t==0)
- ;
- else
- {
- if(i>=100)
- break;
- else
- a[i]=k;
- printf("a[%2d]=%3d/t",i++,k);
- }
- }
- printf("/n");
- for(i=0;i<M;i++)
- {
- printf("%d/t",a[i]);
- if((i+1)%10==0)
- printf("/n");
- }
- for(i=0;i<M;i++)
- {
- x=i/10;
- y=i%10;
- b[x][y]=a[i];
- }
- for(x=0;x<N;x++)
- {
- for(y=0;y<N;y++)
- c[x]+=b[x][y];
- d[x]=c[x]/N;
- printf("行和:c[%d]=%d/t行均数:d[%d]=%f/t",x,c[x],x,d[x]);
- }
- printf("/n");
- for(y=0;y<N;y++)
- {
- for(x=0;x<N;x++)
- c[y]+=b[x][y];
- d[y]=c[y]/N;
- printf("列和:c[%d]=%d/t列均数:d[%d]=%f/t",y,c[y],y,d[y]);
- }
- printf("/n");
- for(x=0;x<N;x++)
- E+=b[x][x];
- printf("左右对角线和:E=%d/n",E);
- for(x=0;x<N;x++)
- F+=b[x][(N-1)-x];
- printf("右左对角线和:F=%d/n/n",F);
- for(x=0;x<N;x++)
- for(y=0;y<N;y++)
- if(b[x][y]/100==3||(b[x][y]/10)%10==3||b[x][y]%10==3)
- J++;
- printf("含'3'的数字的个数:J=%d/n/n",J);
- }
- /*输出100个素数,然后按10*10矩阵输出,再输出行和、列和、行均数、列均数、对角线和;并统计含'3'的数字的个数*/
- /*素数定义:只能被一和本身整除的自然数*/
- **************************************************************************
- 17./*教材p.90题7.12*/
- #include <stdio.h>
- double fun(double,int);
- main()
- {
- double a,c;
- int b;
- scanf("%lf%d",&a,&b);
- c=fun(a,b);
- printf("(%f)%d=%f/n",a,b,c);
- }
- double fun(double x,int y)
- {
- int i;
- double z=1.0;
- for(i=1;i<=y;i++)
- z*=x;
- return z;
- }
- /*编一个函数求a的b次方*/
- **************************************************************************
- 18./*教材p.149*/
- #include <stdio.h>
- #define M 1000
- int slength(char *s);
- main()
- {
- int x;
- char a[M];
- scanf("%s",a);
- x=slength(a);
- printf("%d/n",x);
- }
- int slength(char *s)
- {
- int m=0;
- while(1)
- if(*(s+m)=='/0')
- return m;
- else
- m++;
- }
- /*编写函数,使函数返回指针所指字符串长度。*/
- **************************************************************************
- 19./*教材p.149*/
- #include <stdio.h>
- #define M 1000
- void scopy(char *s,char *t);
- main()
- {
- char a[M],b[M-1];
- scanf("%s",b);
- scopy(a,b);
- printf("%s/n",a);
- }
- void scopy(char *s,char *t)
- {
- int i,n=0;
- while(t[n]!='/0') /*只要累计寻找或计数,那么就要用循环*/
- n++;
- for(i=0;i<n+1;i++)
- {
- s[i]=t[i];
- }
- }
- /*将指针t所指的字符串复制到指针s所指的存储空间中*/
- **************************************************************************
- 20./*教材p.150*/
- #include <stdio.h>
- #define M 1000
- int scomp(char *s1,char *s2);
- main()
- {
- char a[M],b[M];
- int x;
- scanf("%s%s",a,b);
- x=scomp(a,b);
- switch(x)
- {
- case 1 :printf("a>b/n");break;
- case 0 :printf("a=b/n");break;
- case -1 :printf("a<b/n");break;
- }
- }
- int scomp(char *s1,char *s2)
- {
- int i,k,n=0,m=0;
- while(s1[n]!='/0') /*因为是计数所以用循环*/
- n++;
- while(s2[m]!='/0')
- m++;
- if(m>=n)
- k=m;
- else
- k=n;
- for(i=0;i<k;i++)
- {
- if(s1[i]>s2[i])
- return 1;
- else
- if(s1[i]<s2[i])
- return -1;
- else
- continue;
- }
- return 0;
- }
- /*编写函数,进行字符串比较。*/
- **************************************************************************
- 21./*教材p.150*/
- #include <stdio.h>
- #define M 40
- #define N 61
- main()
- {
- char a[M][N];
- int i,j,m=0,x=1;
- for(i=0;i<M;i++)
- {
- for(j=0;j<N-1;j++) /*此for循环内部不可以为每个字符串记字符的个数,因为每个字符串的个数都不一样.*/
- {
- scanf("%c",&a[i][j]);
- if(a[i][j]=='/n'||a[i][j]==' '||a[i][j]=='/t')
- {
- a[i][j]='/n'; /*把空格与制表符变成切断符*/
- break;
- }
- }
- if(a[i][0]=='/n')
- break;
- m++;
- }
- for(i=0;i<m;i++)
- {
- printf("%d:",x++);
- for(j=0;a[i][j]!='/n';j++)
- printf("%c",a[i][j]);
- printf("/n");
- }
- }
- /*从终端读入若干文本行(不超过40行,每行不超过60个字符),
- 遇空行结束输入,然后将此文本左侧加上行号后输出*/
- /*当连续出现换行符,空格,制表符时,则后面输入的不起作用*/
- **************************************************************************
- 22./*教材p.150*/
- #include <stdio.h>
- #define M 40
- #define N 61
- main()
- {
- char a[M][N];
- int i,j,m=0,n=0,x=1;
- for(i=0;i<M;i++)
- {
- for(j=0;j<N-1;j++)
- {
- //scanf("%c",&a[i][j]);
- a[i][j]=getchar();
- //n++;
- //这里n没有作用,字符串长度都不一样的
- //if(a[i][j]=='/n'||a[i][j]==' '||a[i][j]=='/t')
- //字符串可以包含空字符,而且gets认为空格是字符,而%s认为空格是切断符。
- if(a[i][j]=='/n')
- break;
- }
- if(a[i][0]=='/n')
- break;
- m++;
- //必须换成串结束符,否则编译后结果错误
- a[i][j] = '/0';
- }
- for(i=0;i<m;i++) /*应除去最后一行即(i <m-1),因为最后一行是空行*/
- {
- printf("%d:",x++);
- //for(j=0;j <n-1;j++)
- //printf("%c",a[i][j]);
- printf("%s/n", a[i]);
- }
- }
- /*从终端读入若干文本行(不超过40行,每行不超过60个字符),
- 遇空行结束输入,然后将此文本左侧加上行号后输出*/
- /*这是朋友在我的错误的基础上改的,且把空格与制表符当成字符*/
- **************************************************************************
- 23./*教材p.151*/
- #include <stdio.h>
- #include <string.h>
- #define M 100
- main()
- {
- char a[M][M],*t;
- int i,m=0;
- for(i=0;i<M;i++)
- {
- scanf("%s",a[i]);
- if(*a[i]=='@')
- break;
- m++;
- }
- t=a[0];
- for(i=1;i<m;i++)
- {
- if(strcmp(t,a[i])>=0)/*因为是终于最小的比较,所以是t而不是a[0]*/
- t=a[i];
- }
- printf("The min String is:%s/n",t);
- }
- /*从输入的若干字符串(不超过100个)中找出最小的串进行输出,当字符串为@时结束输入*/
- **************************************************************************
- 24./*教材p.151*/
- #include <stdio.h>
- #include <string.h>
- #define M 100
- main()
- {
- char a[M][M],*t;
- int i,j,m=0;
- for(i=0;i<M;i++)
- {
- for(j=0;j<M;j++)
- {
- a[i][j]=getchar(); /*这样一来空格,制表符都是字符了,而不是间断符*/
- if(a[i][j]=='/n'||a[i][j]==' '||a[i][j]=='/t') /*但这一句使空格,制表符又是间断符了*/
- break;
- }
- if(a[i][0]=='/n')
- break;
- m++;
- a[i][j]='/0';
- }
- t=a[0];
- for(i=1;i<m;i++)
- {
- if(strcmp(t,a[i])>=0)/*因为是终于最小的比较,所以是t而不是a[0]*/
- t=a[i];
- }
- printf("The min String is:%s/n",t);
- }
- /*从输入的若干字符串(不超过100个)中找出最小的串进行输出。*/
- /*受2009-06-20-004(2).c中的语句启发,自己在2009-07-07-001.c的基础上改编的。*/
- /*与2009-07-07-001.c除了程序语句有区别外,结束符也有区别:*/
- /*这个不用"@"字符串结束,而用回车结束*/
- **************************************************************************
- 25./*自己出的*/
- #include <stdio.h>
- main()
- {
- int i,j,k;
- for(k=0;k<4;k++)
- {
- for(i=0;i<k;i++)
- printf(" ");
- for(j=0;j<7-2*k;j++) /*注意2与k相乘时之间应加星号*/
- printf("*");
- printf("/n");
- }
- }
- /*打印倒三角*/
- **************************************************************************
- 26./*教材p.160*/
- #include <stdio.h>
- int fun (int m)
- {
- if(m==1)
- return 1;
- else
- return m*fun(m-1);
- }
- main()
- {
- int m,s;
- scanf("%d",&m);
- if(m<0)
- printf("Error!/n");
- else
- if(m==0)
- printf("(%d!)=1/n",m);
- else
- {
- s=fun(m);
- printf("(%d!)=%d/n",m,s);
- }
- }
- /*利用函数的递归调用,求一个数的阶乘*/
- **************************************************************************
- 27./*教材p.162*/
- #include <stdio.h>
- #include <math.h>
- double fun(double a,double x0)
- {
- double x1;
- x1=(x0+a/x0)/2.0;
- while(fabs(x1-x0)>1e-6)
- return fun(a,x1); /*若此处不加return则下面return x1返回的始终是x1的第一次的值。而不是最终求的x1的值。最终求的x1的值,确实求出来了在临时内存中,但没被返回。*/
- return x1;
- }
- main()
- {
- double a,x,x0=1.0;
- scanf("%lf",&a);
- if(a<0)
- printf("Error!/n");
- else
- x=fun(a,x0);
- printf("%lf/n",x);
- }
- /*根据此求平方根的迭代公式:x1=((x0+(a/x0))/2)求某数a的平方根*/
- **************************************************************************
- 28./*教材p.162*/
- #include <stdio.h>
- #include <math.h>
- double fun(double a,double x0)
- {
- double x1;
- x1=(x0+a/x0)/2.0;
- if(fabs(x1-x0)>1e-6)
- return fun(a,x1); /*若此处不加return则下面return x1返回的始终是x1的第一次的值。而不是最终求的x1的值。最终求的x1的值,确实求出来了在临时内存中,但没被返回。*/
- else
- return x1;
- }
- main()
- {
- double a,x,x0=1.0;
- scanf("%lf",&a);
- if(a<0)
- printf("Error!/n");
- else
- x=fun(a,x0);
- printf("%lf/n",x);
- }
- /*根据此求平方根的迭代公式:x1=((x0+(a/x0))/2)求某数a的平方根*/
- /*教材的原答案*/
- **************************************************************************
以上程序均为自己写的,属于原创!只是题目是书上的题。