C语言课后习题解

来源:互联网 发布:python暴力破解zip 编辑:程序博客网 时间:2024/05/17 23:14

//1.6 编写一个程序,输入abc三个值,输出其中最大值.  

#include <stdio.h>

void main ()

{

int a,b,c,max;

printf ("Please input a,b,c:");

scanf ("%d,%d,%d",&a,&b,&c);

max=a;

if (b>max)

max=b;

if (c>max)

max=c;

printf ("%d\n",max);

}

/*

48设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积.

scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字.请编程序.  

*/

#include <stdio.h>

void main()

{

double r,h,Cy,Sy,Sq,Vq,Vz;

r=1.5;

h=3;

Cy=2*3.14*r;

Sy=3.14*r*r;

Sq=4*Sy;

    Vq=(4*3.14*r*r*r)/3;

Vz=Sq*h;

printf ("\nCy=%.2lf\nSy=%.2lf\nSq=%.2lf\nVq=%.2lf\nVz=%.2lf",Cy,Sy,Sq,Vq,Vz);

}

/*

49输入一个华氏温度,要求输出摄氏温度.公式为  

c=5(F-32)/9  

输出要求有文字说明,取位2小数.  

*/

#include <stdio.h>

void main ()

{

    double C,F;

printf("请输入华氏温度:");

scanf ("%lf",&F);

C=5*(F-32)/9;

printf ("输出摄氏温度:%.2lf",C);

}

/*

5.6 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E.90分以上为’A,80~90分为’B,

70~79分为’C,60分以下为’D.  

*/

#include <stdio.h>

void main ()

{

float score;

char grade;

printf("请输入一个分数:\n");

scanf("%f",&score);

if (score<=0||score>=100)

{

printf("请重新输入!");

      scanf ("%f",&score);

}

switch (int(score/10))

{

case 9: grade='A';break;

case 8: grade='B';break;

case 7: grade='C';break;

case 6: grade='D';break;

case 5: grade='E';break;

case 4:

case 3:

case 2:

case 1:

case 0: grade='E';break;

}

printf("成绩是%5.1f,相应的等级是%c.\n",score,grade);

}  

/*5.7 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字.

例如原数为321,应输出123.  

*/

#include <stdio.h>

main ()

{

int indiv,ten,hundred,thousant,ten_thousant,place;

    long int i;

    printf("请输入一个数(0~9999)");

scanf("%ld",&i);

if (i>9999)  place=5;

    else if (i>999)  place=4;

    else if (i>99)   place=3;

    else if (i>9)    place=2;

else   place=1;

printf("place=%d\n",place);

ten_thousant=i/10000;

thousant=i/1000%10;

hundred=i/100%10;

    ten=i%100/10;

indiv=i%10;

switch (place)

{

case 5:

        printf("%d,%d,%d,%d,%d\n",ten_thousant,thousant,hundred,ten,indiv);

printf("反序列为:\n");

printf("%d,%d,%d,%d,%d\n",indiv,ten,hundred,thousant,ten_thousant);

break;

    case 4:

        printf("%d,%d,%d,%d\n",thousant,hundred,ten,indiv);

printf("反序列为:\n");

printf("%d,%d,%d,%d\n",indiv,ten,hundred,thousant);

break;

case 3:

        printf("%d,%d,%d\n",hundred,ten,indiv);

printf("反序列为:\n");

printf("%d,%d,%d\n",indiv,ten,hundred);

break;

    case 2:

        printf("%d,%d\n",ten,indiv);

printf("反序列为:\n");

printf("%d,%d\n",indiv,ten);

break;

    case 1:

        printf("%d\n",indiv);

printf("反序列为:\n");

printf("%d\n",indiv);

break;

}

}

/*

5.8 企业发放的奖金根据利润提成.利润I低于或等于10万元时,奖金可提成10% ;

利润高于10万元,低于20万元(100000<I200000)时,其中10万元按10%提成,高于10万元的部分,可提成7.5% ;

200000<I400000,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;

400000<I600000,高于40万元的部分按3%提成;600000I1000000,高于60万的部分按1.5%提成;

I>1000000,超过100万元的部分按1%提成.从键盘输入当月利润I,求应发放奖金总数.

要求:(1)if语句编程序;(2)switch语句编程序.  

*/

#include <stdio.h>

void main ()

{

long i;

double bonus,bon1,bon2,bon4,bon6,bon10;

    bon1=100000*0.1;              //利润为10万元时所发放的奖金

    bon2=bon1+100000*0.075;         //利润为20万元时所发放的奖金

    bon4=bon2+200000*0.05;       //利润为40万元时所发放的奖金

    bon6=bon4+200000*0.03;          //利润为60万元时所发放的奖金

    bon10=bon6+400000*0.015;       //利润为100万元时所发放的奖金

printf("请输入当月利润i");

scanf("%ld",&i);

if (i<=100000)

bonus=bon1*0.1;                    //利润在10万元以内按0.1提成奖金

    else if (i<=200000)

bonus=bon1+(i-100000)*0.75;         //利润在20万元以内按0.075提成奖金

else if (i<=400000)

bonus=bon2+(i-200000)*0.05;        //利润在40万元以内按0.05提成奖金

else if (i<=600000) 

bonus=bon4+(i-400000)*0.03;        //利润在60万元以内按0.03提成奖金

    else if (i<=1000000)

bonus=bon6+(i-600000)*0.015;       //利润在100万元以内按0.015提成奖金

else if(i>1000000)

bonus=bon10+(i-1000000)*0.01;     //利润在100万元以上按0.01提成奖金

printf("bonus=%10.2f",bonus);

getchar();

getchar();

}

方法2

#include <stdio.h>

void main ()

{

int branch;

long i;

double  bonus,bon1,bon2,bon4,bon6,bon10;

bon1=100000*0.1;

bon2=bon1+100000*0.075;

bon4=bon2+200000*0.05;

bon6=bon4+200000*0.03;

bon10=bon6+400000*0.015;

printf("输入当月利润i\n");

scanf("%ld",&i);

branch=(i/100000);

switch (branch)

case 0:

bonus=i*0.1;

break;                         //利润在10万元以内时的奖金

case 1:

bonus=bon1+(i-100000)*0.075; 

break;                         //利润在10万元到20万元之间时的奖金

case 2:

case 3:

bonus=bon2+(i-200000)*0.05; 

break;                         //利润在20万元到40万元之间时的奖金

case 4:

case 5:

bonus=bon4+(i-200000)*0.03; 

break;                         //利润在40万元到60万元之间时的奖金

case 6:

case 7:

case 8:

case 9:

bonus=bon6+(i-400000)*0.015; 

break;                         //利润在60万元到100万元之间时的奖金

case 10:

bonus=bon10+(i-1000000)*0.01;       

break;                       //利润在100万元以上时的奖金

default:

printf("-------------%d----------\n",branch);

}

printf("奖金为: %.2f",bonus);

getchar();

getchar();

}

/*

5.10  4个圆塔,圆心分别为(2,2)(-2,2)(2,-2)(-2,-2),圆半径为1.4个塔的高度分别为10m.

塔以外无建筑物.今输入任一点的坐标,求该点的建筑高度(塔外的高度为零). 

*/

#include <stdio.h>

void main ()

{

int h=10;

float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;

printf("请输入坐标(x,y:");

scanf("%f,%f",&x,&y);

    d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);

d2=(x+x2)*(x+x2)+(y-y2)*(y-y2);

d3=(x+x3)*(x+x3)+(y+y3)*(y+y3);

d4=(x-x4)*(x-x4)+(y+y4)*(y+y4);

if (d1>1&&d2>1&&d3>1&&d4>1)   h=0;

else h=10;

printf("建筑物的高度为%d\n",h);

}

//6.1输入两个正整数mn,求其最大公约数和最小公倍数.  

#include <stdio.h>

void main ()

{

int m,n,m_cup,n_cup,rest;

printf("Please input two integer:\n");

scanf("%d,%d",&m,&n);

if (m>0&&n>0)

{

m_cup=m;

n_cup=n;

rest=m_cup%n_cup;

if (rest!=0)

{

m_cup=n_cup;

n_cup=rest;

rest=m_cup%n_cup;

}

printf ("Output greatest common divisor:%d\n",n_cup);

     printf ("Output lease common multiple:%d\n",m*n/n_cup);

}

else printf ("Error!\n");

// getchar();

// getchar();

// scanf("%d",&n);

}

//6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数.  

#include <stdio.h>

void main ()

{

char c;

int letter=0,space=0,digit=0,others=0,s=0;

printf("请输入一行字符:");

scanf ("%c",&c);

while ((c=getchar())!='\n')

{

if (c>'a'&&c<'z'||c>'A'&&c<'Z')

letter++;

else if (c==' ')

space++;

else if (c>'0'&&c<'9')

digit++;

else 

        others++;

}

printf("letter=%d,space=%d,digit=%d,others=%d",letter,space,digit,others);

}

//6.4 求 ,(即求1!+2!+3!+4!+5!++20!) 

#include <stdio.h>

void main ()

{

int n,i=1;

long sum=0,s=1;  

printf ("Please input a integer:");

scanf("%d",&n);  

while(i<=n)

{

s=s*i;

sum=sum+s;

i++;

}  

printf("sum=%ld\n",sum);  

}  

//6.6打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身.

//例如:153是一个水仙花数,因为153=1^3+5^3+3^3.  

#include <stdio.h>

void main ()

{

int a,b,c,n=100;

while (n>=100&&n<1000)

{

a=n/100;

b=n%100/10;

c=n%100%10;

if (n==a*a*a+b*b*b+c*c*c)

printf("水仙花数:%5d",n);

n++;

}

}

/*

6.7一个数如果恰好等于它的因子之和,这个数就称为"完数".

例如,6的因子为123,6=1+2+3,因此6"完数".

编程序找出1000之内的所有完数,并按下面格式输出其因子:  

6itsfactorsare123  

*/

#include <stdio.h>

void main ()

{

int i,j,m,s;

for (m=6;m<10000;m++)

{

s=1;

for (i=2;i<m;i++)

    if (m%i==0)  s=s+i;

if (m-s==0)

{ printf ("%5d is fastors 1",m);   

     for (j=2;j<m;j++)

if (m%j==0)

printf ("%5d",j);

printf ("\n");

}

}

}

//6.9一球从100米高度自由下落,每次落地后返回原高度的一半,

//再落下.求它在第10次落地时共经过多少米?10次反弹多高?

#include <stdio.h>

void main()  

{

int i,n;

double h=100,s=100;  

    scanf("%d",&n);  

    for(i=1;i<=n;i++)  

{  

h*=0.5;

        if(i==1)          

continue;

s=2*(h*2)+s;

}  

    printf("h=%f,s=%f\n",h,s);  

 getchar();

 getchar();

}  

/*

6.10猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.

第二天早上又将剩下的桃子吃掉一半,又多吃一个.以后每天早上都吃了前一天剩下的一半

零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第一天共摘多少桃子.  

*/

#include <stdio.h>

void main ()

{

int i,sum=0;

    for (i=1;i<=10;i++)

{

sum=sum*2+1;

}

printf("%d\n",sum);

}

/*

6.12用迭代法求x=a^1/2)。求平方根的迭代公式为:Xn+1=1/2Xn+a/Xn

要求前后两次求出的得差的绝对小于0.00001

*/

#include <stdio.h>

#include<math.h>  

void main()  

{

float x0,x1,a;  

scanf("%f",&a);  

//x1=a/2;

x1=sqrt(a);

do  

{

x0=x1;

x1=(x0+a/x0)/2;

}  

while(fabs(x0-x1)>=0.00001);  

printf("%.3f\n",x1);  

}  

/*6.14打印以下图案  

*  

* * *  

* * * * *  

* * * * * * *  

* * * * *  

* * *  

*  

*/

#include <stdio.h>

void main ()

{

int i,j,k;  

for(i=0;i<=6;i++)  

{

if(i <= 3)

{

for(k=0;k<=2*i;k++)  

printf("*"); 

}

else

{

int  nTemp = 7-(i-3)*2;

for( k=0; k< nTemp; k++)  

printf("*"); 

}

printf("\n"); 

}  

}

/*6.14打印以下图案 

   *

  ***

 *****     

*******

 *****

  ***

   *  

*/

#include <stdio.h>

#include"math.h"  

void main()  

{

int i,j,k;  

for(i=0;i<=3;i++)  

{

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

printf(" ");  

for(k=0;k<=2*i;k++)  

printf("*");  

printf("\n");  

}  

for(i=0;i<=2;i++)  

{

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

printf(" ");  

for(k=0;k<=4-2*i;k++)  

printf("*");  

printf("\n");  

}   

}  

//7.1 用筛法求100内的素数.  

#include <stdio.h>

void main ()

{

int i,j,a[100];

for (i=2;i<=100;i++)

{

a[i]=i;

for  (j=2;j<=i;j++)

{

if (j<i)

if (a[i]%j==0)

break;

if (a[i]-j==0)

printf("%5d",a[i]);

}

}

printf ("\n");

}

//7.2用选择法对10个整数从小到大排序

#include <stdio.h>

void main ()

{

int i,j,a[10],t;

for (i=0;i<10;i++)

scanf ("%d",&a[i]);

for (j=1;j<=10;j++)

{

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

{

if (a[i]>a[i+1])

{

t=a[i];a[i]=a[i+1];a[i+1]=t;

}

}

}

for (i=0;i<10;i++)

printf("%5d\n",a[i]);

}

//7.3求一个3×3矩阵对角线元素之和.  

#include <stdio.h>

void main ()

{

int i,j,a[3][3],s1,s2;

for (i=0;i<3;i++)

for (j=0;j<3;j++)

scanf ("%d",&a[i][j]);

s1=a[0][0]+a[1][1]+a[2][2];

s2=a[0][2]+a[1][1]+a[2][0];

printf("s1=%d,s2=%d\n",s1,s2);

}

//7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中.  

#include <stdio.h>

void main ()

{

static int a[9]={2,3,4,6,8,9,12,23,34};

int i,t;

scanf ("%d",&a[9]);

for (i=9;i>0;i--)

if (a[i]<a[i-1])

{

t=a[i];a[i]=a[i-1];a[i-1]=t;

}

for (i=0;i<=9;i++)

printf("%5d",a[i]);

printf ("\n");

}

//8.2求方程的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,

//并输出结果.从主函数输入abc的值.  

#include <stdio.h>

#include <math.h>

void deltaZero (double a,double b,double c)

{

double ans=-b/(2*a);

printf ("x1=x2=%lf\n",ans);

}

void deltaLargerZero (double a,double b,double c)

{

double ans1,ans2,d;

d=b*b-4*a*c;

ans1=(-b+sqrt(d))/2*a;

ans2=(-b-sqrt(d))/2*a;

printf ("x1=%lf,x2=%lf\n",ans1,ans2);

}

void deltaLessZero (double a,double b,double c)

{

double real,imar,d;

d=b*b-4*a*c;

real=-b/2*a;

imar=sqrt(d)/2*a;

printf ("x1=%lf+%lfi,x2=%lf-%lfi\n",real,imar,real,imar);

}

void main ()

{

double a,b,c;

double d;

printf ("please input a,b,c:");

scanf ("%lf,%lf,%lf",&a,&b,&c);

    d=b*b-4*a*c;

if (d==0) deltaZero(a,b,c);

else if (d>0) deltaLargerZero(a,b,c);

else if (d<0) deltaLessZero(a,b,c);

printf ("please input a,b,c\n");

}

//8.3写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息

#include <stdio.h>

#include <math.h>

int is_prime(int m)

{

int i;

if(m==1)

{

return 0;

}

for(i=2;i<m;i++) 

{

if(m%i==0)

return 0;

}

return 1;

}

void main()    

{

int n,c;

scanf("%d",&n);  

c=is_prime(n);

if(c==1)

printf("prime\n");

else

printf("not prime\n");

}

//8.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换.

//写一个N*N的二维数组

#include <stdio.h>

#include <malloc.h>

#define N 4

void Transpose (int a[][N])

{

int i,j,t;

for (i=0;i<N;i++)

{

for (j=i;j<N;j++)

{

t=a[i][j];

a[i][j]=a[j][i];

a[j][i]=t;

}

}

}

int main ()

{

int i,j,a[N][N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

for (i=0;i<N;i++)

{

for (j=0;j<N;j++)

printf ("%5d",a[i][j]);

printf("\n");

}

    Transpose(a);

printf ("\n");

for (i=0;i<N;i++)

{

for (j=0;j<N;j++)

printf ("%5d",a[i][j]);

printf("\n");

}

// return 0;

}

//8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串.

#include <stdio.h>

#include <string.h>

#define N 10

char a[80];

int i;

void Reverse()

{

for (i=N;i>=0;i--)

printf ("%c",a[i]);

printf ("\n");

}

void main ()

{

void Reverse ();          //函数声明

printf ("请输入字符串:");

scanf("%s",&a[i]);

printf ("反转后的字符串");

Reverse ();

}

//8.6写一个函数,将两个字符串连接

#include <stdio.h>

void main()

{ char s1[80],s2[80];

  int i=0,j=0;

  puts("input two strings:");

  gets(s1);

  gets(s2);

  while(s1[i]!='\0') i++;

  while((s1[i++]=s2[j++])!='\0');

  printf("result:%s\n",s1);

  } 

//8.7写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出

 

#include <stdio.h>

void copy (char str[])

{

int i,j;

char s1[30]={0};

for (i=0,j=0;i<=29;i++)

{

if ((str[i]=='a')||(str[i]=='e')||(str[i]=='i')||(str[i]=='o')||(str[i]=='u'))

{

s1[j]=str[i];

j++;

}

}

s1[i]='\0';

puts (s1);

}

void main ()

{

void copy (char str[]);

char s[30];

gets (s);

copy (s);

}

//8.8写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格.如输入1990,应输出"1_9_9_0". 

#include <stdio.h>

#include <string.h>

void dx(char b[])

{

char c[100];

char *p=b;

int i=0;

while (*b)

{

c[i++]=*b++;

c[i++]=' ';

}

c[i--]='\0';

strcpy(p,c);

}

void main ()

{

void dx(char b[]);

char a[80];

gets(a);

dx(a);

puts(a);

}

//8.9编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,

//在主函数中输入字符串以及输出上述结果

#include <stdio.h>

#include <string.h>

int letter,digit,space,others;

void count(char str[])

{

int i;

for (i=0;str[i]!='\n';i++)

{

if ((str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'))

letter++;

else if (str[i]>='0'&&str[i]<='9')

digit++;

else if (str[i]==' ')

space++;

else 

others++;

}

}

void count(char str[]);

void main ()

{

    char text[80];

printf ("请输入一个字符串");

gets(text);

printf ("字符串为:");

strcat(text,"\n");

letter=0;

digit=0;

space=0;

others=0;

count(text);

printf ("%d字母,%d数字,%d空格,%d其他",letter,digit,space,others);

}

//8.10写一函数,输入一行字符,将此字符串中最长的单词输出

#include<stdio.h>

#include<string.h>

void longwords(char str[])

{

    int maxlen,len,i,j,src1=0,src2=0;

    maxlen=len=0;

    j=strlen(str);

    for(i=0;;i++)

    {

        while(str[i]==' ') i++;//忽略空格,直到找到单词开始

        if(i==j)

            break;

        for(src2=i;i<j;i++)//单词开始,向下找

        {

            if(str[i]==' ') //直到空格(单词结束)

            {

                len=i-src2;

                if(len>maxlen)

                {

                    maxlen=len;

                    src1=src2;

                }

                break;

            }

        }

        if(i==j)break;

        //继续循环找下一个单词

    };

    for(i=src1;str[i]!=' ';i++)

        printf("%c",str[i]);

}

void main()

{

    void longwords(char str[]);

    char str1[80];

    int i;

    printf("please input a string:\n");

    gets(str1);

    i=strlen(str1);

    //str1[i]=' ';

    //str1[i+1]='\0';

    longwords(str1);

}

//8.11 写一函数用起泡法对输入的十个数按由小到大的顺序排列.  

#include<stdio.h>

void sort(int *a,int n)

{

int i,j,t;

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

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

if(a[i]>a[i+1])

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}

}

void main()

{

int a[10];

int i,j,t;

printf("input 10 numbers:\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("\n");

sort(a,10);

printf("the sorted numbers:\n");

for(i=0;i<10;i++)

printf("%d ",a[i]);

printf("\n");

}

// 8.12 输入4个整数,找出其中最大的值。用函数的嵌套调用来处理。

#include <stdio.h>

void main ()

{

    int max4(int a,int b,int c,int d);

int a,b,c,d,max;

printf ("please enter four integers :");

scanf ("%d,%d,%d,%d",&a,&b,&c,&d);

max=max4(a,b,c,d);   // 调用max4 函数,得到4个数中的最大者

printf ("max=%d\n",max);

}

int max4(int a,int b,int c,int d)

{

     int max2(int a,int b);

 int m;

 m=max2(a,b);   //调用max2函数,得到a,b中的最大值,放在m

 m=max2(m,c); //调用max2函数,得到a,b,c中的最大值,放在m

 m=max2(m,d); //调用max2函数,得到a,b,c,d中的最大值,放在m

 return (m);

}

int max2(int a,int b)

{

     if (a>=b)

 return a;

 else 

 return b;

}

/*

8.13 5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2

     问第4个学生多少岁,他说比第3个学生大2

     问第3个学生多少岁,他说比第2个学生大2

     问第2个学生多少岁,他说比第1个学生大2

     问最后一个学生,他说是10岁。

     请问第5个学生多大?

*/

#include<stdio.h>

void main ()

{

int age (int n);

printf ("NO.5 age:%d\n",age(5));  //输出第5个学生的成绩

}

int age (int n)

{

int c;

if (n==1)

c=10;

else 

c=age(n-1)+2;

return (c);

}

// 8.14 用递归方法球n!.

#include <stdio.h>

void main ()

{

int fac (int n);

int n;

int y;

printf ("please enter an integer number:");

scanf ("%d",&n);

y=fac (n);

printf ("%d!=%d\n",n,y);

}

int fac (int n)

{

int f;

if (n<0)

printf ("n<0,data error.");

else if (n==0||n==1)

f=1;

else 

f=fac(n-1)*n;

return (f);

}

/*

8.15  Hanoi (汉诺)塔问题。

     这是一个古典数学问题,是一个递归方法解题的经典例子。问题是这样的:

 古代有一个樊塔,塔内有3个座,ABC,开始时A座上有64个盘子,盘子大小不等,

 大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允

 许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程

 中可以利用B座。要求编程序输出移动盘子的步骤。

  步骤:

     (1)An-1个盘借助C座先移到B座上;

 (2)A座上剩下的一个盘移到C座上;

 (3)n-1个盘从B座借助A座移到C座上。

*/

#include <stdio.h>

void main ()

{

void hanoi (int n,char one,char two,char three);

int m;

printf ("enter the number of disks:");

scanf ("%d",&m);

printf ("The step to move %d disks :\n",m);

hanoi (m,'A','B','C');

}

void hanoi (int n,char one,char two,char three)  

{

void move (char x,char y);

if (n==1)

move (one,three);

else 

{

hanoi (n-1,one,three,two);

move(one,three);

hanoi (n-1,two,one,three);

}

}

void move (char x,char y)

{

printf ("%c-->%c\n",x,y);

}

// 8.17 有一个一维数组score,内放10个学生成绩,求平均成绩。

#include<stdio.h>

void main ()

{

float average (float array[10]);

int i;

float score[10],aver;

     printf ("please enter 10 score :");

 for (i=0;i<10;i++)

     scanf ("%f",&score[i]);

 printf ("\n");

     aver=average (score);

 printf ("average score is %5.2f\n",aver);

}

float average (float array[10])

{

int i;

float aver,sum=array[0];

for (i=0;i<10;i++)

{

sum=sum+array[i];

}

aver=sum/10;

return (aver);

}

// 8.18 有两个班级,分别有5名和10名学生,调用一个average函数,分别求这两个班的学生的平均成绩。

#include<stdio.h>

void main ()

{

float average (float array[],int n);

float score1[5]={89,80,76,79,68};

float score2[10]={78,89,90,98,76,68,56,94,90,80};

    printf ("The average of class A is %6.2f\n",average(score1,5));

    printf ("The average of class B is %6.2f\n",average(score2,10));

}

float average (float array[],int n)

{

int i;

float aver,sum=array[0];

for (i=0;i<10;i++)

{

sum=sum+array[i];

}

aver=sum/n;

return (aver);

}

//8.19  用选择法对数组中10个整数按由小到大排序。

  

#include <stdio.h>

void main ()

{

void sort (int array[],int n);

int a[10]={0},i;

    printf ("please enter ten integers:");

for (i=0;i<10;i++)

     scanf ("%d",&a[i]);

sort (a,10);

printf ("the sorted array:\n");

for (i=0;i<10;i++)

     printf ("%5d",a[i]);

printf ("\n");

}

void sort (int array[],int n)

{

int i,j,k,t;

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

{

k=i;

for (j=i+1;j<n;j++)

{

           if (array[j]<array[k])

   {

   k=j;

   t=array[k];

   array[k]=array[i];

   array[i]=t;

   }

}   

}

}

//10.1通过指针变量访问整型变量。

#include <stdio.h>

void main ()

{

int a=100,b=10;

int *pointer_1,*pointer_2; //定义了两个指针变量pointer_1,pointer_2

pointer_1=&a;  //将变量为a的地址赋给了pointer_1

pointer_2=&b;

printf ("a=%d,b=%d\n",a,b);

printf ("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);

//输出*pointer_1,*pointer_2的值。其中“*”表示“指向”。*pointer_1表示“指针变量pointer_1    所指向的变量,也就是变量a

}

//10.2 输入ab两个整数,按先大后小的顺序输出ab.

#include <stdio.h>

void main ()

{

int *p1,*p2,*p,a,b;

printf ("Please enter two integer numbers:");

scanf ("%d,%d",&a,&b);

p1=&a;

p2=&b;

if (a<b)

{

p=p1;

p1=p2;

p2=p;

}

printf ("a=%d,b=%d\n",a,b);

printf ("max=%d,min=%d\n",*p1,*p2);

}

//10.3 题目要求同例10.2,即对输入的两个整数按大小顺序输出。现在函数处理,

//而且用指针类型的数据做函数参数。

#include<stdio.h>

void main ()

{

void swap(int *p1,int *p2);

int a,b;

int *pointer_1,*pointer_2;

printf ("please enter a and b:");

scanf ("%d,%d",&a,&b);

pointer_1=&a;

pointer_2=&b;

if (a<b)           //如果a<b,调用swap函数

swap(pointer_1,pointer_2);

printf ("max=%d,min=%d\n",a,b);

}

void swap (int *p1,int *p2)

{

     int temp;

 temp=*p1;

 *p1=*p2;

 *p2=temp;

}

//10.5 输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。

#include <stdio.h>

void main ()

{

void exchange (int *q1,int *q2,int *q3);

int a,b,c,*p1,*p2,*p3;

    printf ("please enter three numbers:");

scanf ("%d,%d,%d",&a,&b,&c);

p1=&a;

p2=&b;

p3=&c;

exchange(p1,p2,p3);

printf ("The order is:%d,%d,%d\n",a,b,c);

}

void exchange (int *q1,int *q2,int *q3)

{

void swap(int *pt1,int *pt2);

if (*q1<*q2)

swap (q1,q2);

if (*q1<*q3)

swap (q1,q3);

if (*q2<*q3)

swap (q2,q3);

}

void swap (int *pt1,int *pt2)

{

int temp;

temp=*pt1;

*pt1=*pt2;

*pt2=temp;

}

//10.6 有一个整型数组a,10个元素,要求输出数组中的全部元素。

#include <stdio.h>

void main ()

{

int a[10];

int i;

printf("please enter 10 integer numbers:");

for (i=0;i<10;i++)

scanf ("%d",&a[i]);

for (i=0;i<10;i++)

    printf ("%5d",a[i]);

printf ("\n");

}

方法二:

//通过数组名计算数组元素地址,找出元素的值。

 

#include <stdio.h>

void main ()

{

int a[10];

int *p,i;

printf ("please enter 10 integer numbers :");

for (i=0;i<10;i++)

scanf ("%d",&a[i]);

for (i=0;i<10;i++)

printf ("%5d",*(a+i));

printf ("\n");

}

方法三:

//用指针变量指向数组元素。

#include <stdio.h>

void main ()

{

int a[10];

int *p,i;

printf ("please enter 10 integer numbers :");

for (i=0;i<10;i++)

scanf ("%d",&a[i]);

for (p=a;p<(a+10);p++)

printf("%5d",*p);

printf ("\n");

}

//10.8 将数组an个整数按反序顺序存放。

#include<stdio.h>

void main ()

{

void inv(int x[],int n);

int i,a[10]={3,4,5,6,7,8,9,0,1,2};

printf("The original array:\n");

for (i=0;i<10;i++)

printf ("%5d",a[i]);

printf ("\n");

inv (a,10);

printf ("The array has been inverted:\n");

for (i=0;i<10;i++)

printf ("%5d",a[i]);

printf ("\n");

}

void inv(int x[],int n)

{

int temp,i,j,m=(n-1)/2;

for (i=0;i<=m;i++)

{

j=n-1-i;

temp=x[i];

x[i]=x[j];

x[j]=temp;

}

}

//方法二:

#include <stdio.h>

void main ()

{

void inv(int *x,int n);

int i,a[10]={3,4,5,6,7,8,9,0,1,2};

printf ("The original array :\n");

for (i=0;i<10;i++)

printf ("%5d",a[i]);

printf ("\n");

inv (a,10);

printf("The array has been inverted:\n");

    for (i=0;i<10;i++)

printf ("%5d",a[i]);

printf ("\n");

}

void inv(int *x,int n)  //形参x是指针变量

{

int *p,temp,*i,*j,m=(n-1)/2;

i=x;

j=x+n-1;

p=x+m;

for (;i<=p;i++,j--)

{

temp=*i;

*i=*j;

*j=temp;

}

}

// 10.8(3) 将数组an个整数按相反顺序存放。

//  方法三 :

#include <stdio.h>

void main ()

{

void inv (int *x,int n);

int i,arr[10]={0},*p=arr;

printf ("The array is :");

for (i=0;i<10;i++,p++)

scanf ("%d",p);

p=arr;

inv (p,10);

printf ("The array has been inverted :");

for (i=0;i<10;i++,p++)

printf ("%5d",*p);

    printf ("\n");

}

void inv (int *x,int n)

{

int *i,*j,temp,m=(n-1)/2,*p;

i=x;

j=x+n-1;

p=x+m;

for (;i<=p;i++,j--)

{

temp=*i;

*i=*j;

*j=temp;

}

}

//10.9 改写例10.8,用指针变量作实参

#include<stdio.h>

void main ()

{

void inv(int *x,int n);

int i,arr[10],*p=arr;      //指针变量指向arr[0]

printf ("The original array:\n");

for (i=0;i<10;i++,p++)

scanf ("%d",p);

    printf ("\n");

p=arr;

inv(p,10);

printf ("The array has been inverted:\n");

for (p=arr;p<arr+10;p++)

printf ("%5d",*p);

printf ("\n");

}

void inv (int *x,int n)  //定义inv 函数,形参x是指针变量

{

int *p,m,temp,*i,*j;

m=(n-1)/2;

i=x;

j=x+n-1;

p=x+m;

for (;i<=p;i++,j--)

{

temp=*i;

*i=*j;

*j=temp;

}

}

//10.11 输出二维数组的有关数据(地址和值)

#include <stdio.h>

void main ()

{

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

printf ("%5d,%5d\n",a,*a);

printf ("%5d,%5d\n",a[0],*(a+0));

printf ("%5d,%5d\n",&a[0],&a[0][0]);

printf ("%5d,%5d\n",a[1],a+1);

    printf ("%5d,%5d\n",&a[1][0],*(a+1)+0);

printf ("%5d,%5d\n",a[2],*(a+2));

printf ("%5d,%5d\n",&a[2],a+2);

printf ("%5d,%5d\n",a[1][0],*(*(a+1)+0));

printf ("%5d,%5d\n",*a[2],*(*(a+2)+0));

}

//10.12 有一个3*4的二维数组,要求用指向元素的指针变量输出二维数组个元素的值。

#include<stdio.h>

void main ()

{

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int *p;    //pint * 型指针变量

for (p=a[0];p<a[0]+12;p++)  //使p依次指向下一个元素

{

if ((p-a[0])%4==0) //输出4次后换行

printf ("\n");

printf ("%4d",*p);  //输出p指向的元素的值

}

     printf("\n");

}

// 10.13 输出二维数组任一行任一列元素的值。

#include <stdio.h>

void main ()

{

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int (*p)[4],i,j;   //指针变量p指向包含4个整型元素的一维数组

p=a;        //p指向二维数组的第0

printf ("please enter row and colum: ");

scanf ("%d,%d",&i,&j);

printf ("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));  //输出a[i][j]的值

}

// 10.14 有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。

#include <stdio.h>

void main ()

{

void average(float *p,int n);

void search (float (*p)[4],int n);

float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};

average (*score,12);

search (score,2);

}

void average (float *p,int n)   // 形参为*p ,实参为*score,score[0],

                                // 也就是&score[0][0],score[0][0]的地址

{

float *p_end;

float sum=0,aver;

p_end=p+n-1;

for (;p<=p_end;p++)

sum=sum+(*p);

aver=sum/n;

printf ("average=%5.2f\n",aver);

}

void search (float (*p)[4],int n)

{

int i;

printf ("The score of No.%d are:\n",n);

for (i=0;i<4;i++)

printf ("%5.2f  ",*(*(p+n)+i));

printf ("\n");

}

/*

10.15 有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩,

查找有一门以上课程不及格的学生,输出他们的全部课程的成绩。

*/

#include<stdio.h>

void main ()

{

void search(float (*p)[4],int n);

float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};

search(score,3);

}

void search (float (*p)[4],int n)   //形参p是指向包含4float型元素的一维数组的指针变量

{

int i,j,flag;

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

{

flag=0;

for (i=0;i<4;i++)

    if (*(*(p+j)+i)<60)    // *(*(p+j)+i)就是score[j][i]

flag=1;

if (flag==1)

{

printf ("No.%d fails,his scores are:\n",j+1);

for (i=0;i<4;i++)

printf ("%5.lf",*(*(p+j)+i));

printf ("\n");

}

}

}

// 10.16 定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。

#include <stdio.h>

void main ()

{

char string[]="I love China!";

printf ("%s\n",string);

printf ("%c\n",string[7]);

}

// 10.16 定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。

//(2)通过字符指针变量输出一个字符串。

#include <stdio.h>

void main ()

{

char *string="I love China!";

printf ("%s\n",string);

}

//10.18 将字符串a复制为字符串b,然后输出字符串b.

#include<stdio.h>

void main ()

{

char a[]="I am a student.",b[20]={0};  //定义字符数组

int i;

for (i=0;*(a+i)!='\0';i++)

*(b+i)=*(a+i);    //a[i]的值赋给b[i]

*(b+i)='\0';

printf ("string a is :%s\n",a);

printf ("string b is :");

for (i=0;b[i]!='\0';i++)

printf ("%c",b[i]);

printf ("\n");

}

//10.19 将字符串a复制为字符串b,然后输出字符串b. 用指针变量来处理这个问题

#include<stdio.h>

void main ()

{

char a[]="I am a boy.",b[20],*p1,*p2;

p1=a;

p2=b;    // p1,p2分别指向数组中的第一个元素

for(;*p1!='\0';p1++,p2++)

*p2=*p1;

*p2='\0';

printf ("string a is :%s\n",a);

printf ("string b is :%s\n",b);

}

//10.20 用函数调用实现字符串的复制。

#include <stdio.h>

void main ()

{

void copy_string(char from[],char to[]);

char a[]="I am a teacher!";

char b[]="You are a student.";

printf ("string a=%s\nstring b=%s\n",a,b);

printf ("copy string a to stringb:\n");

copy_string (a,b);

printf ("\nstring a=%s\nstring b=%s\n",a,b);

}

void copy_string (char from[],char to[])

{

int i=0;

while (from[i]!='\0')

{

to[i]=from[i];

i++;

}

to[i]='\0';

}

//10.20 用函数调用实现字符串的复制。

//(2) 用字符型指针变量作实参。

#include <stdio.h>

void main ()

{

void copy_string(char from[],char to[]);

char a[]="I am a teacher!";

char b[]="You are a student!";

char *from=a,*to=b;  //from指向a数组首元素,to指向b数组首元素

printf ("string a=%s\nstring b=%s\n",a,b);

printf ("\ncopy string a to string b:\n");

copy_string (from,to);     //实参为字符指针变量

printf("string a=%s\nstring b=%s\n",a,b);

}

void copy_string(char from[],char to[])  //形参为字符数组

{

int i=0;

while (from[i]!='\0')

{

to[i]=from[i];

i++;

}

to[i]='\0';

}

//10.20 用函数调用实现字符串的复制。

//用字符指针变量作形参和实参

#include <stdio.h>

void main ()

{

void copy_string (char *from,char *to);

char *a="I am a teacher.";  //a是 char类型指针变量 

char b[]="You are a student.";   // b是字符数组

char *p=b;      //使指针变量p指向b数组首元素

printf ("string a=%s\nstring b=%s\n",a,b);

printf ("\ncopy string a to string b:\n");

copy_string(a,p);    //调用copy_string函数,实参为指针变量

printf ("string a=%s\nstring b=%s\n",a,b);

}

void copy_string (char *from,char *to)   //定义函数,形参为字符指针变量

{

for (;*from!='\0';from++,to++)

{

     *to=*from;

}

*to='\0';

}

// 10.21. 改变指针变量的值

#include <stdio.h>

void main ()

{

char *a="I love China!";

a=a+7;

printf("%s\n",a);

}

//10.22 用函数求整数ab中的大者。

//(1) 通过函数名调用函数

 

#include<stdio.h>

void main ()

{

int max(int,int);

int a,b,c;

printf ("please enter a and b:");

scanf ("%d,%d",&a,&b);

c=max(a,b);

printf ("a=%d\nb=%d\nmax=%d\n",a,b,c);

}

int max(int x,int y)

{

int z;

if (x>y)

z=x;

else 

z=y;

return (z);

}

////10.22 用函数求整数ab中的大者。

//(2)通过指针变量访问它所指向的函数

#include <stdio.h>

void main ()

{

int max(int,int);

int (*p)(int,int);   //定义指向函数的指针变量p

int a,b,c;

p=max;      //使p指向max函数

printf ("please enter a and b:");

scanf ("%d,%d",&a,&b);

c=(*p)(a,b);         //通过指针变量调用max函数

printf ("a=%d\nb=%d\nmax=%d\n",a,b,c);

}

int max(int x,int y)

{

int z;

if (x>y)

z=x;

else 

z=y;

return (z);

}

 

/*

       定义和使用指向函数的指针变量:

10.23 输入两个整数,然后让用户选择12,选1时调用max函数,

输出二者中的大数,选2是调用min函数,输出二者中的小数。

*/

#include <stdio.h>

void main ()

{

int max(int,int);

int min(int x,int y);

int (*p)(int,int);   // 定义指向函数的指针

int a,b,c,n;

printf ("please enter a and b:");

scanf ("%d,%d",&a,&b);

printf ("please choose 1 or 2:");

scanf ("%d",&n);

if (n==1)  p=max;    //如输入1,使p指向max函数

else if (n==2) p=min;//如输入2,使p指向min函数

c=(*p)(a,b);           //调用p指向的函数

printf ("a=%d,b=%d\n",a,b);

if (n==1)

printf ("max=%d\n",c);

else 

printf ("min=%d\n",c);

}

int max(int x,int y)

{

int z;

if (x>y)

z=x;

else 

z=y;

return (z);

}

int min (int x,int y)

{

int z;

if (x<y)

z=x;

else 

z=y;

return (z);

}

/*

    用指向函数的指针作函数参数

10.24  有两个整数ab,由用户输入1,23,。如输入1,程序就给出ab中的大者;

如输入2,就给出ab中的小者;输入3,则求a之和。

*/

#include<stdio.h>

void main ()

{

int fun (int x,int y,int(*p)(int,int));

int max(int,int);

int min(int,int);

int add(int,int);

int a=34,b=-21,n;

printf ("please choose 1,2 or 3 :");

scanf("%d",&n);

if (n==1)

fun (a,b,max);

else if (n==2)

fun (a,b,min);

else if (n==3)

fun (a,b,add);

}

int fun (int x,int y,int (*p)(int,int))

{

int result;

result=(*p)(x,y);

printf ("%d\n",result);

return 0;

}

int max(int x,int y)

{

int z;

if (x>y)

z=x;

else 

z=y;

printf ("max=");

return (z);

}

int min(int x,int y)

{

int z;

if (x<y)

z=x;

else 

z=y;

printf ("mim=");

return (z);

}

int add (int x,int y)

{

int z;

z=x+y;

printf ("sum=");

return (z);

}

/*

     返回指针值的函数:

10.25 a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,

能输入该学生的全部呈现。用指针函数来实现。

*/

#include <stdio.h>

void main ()

{

float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

float *search (float (*pointer)[4],int n);

float *p;

int i,k;

printf ("enter the numbers of student:");

scanf ("%d",&k);

printf ("The scores of No.%d are:\n",k);

p=search(score,k);     // 调用search函数,返回score[k][0]的地址

for (i=0;i<4;i++)

printf ("%5.2f\t",*(p+i));     //输出score[k][0]~score[k][3]的值

printf ("\n");

}

float *search (float (*pointer)[4],int n)   //形参pointer是指向一维数组的指针变量

{

float *pt;

pt=*(pointer+n);   //pt的值是&score[k][0]

return (pt);    

}

/*

10.26 a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,

能输入该学生的全部呈现。用指针函数来实现。

找出其中不及格的课程的学生及其学生号。

*/

#include <stdio.h>

void main ()

{

float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

float *search(float (*pointer)[4]);

float *p;

int i,j;

for (i=0;i<3;i++)

{

p=search(score+i); //调用search函数,如有不及格返回score[i][0]的地址,否则返回NULL

if (p==*(score+i)) //如果返回的是score[i][0]的地址,表示p的值不是NULL

{

printf ("No.%d score:",i);

for (j=0;j<4;j++)

printf ("%  5.2f",*(p+j));

printf ("\n");

}

}

}

float *search (float (*pointer)[4])   //定义函数,形参pointer是指向一维数组的指针变量

{

int i=0;

float *pt;

pt=NULL;                      //先使pt的值为NULL

for (;i<4;i++)

if (*(*pointer+i)<60)   //如果有不及格课程,使pt指向score[i][0]

pt=*pointer;

return (pt);

}

//10.27 将若干字符串按字母顺序(由小到大)输出。

#include <stdio.h>

#include <string.h>

void main ()

{

    void sort (char *name[],int n);

void print (char *name[],int n);

char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};

// 定义指针数组,它的元素分别指向5个字符串

int n=5;

sort (name,n);    //对字符串排序的函数

print(name,n);  //输出字符串的函数

}

void sort (char *name[],int n)  //定义sort函数

{

char *temp;

int i,j,k;

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

{

k=i;

for (j=i+1;j<n;j++)

{

if (strcmp(name[k],name[j])>0)

k=j;

if (k!=i)

{

temp=name[i];

name[i]=name[k];

name[k]=temp;

}

}

}

}

void print (char *name[],int n)

{

int i;

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

printf ("%s\n",name[i]);

}

// 10.28 使用指向指针数据的指针变量

#include <stdio.h>

void main ()

{

char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};

char **p;               //例如*pnum[2]的值,而num[2]的值是a[2]的地址,因此**pa[2]的值5.

int i;

for (i=0;i<5;i++)

{

p=name+i;

printf ("%s\n",*p);

}

}

//10.29有一个指针数组,其元素分别指向一个整型数组的元素,指向指针数据的指针变量,

//输出整型数组各元素的值。

#include<stdio.h>

void main ()

{

int a[5]={1,3,5,7,9};

int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

int **p,i;

p=num;

for (i=0;i<5;i++)

{

printf ("%5d",**p);

p++;

}

printf ("\n");

}

//10.30写一函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

#include<stdio.h>

int longs(char *s)

{

 int i,n=0;

 for(i=0;*(s+i)!='\0';i++)

  n++;

 return(n);

}

void main()

{

 char *s;

 char c[100];

 int num;

 s=c;

 gets(c);

 num=longs(s);//传递一个指针而不是*s

 printf("%d",num);//应该是个整数

}

1. //  10.31有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成另一个字符串。

#include <stdio.h>

void main ()

   int m;

   char  a[100];

   printf("Please input a string of char:");

   scanf("%s",a);

   printf("Input the m:");

   scanf("%d",&m);

   printf("%s\n",a+m-1);

//10.31 n个整数,使前面各数顺序向后移m个位置,最后m个数变成m个数。

//写一函数实现以上功能,在函数中输入n个整数和输出调整后的n个数。

#include <stdio.h>

void main() 

{   

void change (int a[10],int m,int n);

    int i,m,n,a[10]={1,2,3,4,5,6,7,8,9,10};

printf ("please enter n:");

scanf ("%d",&n);

printf ("please enter m:");

scanf ("%d",&m);

change (a,m,n);

for (i=0;i<10;i++)

{

printf ("%5d",a[i]);

}

}

void change (int a[10],int m,int n)

{

int temp,i,j;

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

{

if (i<=n-m)

{

j=i+m;

}

if (i>n-m)

{

j=i+m-n;

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

}

/*
10.32   将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
       (顺序为从左到右,从上到下依次从小到大存放)。
      写一函数实现之,用main函数调用
*/


#include <stdio.h>
#define M    5 //矩阵阶数(为奇数,如357等,可以自行更改)


/*定义函数:对xx列的正方形二维数组a进行操作,存放最大数和4个最小数*/
void    reload(int a[][M],int x)
{
   int *max,*m1,*m2,*m3,*m4,t,*tp;
  
   int i,j;
   max=m1=(*a);
   m2=*a+1;
   m3=*(a+1);
   m4=*(a+1)+1;//设置指针初始位置

   //以下是让4个指针指向的元素由小到大有序
   if(*m1>*m2){tp=m1;m1=m2;m2=tp;}
   if(*m1>*m3){tp=m1;m1=m3;m3=tp;}
   if(*m1>*m4){tp=m1;m1=m4;m4=tp;}
   if(*m2>*m3){tp=m2;m2=m3;m3=tp;}
   if(*m2>*m4){tp=m2;m2=m4;m4=tp;}
   if(*m3>*m4){tp=m3;m3=m4;m4=tp;}
   //-------------------------------

//下面找出最大的和4个最小的数
   for(i=0;i<x;i++)
      for(j=0;j<x;j++)
     {
            if(*(*(a+i)+j)>*max)max=(*(a+i)+j);
          if(!(i<=1&&j<=1))
            {
                   if(*(*(a+i)+j)<=*m1)    {m4=m3;m3=m2;m2=m1;m1=(*(a+i)+j);}
                     else if(*(*(a+i)+j)<=*m2)    {m4=m3;m3=m2;m2=(*(a+i)+j);}
                          else if(*(*(a+i)+j)<=*m3)   {m4=m3;m3=(*(a+i)+j);}
                                    else if(*(*(a+i)+j)<=*m4)   m4=(*(a+i)+j);
             }
       }  
   //-------------------------

    //下面按位置要求存放(安置)
  
     if(*a==m2){   t=*m1;*m1=*m2;*m2=t;   tp=m1;m1=m2;m2=tp; }
     else if(*a==m3){   t=*m1;*m1=*m3;*m3=t;   tp=m1;m1=m3;m3=tp; }
         else if(*a==m4){   t=*m1;*m1=*m4;*m4=t;   tp=m1;m1=m4;m4=tp; }
                 else if(*a==max){   t=*m1;*m1=*max;*max=t;   tp=m1;m1=max;max=tp; }
                        else {t=**a;**a=*m1;*m1=t;}    //以上选择语句安置最小元素(m1指向的元素)
      
if(*a+x-1==m3){   t=*m2;*m2=*m3;*m3=t;   tp=m2;m2=m3;m3=tp; }
else if(*a+x-1==m4){   t=*m2;*m2=*m4;*m4=t;   tp=m2;m2=m4;m4=tp; }
        else if(*a+x-1==max){   t=*m2;*m2=*max;*max=t;   tp=m2;m2=max;max=tp; }
               else {t=*(*a+x-1);*(*a+x-1)=*m2;*m2=t;}   //以上选择语句安置m2指向的元素

     if(*(a+x-1)==m4){   t=*m3;*m3=*m4;*m4=t;   tp=m3;m3=m4;m4=tp; }
   else if(*(a+x-1)==max){   t=*m3;*m3=*max;*max=t;   tp=m3;m3=max;max=tp; }
           else {t=**(a+x-1);**(a+x-1)=*m3;*m3=t;}   //以上选择语句安置m3指向的元素

if(*(a+x-1)+x-1==max){   t=*m4;*m4=*max;*max=t;   tp=m4;m4=max;max=tp; }
else {t=*(*(a+x-1)+x-1);*(*(a+x-1)+x-1)=*m4;*m4=t;}   //以上选择语句安置m4指向的元素
  
{t=*(*(a+x/2)+x/2);*(*(a+x/2)+x/2)=*max;*max=t;}      //安置max指向的元素(最大元素)
    //------------------------

}

//存放安置处理函数结束---------------------------------


/*定义函数:输出二维矩阵a, xx*/
void prt(int a[][M],int x)
{
int i,j;
printf("输出%d%d列矩阵:\n",x,x);

     for(i=0;i<x;i++)
    {
        for(j=0;j<x;j++)
               printf("%6d", *(*(a+i)+j) );
         printf("\n");
    }
}


/*定义函数:输入二维矩阵a, xx*/
void getin(int a[][M],int x)
{
int i,j;
     printf("请输入%d%d列矩阵(%d个整数):\n",x,x,x*x);
for(i=0;i<x;i++)
   for(j=0;j<x;j++)
        scanf("%d",(*(a+i)+j) );      

}

void main()
{
int juzhen[M][M];
getin(juzhen,M);    //输入矩阵
printf("处理前");
prt(juzhen,M);      //处理前输出
reload(juzhen,M);   //找最大最小数,并按要求存放
printf("处理后");
prt(juzhen,M);      //处理后输出
}


// 12.1 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,

//然后输出它的这个学生的信息

#include <stdio.h>

void main ()

{

struct Student

{

long int num;

char name[20];

    char sex;

char addr[20];

}

a={10101,"Li Lin",'M',"123 Beijing Road"};

printf ("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr);

}

//12.2输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。

#include<stdio.h>

void main ()

{

struct Student

{

int num;

char name[20];

float score;

}

student1,student2;   // 定义两个结构体变量student1student2

scanf ("%d%s%f",&student1.num,student1.name,&student1.score);

    scanf ("%d%s%f",&student2.num,student2.name,&student2.score);

    printf ("The higher score is:\n");

if (student1.score>student2.score)

printf ("%d %s %6.2f\n",student1.num,student1.name,student1.score);

else if (student1.score<student2.score)

    printf ("%d %s %6.2f\n",student2.num,student2.name,student2.score);

else 

{

     printf ("%d %s %6.2f\n",student1.num,student1.name,student1.score);

         printf ("%d %s %6.2f\n",student2.num,student2.name,student2.score);

}

}

//12.3  3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,

// 最后输出各人得票结果。

#include <stdio.h>

#include <string.h>

struct Person

{

char name[20];

int count;

}

leader[3]={"Li",0,"Zhang",0,"Sun",0};

void main ()

{

int i,j;

char leader_name[20];   //定义字符数组

for (i=0;i<=10;i++)

{

scanf ("%s",leader_name);

for (j=0;j<3;j++)

if (strcmp(leader_name,leader[j].name)==0)

leader[j].count++;

}

printf ("Result:\n");

for (i=0;i<3;i++)

printf ("%5s:%d\n",leader[i].name,leader[i].count);

}

// 12.4 n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

#include <stdio.h>

struct Student

{

int num;

char name[20];

float score;

};

void main ()

{

struct Student stu[5]={{10101,"Zhang",78},{10103,"Wang",89},{10106,"Li",86},

{10108,"Ling",78},{10110,"Sun",100}};

struct Student temp;

const int n=5;     // 定义常变量n

int i,j,k;

printf ("The order is :\n");

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

{

k=i;

for (j=i+1;j<n;j++)

{

if (stu[j].score>stu[k].score)

k=j;

temp=stu[k];

stu[k]=stu[i];

stu[i]=temp;

}

}

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

printf ("%6d %8s %6.2f \n",stu[i].num,stu[i].name,stu[i].score);

printf ("\n");

}

// 12.5 通过指向结构体变量的指针变量输出结构体变量中成员的信息。

#include <stdio.h>

#include <string.h>

void main ()

{

      struct Student

  {

  long num;

  char name[20];

  char sex;

  float score;

  };

  struct Student stu_1;    // 定义struct Student 类型的变量stu_1

  struct Student *p;      //定义指向struct Student 类型数据的指针变量p

  p=&stu_1;                //p指向stu_1

  stu_1.num=10101;         //对结构体变量的成员赋值

  strcpy (stu_1.name,"Li Lin");   //用字符串复制函数stu_1.name赋值

      stu_1.sex='M';

  stu_1.score=89.5;

  printf ("No.: %ld\n name: %s\n sex:%c\n score:%5.1f\n",

              stu_1.num,stu_1.name,stu_1.sex,stu_1.score);

      printf ("\n No. :%ld\n name:%s\n sex:%c\n score:%5.1f\n",

          (*p).num,(*p).name,(*p).sex,(*p).score);

}

// 12.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。

#include <stdio.h>

struct Student

{

int num;

char name[20];

char sex;

int age;

};

struct Student stu[3]={{10101,"Li Lin",'M',18},{10102,"Zhang Fang",'M',19},

{10104,"Wang Min",'F',20}};  //定义结构体数组并初始化

void main ()

{

struct Student *p;          //定义指向struct Student 结构体变量的指针变量

printf ("No. name                   sex age\n");

for (p=stu;p<stu+3;p++)

printf ("%5d %20s %2c %4d\n",p->num,p->name,p->sex,p->age);

}

/*

用结构体变量和结构体变量的指针作函数参数。

12.7  有 个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩

  最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)

*/

#include<stdio.h>

#define N 3

struct Student

{

int num;

char name[20];

float score[3];

float aver;

};

int main ()

{

void input (struct Student stu[]);

struct Student max (struct Student stu[]);

void print (struct Student stud);

struct Student stu[N],*p=stu;  // 定义结构体数组和指针

input(p); 

print(max(p));

return 0;

}

void input (struct Student stu[])

{

     int i;

 printf ("请输入各学生的信息:学号、姓名、三门课成绩:\n");

 for (i=0;i<N;i++)

 {

 scanf ("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],

 &stu[i].score[1],&stu[i].score[2]);

 stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;

 }

}

struct Student max (struct Student stu[])

{

     int i,m=0;             // m存放成绩最高的学生在数组中的序号

 for (i=0;i<N;i++)

 if (stu[i].aver>stu[m].aver) m=i;  //找出平均成绩最高的学生在数组中的序号

 return stu[m];

}

void print (struct Student stud)

{

     printf ("\n成绩最高的学生是:\n");

 printf ("学号:%d\n 姓名:%s\n 三门课成绩:%5.1f, %5.1f,%5.1f\n平均成绩:%6.2f\n",

 stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);

}

/* 

   建立简单的静态链表

   12.8 建立一个简单的静态链表,它由3个学生数据的结点组成,要求输出个结点中的数据。

*/

#include<stdio.h>

struct Student 

{

int num;

float score;

struct Student *next;

};

void main ()

{

struct Student a,b,c,*head,*p;  //定义3个结构体变量a,b,c 作为链表的结点

a.num=10101;a.score=89.5;    //对结点anumscore 成员赋值

    b.num=10102;b.score=90;

c.num=10103;c.score=85;

head=&a;

a.next=&b;

b.next=&c;

c.next=NULL;

p=head;

do

{

printf ("%ld %5.1f\n",p->num,p->score);  // 输出p指向的结点的数据

p=p->next;   // 使p指向下一结点

} while (p!=NULL);

}

/*

建立动态链表

12.9 写一函数建立一个有3名学生数据的单向动态链表。

*/

#include<stdio.h>

#include <stdlib.h>

#define LEN sizeof (struct Student)

struct Student

{

long num;

float score;

struct Student *next;

};

int n;  //全局变量

struct Student *creat (void)  //定义函数,此函数返回一个返回链表头的指针

{

struct Student *head;

struct Student *p1,*p2;

n=0;

p1=p2=(struct Student*)malloc (LEN);  //开辟一个新单元

scanf ("%ld,%f",&p1->num,&p1->score); //输入第一个学生的学号和成绩

head=NULL;

while (p1->num!=0)

{

n=n+1;

if (n==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(struct Student *)malloc(LEN);   //开辟动态存储区,把起始地址赋给p1

scanf ("%ld,%f",&p1->num,&p1->score);  //输入其他学生的学号和成绩

}

p2->next=NULL;

return(head);

}

void main ()

{

struct Student *pt;

pt=creat();  //函数返回链表第一个结点的地址

printf ("\n num:%ld\n score:%5.1f\n",pt->num,pt->score);  //输出第1个结点的成员值

}

原创粉丝点击