1 顺序结构

1、编程在屏幕上输出三行信息,本人所在省市名称、身份证号和姓名。

#include<stdio.h>

int main()

{

printf("所在市:湖北黄石\n");    

printf("姓名:张三\n");

printf("身份证号:420203200004293471\n");

return 0;

}

2、从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。

#include<stdio.h>

int main()

{

        float a,b;

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

        printf("两数之和为:%.2f\n",a+b);

        printf("两数之差为:%.2f\n",a-b);

        printf("两数之积为:%.2f\n",a*b);

return 0;

}

3、编写程序,输入一个三位数的整数,请分离出个位,十位,百位,并逆序输出。

#include  <stdio.h>

main()

{

   int  x , b0, b1, b2;

    printf("请输入一个三位数的整数:");

    scanf("%d",&x);

    b0 = x % 10;

    x  = x / 10;

    b1 = x % 10;

    x  = x / 10;                                 

    b2 = x % 10;                 

    printf("b0=%d, b1=%d, b2=%d\n", b0, b1, b2);

}

4、设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。

#include<stdio.h>

#include<math.h>

int main()

{

        int n,capital;

        float rate,deposit;

        printf("请输入年利率:");

        scanf("%f",&rate);

        printf("请输入存款期:");

        scanf("%d",&n);

        printf("请输入本金:");

        scanf("%d",&capital);

        deposit=capital*pow(1+rate,n);

        printf("%d年本利之和:",n);

        printf("%.2f\n",deposit);

        return 0;

}

5、编写一个程序,求出给定半径r和高h的圆柱体和圆锥体的表面积和体积,并且输出计算结果。r和h的值由用户输入。

#include<stdio.h>

#include<math.h>

int main()

{

        //double const PI = acos(double(-1));

        double PI = 3.1415926;

        double r,h;

        scanf("%lf %lf",&r,&h);

        printf("圆柱体面积体积为:");

        printf("S:%.2f V:%.2f\n",2.0*PI*r*h+2.0*PI*r*r,PI*r*r*h);

        printf("圆锥体面积体积为:");

        printf("S:%.2f V:%.2f\n",PI*r*sqrt(r*r+h*h)+PI*r*r,PI*r*r*h/3);

        return 0;

}

6、由键盘输入1个字母,输出其ASCII码值。

#include<stdio.h>

void main(){

        char ch;

        scanf("%c",&ch);//输入

        printf("%d\n",ch);//转换

}

7、编程从键盘输入一个小写字符,将其转换为大写字符显示并显示出它的十进制,十六进制的ASCII码。

#include<stdio.h>

void main()

{

        char ch;

        printf("请输入一个小写字母:");

        scanf("%c",&ch);//输入

        printf("该字母的大写字母为:");

        printf("%c\n",ch-32);//转换

        printf("该大写字母的十进制ASCII码为:");

        printf("%d\n",ch-32);//转换

        printf("该大写字母的十六进制ASCII码为:");

        printf("%x\n",ch-32);//转换

}

8、已知三角形的三边长,编程求三角形的面积。

解题思路:假设给定的三个边符合构成三角形的条件,求三角形面积的公式为:

#include <stdio.h>

#include <math.h>

int main ( )

 {

   double a,b,c,s,area;                       // 定义各变量,均为double

   printf("please input a,b,c:\n");               //提示用户输入

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

   s=(a+b+c)/2;                                   // 计算s

   area=sqrt(s*(s-a)*(s-b)*(s-c));            // 计算area

   printf("a=%f\tb=%f\t%f\n",a,b,c);          // 输出三边a,b,c的值

   printf("area=%f\n",area);                  // 输出面积area的值

   return 0;

 } 

9、已知一元二次方程的三个系数,编程求ax2+bx+c=0方程的根,系数a,b,c的值由键盘输入,假设a,b,c的值,使得 b2-4ac≥0成立。

解题思路:一元二次方程有两个实根:

#include <stdio.h>

#include<math.h>

main()

{

  float a,b,c,disc,x1,x2,p,q;

  printf("please input a,b,c:\n");               //提示用户输入

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

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

  p=-b/(2*a);

q=sqrt(disc)/(2*a);

x1=p+q;

x2=p-q;

  printf("x1=%5.2f\nx2=%5.2f\n",x1,x2);

}

2 选择结构

1、输入一个某年的纪年数(如:1981),输出该年是否闰年。

#include <stdio.h>

void main()

{

        int year;

        printf("请输入年:");

        scanf("%d",&year);

        //闰年的判定标准:能被4整除但不能被100整除,或者能被400整除

        if(year%4==0 && year%100!=0 || year%400==0)

                 printf("%d年是闰年\n",year);

        else

                 printf("%d不是闰年!\n",year);

}

2、 给一个不多于5位的正整教,要求输出它是几位数。

#include<stdio.h>

void main()

{

        int number;

        printf("请输入一个不多于5位的正整教:");

        scanf("%d",&number);

        //根据取值范围判断一个正整数位数,如3位数取值范围:100-999

        if(number>=10000)

                 printf("%d是五位数\n",number);

        else if(number>=1000)

                 printf("%d是四位数\n",number);

        else if(number>=100)

                 printf("%d是三位数\n",number);

        else if(number>=10)

                 printf("%d是二位数\n",number);

        else

                 printf("%d是一位数\n",number);

}

3输入一个字符,判断该字符是否为大写英文字母,如果是输出其对应的小写字母。

3、输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出"space";如果不是上述情况,输出"other"

#include <stdio.h>

void main()

{

        char ch;

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

        scanf("%c",&ch);

        //英文字母大小写的判定标准及其转换,大写变小写ch+32

        if(ch>='A' && ch<='Z')

                 printf("是大写英文字母,其小写为:%c\n",ch+32);

        else

                 printf("不是大写英文字母!\n");

}

4输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第6个小写字母。所谓循环排序,是指a,b,c,……,x,y,z排成一个圆圈,即z后面是a。

解法一:

#include <stdio.h>

void main()

{

        char ch;

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

        scanf("%c",&ch);

        //循环+t算法:最后t个字母变换ch+t-26,前面的字母变换ch+t

        if(ch>='a' && ch<='z'-6)

                 printf("是小写英文字母,循环加6:%c\n",ch+6);

        else if(ch>'z'-6 && ch<='z')

                 printf("是小写英文字母,循环加6:%c\n",ch-26+6);

        else printf("不是小写字母!\n");

}

解法二:

#include<stdio.h>

#include<stdlib.h>

void main()

{

        char ch;

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

        scanf("%c",&ch);

        if(ch>='a'&&ch<='z')

                 printf("该字母为小写字母,循环加6%c\n",(ch-’a’+6)%26+’a’);

        else

                 printf("该字母不是小写字母\n");

        system("pause");

}

5有一函数:

 

编写一程序,用嵌套的if语句实现要求输入x的值,输出y的值。

#include<stdio.h>

#include<math.h>

int main()

{

        float x;

        printf("输入x的值\n");

        scanf("%f",&x);

        if(x>1)

                 printf("y=%.2f\n",exp(sqrt(x))-1);

        else

        {

if(x<-1)

        printf("y=%.2f\n",sin(x*x));

        else

                 printf("y=%.2f\n",fabs(x)+2);

        }

        return 0;

       

}

6、编写一个C程序,求a、b、c、d四个数中的最大者。

解法一:

void main()

{

        int a,b,c,d,max;

        printf("请输入四个数字:");

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

        max = a;

        if(b > max)

          max = b;

        if(c > max)

          max = c;

        if(d > max)

          max = d;

        printf("其中的最大值为:%d",max);

        system("pause");

}

解法二:

#include<stdio.h>

void main()

{

        int a,b,c,d,t;

        printf("请输入四个数字:");

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

        if(a > b)

        {t=a; a=b; b=t;}

        if(a > c)

        {t=a; a=c; c=t;}

        if(a > d)

        {t=a; a=d; d=t;}

        printf("其中的最小值为:%d",a);

        system("pause");

}

解法三:

#include<stdio.h>

void main()

{

        int a,b,c,d,t;

        printf("请输入四个数字:");

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

        if(a > b)

        {t=a; a=b; b=t;}

        if(b > c)

        {t=a; a=c; c=t;}

        if(c > d)

        {t=a; a=d; d=t;}

        printf("其中的最大值为:%d",d);

        system("pause");

}

7、输入4个整数,要求按由小到大顺序输出。

解法一:

#include<stdio.h>

int main()

{

        int  a,b,c,d,t;

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

        if(a>b)  {t=a;a=b;b=t;}

        if(a>c)  {t=a;a=c;c=t;}

        if(a>d)  {t=a;a=d;d=t;}

        if(b>c)  {t=b;b=c;c=t;}

        if(b>d)  {t=b;b=d;d=t;}

        if(c>d)  {t=c;c=d;d=t;}

        printf("a,b,c,d按照从小到大的顺序排列为:");

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

        system("pause");

        return 0;

}

解法二:

#include<stdio.h>

int main()

{

        int a,b,c,d,t;

        printf("请输入四个整数");

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

        if(a>b)     {               t=a;         a=b;         b=t; }

         if(b>c)   {               t=b;          b=c;         c=t;  }

        if(c>d)     {               t=c;          c=d;         d=t; }

        if(a>b)     {          t=a;          a=b;         b=t;}

    if(b>c)   {         t=b;      b=c;    c=t;  }

        if(a>b)     {               t=a;          a=b;         b=t; }

        printf("四个数按从小到大排列为%d,%d,%d,%d",a,b,c,d);

        return 0;

 }

8、编程序,输入一个百分制的成绩t后,按下式输出它的等级,用switch语句实现。85~100为“A”,80~84 为“B”,70~79为“C”,60~69 为“D”,0~59 为“E”。

#include <stdio.h>

int main()

{     

        int score;

        scanf("%d",&score);

        printf("数学课成绩为%d\n",score);

        switch(score/10)

        {

                 case 10:

                 case 9:

                 case 8: printf("这门课成绩为A等!\n");break;

                 case 7: printf("这门课成绩为B等!\n");break; 

                 case 6: printf("这门课成绩为C等!\n");break;

                 default: printf("这门课成绩为D等!\n");

        }

        return 0;

}

9、给一个不多余5位的正整数,要求如下:

1)求出它是几位数

2)分别输出每一位数字

3)按逆序输出各位数字,例如原数为321,应输出123

解答:

解法一:

#include<stdio.h>

#include<math.h>

void main()

{

long int num;

int a,b,c,d,e,place;

printf("please input a number(0--99999):\n");

scanf("%ld",&num);

if(num>=10000)

place=5;

else if(num>=1000)

place=4;

else if(num>=100)

place=3;

else if(num>=10)

place=2;

else

place=1;

printf("输入数的位数是:%d\n",place);

printf("每位数字为:");

e=num/10000;

d=(int)(num-e*10000)/1000;

c=(int)(num-e*10000-d*1000)/100;

b=(int)(num-e*10000-d*1000-c*100)/10;

a=(int)(num-e*10000-d*1000-c*100-b*10);

if(place == 5)

{

printf("%d,%d,%d,%d,%d",e,d,c,b,a);

printf("\n反序数字为:");

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

}

if(place == 4)

{

printf("%d,%d,%d,%d",d,c,b,a);

printf("\n反序数字为:");

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

}

if(place == 3)

{

        printf("%d,%d,%d",c,b,a);

printf("\n反序数字为:");

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

}

if(place == 2)

{

        printf("%d,%d",b,a);

printf("\n反序数字为:");

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

}

if(place == 1)

{

        printf("%d",a);

printf("\n反序数字为:");

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

}

system("pause");

}

解法二:

#include<stdio.h>

int main()

{

        int n,y,x1,x2,x3,x4,x5;

        printf("请输入一个不多于五位的数");

        scanf("%d",&n);

        y=n;

        x1=y%10;

        y=y/10;

        x2=y%10;

        y=y/10;

        x3=y%10;

        y=y/10;

        x4=y%10;

        y=y/10;

        x5=y%10;

        if(n>9999)

        {

                 printf("为五位数");

                 printf("个位为%d,十位为%d,百位为%d,千位为%d,万位为%d",x1,x2,x3,x4,x5);

                 printf("逆序输出为%d%d%d%d%d",x1,x2,x3,x4,x5);

        }

        else   if(n>999)

        {

                printf("为四位数");

                 printf("个位为%d,十位为%d,百位为%d,千位为%d",x1,x2,x3,x4);

                 printf("逆序输出为%d%d%d%d",x1,x2,x3,x4); 

}

        else   if(n>99)

        {

                printf("为三位数");

                 printf("个位为%d,十位为%d,百位为%d",x1,x2,x3);

                 printf("逆序输出为%d%d%d",x1,x2,x3); 

}

        else   if(n>9)

        {

                printf("为二位数");

                 printf("个位为%d,十位为%d",x1,x2);

                 printf("逆序输出为%d%d",x1,x2); 

}

        else 

        {

        printf("为一位数");

        printf("个位为%d",x1);

}

return 0;

 }

10、要求对输入的数字1~7转换成文字星期几,对其它数字不转换。例如,输入5时,程序应该输出Friday。

解答:

#include <stdio.h>

int main()

{

 int day;

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

scanf("%d",&day);

 switch(day)

 {case 0:printf("Sunday");break;

 case 1:printf("Monday");break;

 case 2:printf("Tuesday");break;

 case 3:printf("Wednesday");break;

 case 4:printf("Thurday");break;

 case 5:printf("Friday");break;

 case 6:printf("Saturday");break;

 default: printf("你输入了错误的数字");

 }

 system("pause");

return 0;

}

11、用switch语句编写一个简单的四则运算程序。

解答:

#include<stdio.h>

#include<math.h>

int main()

{

        double a,b;

        char c;

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

        switch(c)

        {

        case '+':printf("%f%c%f=%f",a,c,b,a+b);break

        case '-':printf("%f%c%f=%f",a,c,b,a-b); break

        case '*':printf("%f%c%f=%f",a,c,b,a*b); break

        case '/':

        if(b==0)

        printf("error\n");

        else

        printf("%f%c%f=%f",a,c,b,a/b); break

}

return 0;

}

12、输入某年某月某日,判断这一天是这一年的第几天?要考虑这一年是否是闰年。

解答:

#include<stdio.h>

int main()

{

        int a,b,c,d,num=0;

        printf("请输入年月日");

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

        if((a%4==0 && a%100!=0) || a%400==0)

        {

        printf("%d年是闰年\n",a);

        d=1;

        }

        else

        printf("该年不是闰年\n");

        switch(b-1)

        {

        case 12:num +=31;

        case 11:num+=30;

        case 10:num+=31;

        case 9:num+=30;

        case 8:num+=31;

        case 7:num+=31;

        case 6:num+=30;

        case 5:num+=31;

        case 4:num+=30;

        case 3:num+=31;

        case 2:

                 if(d==1)

                 num+=29;

                  else

                  num+=28;

                  case 1:num+=31;

        }

        printf("这天是今年的%d",num+c);

        return 0;

}

3 循环结构

1、编写程序,求 1!+ 2!+ 3!+ …+N!的值,N的值由键盘输入。

//方法1

#include <stdio.h>

void main()

{

        int i,n;

        long p=1,sum=0;

        printf("Please enter n:");

        scanf("%d",&n);

        //数列法,第n项等于n乘以第n-1项,第1项等于1

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

        {

                 p *= i;

                 sum += p;

                 printf("%d!=%ld\n",i,p);  //分行显示各阶乘的值

        }     

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

}

2、编程序按下列公式计算 e 的值(精度为 1e-6): e=1+1/1!+1/2!+1/3!+…+1/n!

//方法1

#include <stdio.h>

void main()

{

        int i;

        long p=1;

        double sum=1.0;

        //数列法,掌握精度作为循环条件

        for(i=1;1.0/p>=1e-6;i++)

        {

                 p *= i;

                 sum += 1.0/p;

        }     

        printf("e=%.2lf\n",sum);

}

3、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,… 。求出这个数列的前20项之和。

#include <stdio.h>

#define N 20

void main()

{

        int i;

        float sum=0,fz=1,fm=1,t;

        //数列的关键是找出各项之间的规律,fz表示分子,fm表示分母

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

        {

                 t=fz;

                 fz += fm;

                 fm=t;

                 sum += fz/fm;

        }

        printf("sum=%.2f\n",sum);

}

4、编写程序,输入以下9个数-5,13,5,-4,-7,0,83,-66,-10,计算它们的和以及所有正数之和及所有负数之和,并分别打印出来。

#include <stdio.h>

#define N 9

void main()

{

    int num,sum=0,zsum=0,fsum=0;

    int i;

    printf("input number:");

    //循环输入与求和

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

    {

        scanf("%d",&num);

        sum += num;

        if(num[i]>0)

           zsum += num;

        else

           fsum += num;

    }

    printf("总和为%d\n正数之和为%d\n负数之和为%d\n",sum,zsum,fsum);

}

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

#include <stdio.h>

void main()

{

    int letter=0,space=0,digit=0,other=0;

    char ch;

    //字母、数字、空格、其它字符的判定方法

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

    {

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

           letter++;

        else if(ch == ' ')

           space++;

        else if(ch >= '0' && ch <= '9')

           digit++;

        else other++;

    }

    printf("字母有%d个,空格有%d个,数字有%d个,其他字符有%d个\n",letter,space,digit,other);

}

6、若一个3 位整数的各位数字的立方之和等于这个整数,称之为“水仙花数”。例如:153 是水仙花数,因为

,求1000以内所有的水仙花数。

#include <stdio.h>

int main()

{

        int n,a,b,c;

        //掌握水仙花数算法,关键在于提取百位、十位、个位的方法

        for(n=100;n<1000;n++)

        {

                 a=n/100;  //提取百位

                 b=n/10%10;  //提取十位

                 c=n%10;  //提取个位

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

                         printf("%d ",n);

        }

        printf("\n");

}

7、一个数如果恰好等于它的因子之和,这个数就称为完数。 例如,6的因子为1、2、3,而6=1+2+3,因此,6是完数。编程找出1000之内的所有完数。

#include <stdio.h>

void main()

{

        int i,n,sum;

        //完数等于因子之和,因子包括质数和1

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

        {

                 sum=0;

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

                         if(0 == n%i)

                                  sum += i;

                 if(sum == n)

                         printf("%d ",n);

        }

        printf("\n");

}

8、编写程序,打印以下图形:

                      *

* * *

* * * * *

* * * * * * *

* * * * *

* * *

                      *

#include <stdio.h>

void main()

{

    int i,j,k;

    //利用循环画图,关键是找到空格和星号的变化规律,分上下2段

    for(i=0;i<4;i++)  //画上4行

    {

        for(j=3-i;j>0;j--)  //画每一行的空格

           printf(" ");

        for(k=0;k<2*i+1;k++)  //画每一行的星号

           printf("*");

        printf("\n");

    }

    for(i=0;i<3;i++)  //画下3行

    {

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

           printf(" ");

        for(k=5-2*i;k>0;k--)

           printf("*");

        printf("\n");

    }

}

9、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

//方法1 递归法

#include <stdio.h>

long fun(int n);

void main()

{

    int i;

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

        printf("第%d月:%ld\n",i,fun(i));

}

//兔子问题也称斐波那契数列(Fibonacci sequence),

//其算法是从第3项开始,每一项都等于前两项之和。

long fun(int n)

{

    if(n==1 || n==2)

        return 2;

    else

        return fun(n-1)+fun(n-2);

}

//方法2

#include <stdio.h>

void main()

{

    int i;

    long f1=2,f2=2;

    for(i=1;i<=11;i+=2)

    {

        printf("第%d月:%ld\n",i,f1);

        printf("第%d月:%ld\n",i+1,f2);

        f1=f1+f2;  //当前项是前2项之和

        f2=f1+f2;  //后一项是当前项和前一项之和

    }

}

10、公鸡五元一只,母鸡三元一只,小鸡一元三只,一百元要买一百只鸡,且须包含公鸡、母鸡和小鸡。请编写程序,输出所有可能的方案。

#include <stdio.h>

void main()

{

        int x,y,z;

        //百钱百鸡,使用穷举法

        for(x=1;x<100/5;x++)

                 for(y=1;y<100/3;y++)

                 {

                         z=100-x-y;

                         if(x*5+y*3+z/3==100)

                                  printf("公鸡:%2d 母鸡:%2d 小鸡:%2d\n",x,y,z);

                 }

}

4 数组

1、编写程序,使之具有如下功能:输入10个整数,按每行4个数输出这些整数,最后输出10个整数的平均值。

解答:

#include<stdio.h>

#define N 10

main()

{

        int a[N],i,j,s=0;

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

        {

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

                 s=s+a[i];

        }

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

        {

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

                 if(i+1)%4==0)

                 {

                         printf("\n");

                 }     

        }

        printf("\n平均分:%d\n",s/N);

        return 0; 

}

2、输入 20 个整数,请使用数组编写程序求其中最大值和次大值。

//方法1,打擂台法

#include <stdio.h>

#define N 20

void main()

{

        int i,j,a[N],max1,max2;

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

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

        //打擂台法求最大值,大的当擂主

        max1=a[0];

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

                 if(a[i]>max1)

                 {

                         max1=a[i];

                         j=i;  //提取擂主的下标

                 }

        for(i=j;i<N-1;i++)  //去除擂主

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

        //继续打擂台,求次大值

        max2=a[0];

        for(i=1;i<N-1;i++)

                 if(a[i]>max2)

                         max2=a[i];

        printf("最大值为%d,次大值为%d\n",max1,max2);

}

//方法2,打擂台法

#include <stdio.h>

#define N 20

void main()

{

        int i,j,a[N],max1,max2;

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

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

        //打擂台法,第1大的当擂主1, 第2大的当擂主2

        max1=a[0];

max2=a[0];

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

        {

if(a[i]>max1)

                 {

max2= max1; 

                         max1=a[i];                      

                 }

       else

if(a[i]>max2)

                   {

max2= a[i]; 

                    }

     }

        printf("最大值为%d,次大值为%d\n",max1,max2);

}

3、下面程序的功能是输入10个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的10个整数。

解答:

#include<stdio.h>

#define N 10

main()

{

        int i,a[N],max,min,t;

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

        {

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

        }

        max= 0;

        min= 0;

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

        {

                 if(a[i]>a[max])

                 {

                         max=i;

                 }

        }

        printf("最大值:%d,下标:%d\n",a[max],max);

        for(i=0,b=0;i<=N-1;i++)

        {

                 if(a[i]<min)

                 {

                         min=i;

                 }

        }

        printf("最小值:%d,下标:%d\n",a[min],min);

t = a[max]; a[max] = a[min] ; a[min]=t;

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

        {

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

        }

        printf("\n");

        return 0;

}

4、将一个数组中的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。

解法一:

#include<stdio.h>

#define N 5

main()

{

        int i,a[N],t;

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

        {

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

        }

        printf("\n");

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

        {

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

        }

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

        {

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

        }

        printf("\n");

        return 0; 

}

解法二:

#include<stdio.h>

#define N 5

main()

{

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

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

        {

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

        }

        printf("\n");

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

        {

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

        }

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

        {

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

        }

        printf("\n");

        return 0; 

}

5、数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。对查找的结果给出相应的说明,如果找到该数值,则输出“Found”信息,并给出该数是数组中的第几个元素。如果该数值不在数组中,则输出“Not found”信息。

#include<stdio.h>

#define N 10

main()

{

        int i,x,t,a[10]={12,24,35,49,57,63,72,84,91,107};

        scanf("%d",&x);

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

        {

                 if(x==a[i])

                 {

                         t=i;

                         break;

                 }

        }

        if(i<N)

        {printf("元素%d的下标:%d\n",x,t);}

        else

                 printf("NOT FOUND\n");

        return 0;

}

6、折半查找,有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。

解答:

#include<stdio.h>

#define N 15

main()

{

        int high,i,x,low,mid,a[N]={100,98,84,75,64,51,42,33,28,19,17,16,14,9,4};

        low=0;

        high=N-1;

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

        {

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

        }

        scanf("%d",&x);

        if((x<a[N-1])||(x>a[0]))

                 printf("%d找不到\n",x);

        else

        {

                 while(low<=high)

                 {

                         mid=(low+high)/2;

                         if(x==a[mid])

                         {

                                  printf("%d是第%d个数\n",x,mid+1);

                                  break;

                         }

                         else

                                  if(x>a[mid])

                                          high=mid-1;

                                  else

                                          low=mid+1;

                 }

                 if(low>high)

                         printf("%d不在数组内\n",x);

        }

        return 0;

}

7、编写程序,任意输入10个从小到大的整数的数列,然后输入一个整数插入到数列中,使数列保持从小到大的顺序。

解法一:

#include <stdio.h>

#define N 9

void main()

{

    int i,j,t,a[N+1];

    for(i=0;i<N;i++)  //输入数组

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

    printf("Please enter a number:");

    scanf("%d", &t);

   

        for(i=0;i<N;i++ )  //查找插入位置i

                 if(t < a[i])

                         break;

        for(j=N-1;j>=i;j--)  //i后面的数后移一位,腾出位置

        a[j+1]=a[j];

    a[i]=t;  //插入数据到i位

    for( i=0;i<N+1;i++)  //输出数组

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

    printf("\n");

}

解法二:

#include<stdio.h>

#define N 11

main()

{

        int a[N]={1,14,25,36,48,51,62,73,89,97};

        int i,x,t;

        printf("原排序:");

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

        {

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

        }

        printf("\n");

    scanf("%d",&x);

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

        {

                 if(a[i]>x)

                 {

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

                 }

                 else

                 {

                         break;

                 }

        }

        a[i+1]=x;

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

        {

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

        }

        printf("\n");

        return 0; 

}

8、输入十个互不相同的实数并存在数组中,找出最大元素,并删除。

解答:

#include<stdio.h>

#define N 10

main()

{

        int a[N],i,t,max;

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

        {

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

        }

        max=0;

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

        {

                 if(a[i]>a[max])

                 {

                         max=i;

                 }

        }

        for(i=max+1;i<=N-1;i++)

        {

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

        }

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

        {

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

        }

        printf("\n");

        return 0;

}

9、以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。

解答:

#include<stdio.h>

#define N 1000

int main()

{

        int s[N],i,sum=0,a,c=0;

        printf("输入成绩:");

        for(i=0; i<N; )

        {

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

                 if(s[i]<0)

                 {  break;  }

                 if(s[i]>100)

                 {

                         printf("请重新输入\n");

                         continue;

                 }

                 sum=sum+s[i];

                 i++;

                 c++;

        }

        if(c!=0)

{      a=sum/c;

                printf("平均分是%d\n",a);

                printf("低于平均分的学生成绩是:\n");

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

                {

                         if(s[i]<a)

                         {

printf("\t%d",s[i]);}

                         }

}

        else

                 printf("输入了0个分数\n");

return 0;

}

10、全校学生的年龄在16到30岁之间,请编写程序用来统计各年龄的人数。请用数组元素作为计数器来统计每一年龄的人数。

#include <stdio.h>

#define N 15

void main()

{

    int i,age,a[N]={0};

        printf("请输入1630之间的年龄,-1结束!\n");

        scanf("%d",&age);

        while(age != -1)  //-1退出循环

        {

                 a[age-16]++;  //16岁用a[0]计数,以此类推,30岁用a[14]计数

                 scanf("%d",&age);

        }

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

        {

                 printf("%d岁:%d ",i+16,a[i]);

                 if((i+1)%5==0)printf("\n");  //每5个元素换一行

        }

}

11、将两个有序的数组合并成一个有序数组。

解答:

#include<stdio.h>

#define N 20

main()

{

        int i=0,j=0,k=0,anum=8,bnum=5,c[N+N];

        int a[N]={1,5,14,26,48,50,55,60};

        int b[N]={4,26,29,37,78};

       

        while(i<anum&&j<bnum)

        {

                 if(a[i]<=b[j])

                 {

                         c[k]=a[i];

                         k++;

                         i++;

                 }

                 else

                 {

                         c[k]=b[j];

                         k++;

                         j++;

                 }

        }

        if(i<anum)

        {

                 c[k]=a[i];

                 i++;

                 k++;

        }

        if(j<bnum)

        {

                 c[k]=b[j];

                 j++;

                 k++;

        }

        for(k=0;k<anum+bnum;k++)

        {

                 printf("%d\t",c[k]);

        }

        printf("\n");

        return 0;

}

12、编程实现交换数组a和数组b中的对应元素。

解答:

#include<stdio.h>

#define N 20

main()

{

        int a[N],b[N],*p,*q,m=0,n=0,k,x,t,i;

        printf("请输入数组a的元素个数\n");

scanf("%d",&m);

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

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

        printf("请输入数组b的元素个数\n");

scanf("%d",&n);

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

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

        if(m>=n)

        {

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

                 {

                         t = a[i]; a[i] = b[i];  b[i] = t;

                 }

                 for(  ; i<m ; i++)

                 {

                         b[i]=a[i];

                 }

        }

        else

        {

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

                 {

                         t = a[i]; a[i] = b[i];  b[i] = t;

                 }

                 for(  ; i<n ; i++)

                 {

                         a[i] = b[i];

                 }

        }

        printf("交换后数组a的元素为:\n");

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

        {

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

        }

        printf("\n");

        printf("交换后数组b的元素为:\n");

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

        {

                 printf("%d\t",b[i] );

        }

        printf("\n");

        return 0;

}

13、用冒泡法对n个整数排序。

解答:

#include<stdio.h>

#define N 6

main()

{

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

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

  {

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

  }

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

  {

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

      {

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

         {t=a[j];a[j]=a[j+1];a[j+1]=t; }

      }

  }

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

  {

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

  }

  printf("\n");

  return 0;

}

14、用选择法对n个整数排序。

#include<stdio.h>

#define    s 100

main()

{

        int i,j,k,t,n,a[s];

        printf("输入数字个数:");

        scanf("%d",&n);

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

        {

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

        }

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

        {

                 k=i;  

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

                 {

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

                                  k=j;

                 }

                 if(k!=i)

                 {t=a[i];a[i]=a[k];a[k]=t;  }

        }

        printf("\n");

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

        {

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

        }

        printf("\n");

        return 0;

}

15、有一个3行4列的矩阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。要求矩阵的值从键盘输入。

解答:

#include<stdio.h>

#define m 3

#define n 4

main()

{

        int i,j,a[m][n],max,r=0,l=0;

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

        {

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

                 {

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

                 }

        }

        max=a[0][0];

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

        {

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

                 {

                         if(a[i][j]>max)

                         {max=a[i][j];r=i,l=j; }

                 }

        }

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

        {

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

                 {

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

                 }

                 printf("\n");

        }

        printf("max=%d,行:%d,列:%d\n",max,r+1,l+1);

        return 0;

}

16、输出杨辉三角形。

1

    1    1

    1    2    1

    1    3    3    1

    1    4    6    4    1

    1    5    10   10   5    1

解法一:用一维数组实现

#include<stdio.h>

int main()

{

        int a[20];

        int i,j;

        int n;

        scanf("%d",&n);//所需输出的行数

        if(n==1)//只有一行,输出即可

                 printf("1\n");

        else

        {

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

                 printf("1\n1    1\n"); //两行的话直接输出

                 for(i=3;i<=n;i++)//从第三行开始计算

                 {

                         a[i-1]=1;//每行的最后一个数字都是1

                         for(j=i-2;j>0;j--)//倒着计算出每一行的数值

                                  a[j]=a[j]+a[j-1];

                         a[0]=1;//每行的第一个数字都是1

                 for(j=0;j<i;j++)//计算完一行,输出一行。

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

                 printf("\n");

                 }

        }

        return 0;

 }

解法二:使用二维数组并利用每个系数等于其肩上两系数之和

#include<stdio.h>

#define N 100

void main()

{

        int a[N][N],i,j,n;

        printf("请输入打印行数:");

        scanf("%d",&n);

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

        {

                 a[i][0]=1;

        a[i][i]=1;

        }

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

        {

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

                 {

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

                 }

        }

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

        {

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

                 {

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

                 }

                 printf("\n");

        }

}

17、输入m*n阶矩阵A和B,编程计算并输出A和B之和。

#include <stdio.h>

#define M 10

#define N 10

void main()

{

        int a[M][N],b[M][N],sum[M][N];

        int i,j,m,n;

        printf("input m<%d,n<%d:",M,N);

        scanf("%d%d",&m,&n);  //确定行列数

        printf("input A:\n");

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

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

                         scanf("%d",&a[i][j]);  //二维数组的输入

        printf("input B:\n");

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

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

                 {

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

                         sum[i][j]=a[i][j]+b[i][j];  //矩阵加法

                 }

        printf("A+B=\n");

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

        {

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

                         printf("%d\t",sum[i][j]);  //二维数组的输出

                 printf("\n");

        }

}

18、定义一个二维数组,存入10个学生的数学、语文、英语、物理、化学5门课程的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩。

#include<stdio.h>

#define M  10

#define N  5

main()

{

        int i,j,a[M][N];

        float n;

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

        {

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

                 {

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

                 }

        }

        printf("数学\t语文\t英语\t物理\t化学\t平均分\n");

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

        {

                 n=0;

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

                 {

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

                         n=n+a[i][j];

                 }

                 printf("%f\n",n/N);

        }

        printf("课程平均分:\n");

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

        {

            n=0;

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

                 {

                 n=n+a[i][j];

                 }

                 printf("%.1f\t",n/N);

        }

printf("\n");

return 0;

       

}

5 指针

1、从键盘输入3个数,使用指针方法找到3个数中最大和最小的数并输出。

解答:

(1)源代码:

#include<stdio.h>

#define M 3

main()

{

        int a[M],i;

        int *max,*min;

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

        {

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

        }

        max = &a[0];

        min = &a[0];

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

        {

                 if(a[i] > *max)

                         max = &a[i];

                 if(a[i] < *min)

                         min = &a[i];

        }

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

        return 0;

}

2、使用指针,输入10个整数,找出最大数和最小数所在的地址,并把二者对调,然后输出调整后的10个整数。

解答:

#include<stdio.h>

#define N 10

main()

{

        int i,a[N],*max,*min,t;

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

        {

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

        }

        max= &a[0];

        min= &a[0];

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

        {

                 if(a[i]>*max)

                 {

                         max=&a[i];

                 }

        }

        printf("最大值:%d,地址:%d\n",*max,max);

        for(i=0,b=0;i<=N-1;i++)

        {

                 if(a[i]<*min)

                 {

                         min=&a[i];

                 }

        }

        printf("最小值:%d,地址:%d\n",*min,min);

t = *max;  *max = *min ;  *min=t;

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

        {

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

        }

        printf("\n");

        return 0;

}

3、使用指针编写一个程序,将输入的10个整数逆置后输出。

解答:

#include<stdio.h>

#define N 5

main()

{

        int *i, *j,a[N],t;

    for(t=0;t<=N-1;t++)

        {

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

        }

        printf("\n");

        for( i = &a[0], j = &a[N-1] ;i < j; i++, j--)

        {

          t=*i; *i=*j; *j=t;

        }

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

        {

        printf("%d\t",a[t]);

        }

        printf("\n");

        return 0; 

}

4、编写程序使用指针实现输入输出数组中的全部元素,并求数组的平均值和数组元素之积。

解答:

(1)源代码:

#include<stdio.h>

#define N 5

main()

{

        int a[N],c;

        int *p;

        float b;

        b=0;

        c=1;

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

        {

                 scanf("%d",p);

                 b=b+(*p);

                 c=c*(*p);

        }

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

        {

                 printf("%d\t",*p);

        }

        printf("\n平均值:%.2f\t积:%d\n",b/N,c);

        return 0;

}

5、使用指针编写一个程序,将输入的10个整数按从小到大的顺序排列,并输出结果

解答:

(1)源代码:

#include<stdio.h>

#define N 10

main()

{

        int a[N],*p,t,*q,*min;

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

        {

                 scanf("%d",p);

        }

        for(p=a; p < a + N-1; p++)

        {

                 min = p;

                 for(q = p+1; q < a+N; q++)

                 {

                         if( *q < *min)

                                  min=q;

                 }

                 t=*p; *p=*min; *min=t;

        }

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

        {

                 printf("%d\t",*p);

        }

        printf("\n");

        return 0;

}

6、将两个有序的数组合并成一个有序数组。

解答:

#include<stdio.h>

#define N 20

main()

{

        int anum=8,bnum=5,c[N+N];

        int a[N]={1,5,14,26,48,50,55,60};

        int b[N]={4,26,29,37,78};

        int *pi=a, *pj=b,*pk=c,

        while( pi<a+anum && pj< b+bnum)

        {

                 if( *pi < *pj )

                 {

                         *pk =*pi;

                         pk++;

                         pi++;

                 }

                 else

                 {

                         *pk = *pj;

                         pk++;

                         pj++;

                 }

        }

        while( pi<a+anum)

        {

                 *pk =*pi;

                 pi++;

                 pk++;

        }

        while( pj<b+bnum)

        {

                 *pk =*pj;

                 pj++;

                 pk++;

        }

        for( k=c; k<c+anum+bnum; k++)

        {

                 printf("%d\t",*k);

        }

        printf("\n");

        return 0;

}

7、编程实现交换数组a和数组b中的对应元素。

解答:

#include<stdio.h>

#define N 20

main()

{

        int a[N],b[N],*p,*q,m=0,n=0,k,x,t,i;

        printf("请输入数组a的元素个数\n");

scanf("%d",&m);

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

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

        printf("请输入数组b的元素个数\n");

scanf("%d",&n);

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

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

        f(m>=n) 

        {

                 for(p=a ,q=b ; q<b+n ; p ++ ,q++)

                 {

                         t = *p; *p = *q;  *q = t;

                 }

                 for(  ; p<a+m ; p++, q++)

                 {

                         *q=*p;

                 }

        }

        else

        {

                 for(p=a ,q=b ; p<a+m ; p ++ ,q++)

                 {

                         t = *p;  *p = *q;  *q = t;

                 }

                 for(  ; q<b+n ; p++, q++)

                 {

                         *p=*q;

                 }

        }

        printf("交换后数组a的元素为:\n");

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

        {

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

        }

        printf("\n");

        printf("交换后数组b的元素为:\n");

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

        {

                 printf("%d\t",b[i] );

        }

        printf("\n");

        return 0;

}

8、利用指向行的指针变量求3 * 5数组各行元素之和

方法一:

#include<stdio.h>

#define N 3

#define M 5

void main()

{

        int a[N][M];

        int (*p)[M];

        int i,j,sum;

        printf("input number:");

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

        {

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

                 {

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

                 }

        }

p=a;

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

        {

                 sum=0;

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

                 {

                         sum+=p[i][j] );

                 }

                 printf("%d行和为:%d\n",i,sum);

        }

}

方法二:

#include<stdio.h>

#define N 3

#define M 5

void main()

{

        int a[N][M];

        int (*p)[M];

        int i,j,sum;

        printf("input number:");

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

        {

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

                 {

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

                 }

        }

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

        {

                 p=&a[i];

                 sum=0;

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

                 {

                         sum+=*(*p+j);

                 }

                 printf("%d行和为:%d\n",i,sum);

        }

}

方法三:

#include<stdio.h>

#define N 3

#define M 5

int main()

{

        int a[N][M];

        int (*p)[M];

        int *q;

        int i,j,sum;

        printf("input number:");

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

        {

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

                 {

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

                 }

        }

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

        { 

                 p = a[i];

                 sum=0;

                 for(q = p; q < p+1;q++)

                 {

                         sum+=*(q);

                 }

                 printf("%d行和为:%d\n",i+1,sum);

        }

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

        {

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

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

                 printf("\n");

        }

        return 0;

}

6 函数

1、请编写函数fun,它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。

#include<stdio.h>

float fun(int n)

{

    int i;

        float s=0;

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

        {

                 if((i%5==0)||(i%9==0))

                         s=s+1/(float)i;

        }

        return s;

}

main()

{

        int x;

        scanf("%d",&x);

        printf("%f\n",fun(x));

        return 0;

}

2、请编写阶乘函数Fact,利用它计算并输出1!+2!+3!+……+n!的值。

#include<stdio.h>

int fact(int x);

void main()

{

        int sum=0,n;

        int i;

        printf("input number:");

        scanf("%d",&n);

        sum=fact(n);

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

}

int fact(int x)

{

        int i,m=1,t=0;

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

        {

                 m *= i;

                 t += m;

        }

        return t;

}

3、请编写函数fun,其功能是:计算并输出下列多项式值:例如,若主函数从键盘给n输入50后,则输出为S=1.960784。s=1+1/(1+2)+1/(1+2+3)+ ...+1/(1+2+3+...+50)

#include<stdio.h>

float fun(int x)

{

        float i,a=0,b=0;

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

        {

                 a+=i;

                 b+=1/a;

        }

        return(b);

}

main()

{

        int m;

        scanf("%d",&m);

        printf("%f\n",fun(m));

        return 0;

}

4、编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n。p=m!/n!(m-n)!。例如:m=12,n=8时,运行结果为495.000000。

#include <stdio.h>

float fun(int x);

void main()

{

        int m,n;

        float p;

        do{

                 printf("input m,n:");

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

        }while(m<n);

        p=fun(m,n);

        printf("p=%f\n",p);

}

int fun(int m,int n)

        int p;

        p=fact(m)/( fact (n)* fact (m-n));

        return p;

}

float fact(int x)

{

        int i;

        float term=1;

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

        {

                 term*=i;

        }

        return term;

}

5、请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。例如,当a=45,b=12,调用该函数后c=2415。

#include<stdio.h>

#define N 4

int fun(int x,int y);

void main()

{

        int a,b,c;

        printf("input a,b:");

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

        c=fun(a,b);

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

}

int fun(int x,int y)

{

        int a[N],c;

        a[0]=x/10;

        a[1]=y/10;

        a[2]=x%10;

        a[3]=y%10;

        c=a[3]*1000+a[0]*100+a[1]*10+a[2];

        return c;

}

6、编写函数fun(int m, int *k, int xx[]),其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k返回。

#include<stdio.h>

#define N 20

void fun(int m, int *k, int xx[]);

void main()

{

        int m,n=0,xx[N];

        printf("input m:");

        scanf("%d",&m);

        fun(m,&n,xx);

        printf("非素数个数为%d\n",n);

}

void fun(int m, int *k, int xx[])

{

        int i,j;

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

        {

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

                 {

                         if(i%j==0)

                         {

                                  xx[*k]=i;

                                  (*k)++;

                                  break;

                         }

                 }

        }

}

7、请编写函数fun (int *a, int *n),它的功能是: 求出 1 到 1000 之间能被 7 或11整除、但不能同时被 7 和 11 整除的所有整数并将它们放在a所指的数组中,通过 n 返回这些数的个数。

#include<stdio.h>

#define N 1000

void fun(int *a,int *n);

void main()

{

        int a[N],n=0;

        fun(a,&n);

    printf("符合条件的数有:");

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

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

    printf("\n");

        printf("共有%d\n",n);

}

void fun(int *a,int *n)

{

        int i,k=0;

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

        {

                 if(i%7==0 && i%11!=0 || i%7!=0 && i%11==0)

                 {

                         a[k]=i;

                         k++;

                 }

        }

        *n=k;

}

8、使用指针编写一个程序,将输入的整数逆序排列后输出

#include<stdio.h>

#define N 20

void fun(int *p,int n);

void main()

{

        int a[N];

        int i,n;

        printf("input n:");

        scanf("%d",&n);

        printf("input number:");

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

        {

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

        }

        fun(a,n);

        printf("逆序排列后为:");

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

        {

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

        }

        printf("\n");

}

void fun(int *p,int n)

{

        int i,j,t;    

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

        {

                 t=p[i];p[i]=p[j]; p[j]=t;

        }     

}

9、使用指针编写一个程序,将输入的10个整数按从小到大的顺序排列,并输出结果

#include<stdio.h>

#define N 10

void sort(int *p,int n);

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

void main()

{

        int a[N];

        int i;

        printf("input number:");

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

        {

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

        }

        sort(a,N);

        printf("排序后为:");

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

        {

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

        }

        printf("\n");

}

void sort(int *p,int n)

{

        int i,j;

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

        {

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

                 {

                         if(p[j]>p[j+1])

                         {

                                  swap(&p[j],&p[j+1]);

                         }

                 }

        }

}

void swap(int *p1,int *p2)

{

        int t;

        t=*p1;     *p1=*p2;        *p2=t;

}

10、输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数实现程序:1.输入10个数。2.进行处理。3.输出10个数。所有函数的参数均使用指针

#include<stdio.h>

#define N 10

void swap(int *a,int *b);

void getmaxmin(int *p,int n);

void input(int *p,int n);

void output(int *p,int n);

void main()

{

        int a[N];

        input(a,10);

        getmaxmin(a,10);

        output(a,10);

}

void getmaxmin(int a[],int n)

{

        int i,max=0,min=0;

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

        {

                 if(a[i]>a[max])

                 {

                         max=i;

                 }              

        }

        swap(&a[max],&a[0]);

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

        {

                 if(a[i]<a[min])

                 {

                         min=i;

                 }

        }

        swap(&a[min],&a[n-1]);

}

void swap(int *a,int *b)

{

        int p;

        p=*a;       *a=*b;     *b=p;

}

void input(int *p,int n)

{

        int i;

        printf("input number:\n");

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

        {

                 scanf("%d",p+i);

        }

}

void output(int *p,int n)

{

        int i;

        printf("output number:\n");

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

        {

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

        }

        printf("\n");

}

11、编写一个函数,使用指针交换数组a和数组b中的对应元素

#include<stdio.h>

#define N 20

void swap(int *a, int *b);

void main()

{

        int i,n=0,m=0,x;

        int a[N],b[N];

        printf("请输入数组a,以-1结束:\n");

    scanf("%d",&x);

        while( x!=-1)

        {      a[n++]=x;

                         scanf("%d",&x);

        }

        printf("请输入数组b,以-1结束:\n");

      scanf("%d",&x);

        while( x!=-1)

        {      b[m++]=x;

                         scanf("%d",&x);

        }

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

        {

                 swap(&a[i], &b[i]);

        }

        printf("数组a中所有元素:\n");

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

        {

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

        }

        printf("\n");

        printf("数组b中所有元素:\n");

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

        {

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

        }

        printf("\n");

}

void swap(int *a, int *b)

{

        int t;

        t=*a;        *a=*b;     *b=t;

}

12、设有一个数列包含10个数,已经按升序排好。现要求编写一程序,它能够从指定位置开始的n个数按逆序,重新排列并输出新的完整数列。进行逆序处理时要求使用指针方法(例如原数列为2,4,6,8,10,12,14,16,18,20,若要求从第4个数开始的5个数按逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20)

方法一:

#include<stdio.h>

#define N 10

int fun(int *p,int n,int m);

void swap(int *a,int *b);

void main()

{

        int i,n,m;

        int a[N];

        printf("输入数组元素:\n");

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

        {

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

        }

        printf("请输入开始位置:");

        scanf("%d",&n);

        printf("请逆序处理的元素个数:");

        scanf("%d",&m);

        if( fun(a,n,m) )

                 printf("输出处理后的数组元素:\n");

        else

                 printf("数组元素:\n");

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

        {

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

        }

        printf("\n");

}

int fun(int *p,int n,int m)

{

        int i,j,t;

        if(n<1||n>N)

        {

                 printf("开始位置参数n不合法\n");

                 return 0;

        }

        if( m<1 || m>N || n+m > 11)

        {

                 printf("逆序处理的元素个数参数m不合法\n");

                 return 0;

        }

        for(i=n-1,j=n+m-2;i<j;i++,j--)

        {

                 swap(&p[i],&p[j]);

        }

        return 1;

}

void swap(int *a,int *b)

{

        int p;

        p=*a;       *a=*b;     *b=p;

}

方法二:

#include <stdio.h>

#define N 10

void method(int *a,int n,int m);

void swap(int *a,int *b);

int main()

{

    int a[N]={2,4,6,8,10,12,14,16,18,20},i;

        int m,n;

        printf("请输入开始位置:");

        scanf("%d",&n);

        printf("请逆序处理的元素个数:");

        scanf("%d",&m);

    method(a,n,m);

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

    {

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

    }

        printf("\n");

    return 0;

}

void  method(int *a,int n,int m)

{   int *p,*q;

        if(n<1||n>N)

        {

                 printf("开始位置参数n不合法\n");

                 return ;

        }

        if( m<1 || m>N || n+m > 11)

        {

                 printf("逆序处理的元素个数参数m不合法\n");

                 return ;

        }

    p=a+n-1;

        q=a+n+m-2;

    for( ;p<q; p++,q-- )

    {

                 swap(p,q);

    }

}

void swap(int *a,int *b)

{

        int p;

        p=*a;       *a=*b;     *b=p;

}

13、请编写函数fun,将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。例如,若二维数组中的数据为:

33    33    33    33

                  44    44    44    44

                  55    55    55    55

则一维数组中的内容应是:33  33  33  33  44  44  44  44  55  55  55  55

#include <stdio.h>

#define M 3

#define N 4

void fun(int x[][N],int *y,int m,int n )

{

        int i,j;

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

    {

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

        {

            y[i*n+j] = x[i][j];

        }

    }

}

void main()

{

int a[M][N] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;

int b[M+N] = {0} ;

printf("The matrix:\n") ;

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

{

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

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

        printf("\n") ;

}

fun(a,b,M,N) ;

printf("The  array:\n") ;

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

{

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

}

printf("\n") ;

}

14、编写函数fun,它的功能是:先从键盘上输入一个3行、5列的矩阵的各个元素的值,然后输出所有元素之和。

#include<stdio.h>

#define M 3

#define N 5

void fun(int a[][N]);

void main()

{

        int a[M][N];

        fun(a);

}

void fun(int a[][N])

{

        int i,j;

        int sum=0;

        printf("input number:");

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

        {

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

                 {

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

                         sum+=a[i][j];                  

                 }

        }

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

}

15、编写一个函数(参数用指针)将一个3 * 3的矩阵转置

#include<stdio.h>

#define M 3

void move(int *pointer);

int main()

{

       

        int a[M][M];

        int *p,i,j;

        printf("input matrix:\n");

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

        {

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

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

        }

    printf("Before  transposition matrix:\n");

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

        {

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

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

                 printf("\n");

        }

        p=&a[0][0];

        move(p);

        printf("Now,matrix:\n");

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

        {

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

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

                 printf("\n");

        }

        return 0;

}

void move(int *pointer)

{

        int i,j,t;

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

        {

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

                 {

                         t=*(pointer+M*i+j);

                         *(pointer+M*i+j)=*(pointer+M*j+i);

                         *(pointer+M*j+i)=t;

                 }

        }

}

7 字符串

1、编写一个函数,求字符串的长度

#include<stdio.h>

#define N 20

int mystrlen(char ch[]);

void main()

{

        char ch[N];

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

        gets(ch);

        printf("长度为:%d\n",mystrlen(ch));

}

int mystrlen(char ch[])

{

        int i;

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

        return i;

}

2、若字符串中包含数字与字符,编写一个函数删除数字后输出剩下的字符

方法一:

#include<stdio.h>

#define N 100

void fun(char ch[],char t[]);

void main()

{

        char ch[N],t[N];

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

        gets(ch);

        fun(ch,t);

        puts(t);

}

void fun(char ch[],char t[])

{

        int i,j;

        for(i=0,j=0;ch[i]!='\0';i++)

        {

                 if(ch[i]<'0' || ch[i]>'9')

                 {

                         t[j]=ch[i];

                         j++;

                 }

        }

        t[j]='\0';

}

方法二:

#include<stdio.h>

#define N 100

int fun(char a[]);

void main()

{

        char ch[N];

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

        gets(ch);

        printf("共删除了%d个数字\n",fun(ch));

        printf("删除数字后字符串:");

        puts(ch);

}

int fun(char a[])

{

  int m=0;

  char *q=a;

  char *p=a;

   do

   {

     if(*p>='0'&&*p<='9')

         {

       m++;

     }

         else

         {

       *q=*p;

       q++;

     }

     p++;    

   }while(*p !='\0');

   *q='\0'; 

  return m;

}

3、不使用库函数将字符串转换为数字,例如字符串“1234”转换为1234

#include<stdio.h>

#define N 5

int  fun(char ch[]);

void main()

{

        char ch[N];

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

        gets(ch);

        printf("%d\n",fun(ch));

}

int fun(char ch[])

{

        int i,x=0;

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

        {

                 if(ch[i]<='0' || ch[i]>='9')

                 {

                         continue;

                 }

                 else

                 {

                         x=x*10+ch[i]-'0';

                 }

        }

        return x;

}

4、编写一个函数revstr(char *string),将函数字符串中的字符反转输出

#include<stdio.h>

char* revers(char s[] ) ;

int  main()

{

   char s[81],*p,*q,ch;

   printf("Input a string:\n");

   gets(s);

   printf("s=%s\n", revers(s));

        return 0;

}

char* revers(char s[] )

{

        char *p,*q,ch;

        for(q = s; *q; q++);

        q--;

    p = s;

        while (p < q)

        {

          ch = *p;           *p = *q;           *q = ch;

                 p++;

                 q--;

        }

        return  (s);

}

5、将字符串赋给一个字符数组,然后从第一个字母开始间隔地输出字符串,用指针实现该程序

#include<stdio.h>

#define N 50

void fun(char *p);

void main()

{

    char a[N];

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

    gets(a);

    fun(a);

}

void fun(char *p)

{

    int n=0;

    while((*p)!='\0')

    {

        printf("%c",*p);

        if( *(p+1)=='\0')

                    break;

                 p=p+2;

    }

        printf("\n");

}

6、使用指针编写函数atoi,将字符串s转化为整型数返回,注意负数处理方法。

#include<stdio.h>

#define N 20

int  atoi(char *p);

void main()

{

        char ch[N];

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

        gets(ch);

        printf("%d\n",atoi(ch));

}

int atoi(char *p)

{

        int i=0,x=0;

        if(p[i]=='-' || p[i]=='+')

        {

                 i++;

        }

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

        {

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

                 {

                         x=x*10+p[i]-'0';

                 }     

        }

        if(p[0]=='-')

        {

                 x=-x;

        }

        return x;

}

7、输入一个字符串,在每个字符之间插入一个空格并输出,如原来的字符串为“abcd”,新产生的字符串为“a b c d”

#include<stdio.h>

#include<string.h>

void Insert(char *p)

{

        int i;

        /*结束为止应该在1位置,下标从0开始*/

        for (i = strlen(p); i > 0; --i)

        {

                 *(p + 2 * i) = *(p + i);

                 *(p + 2 * i - 1) = ' ';

        }

}

int main()

{

        char s[100];

        printf("Please input s:");

        gets(s);

        Insert(s);

        printf("the new string:%s", s);

        return 0;

}

8、使用指针编写函数itoa,将整型数转化为字符串s返回

#include<stdio.h>

#define N 20

void fun(int num,char *p);

void main()

{

        int num;

        char ch[N];

        printf("input number:");

        scanf("%d",&num);

        fun(num,ch);

        puts(ch);

}

void fun(int num,char *p)

{

        int i,j,sign;

        char temp;

        if( (sign=num) < 0 )                         //记录符号

                 num=-num;              //使num成为正数

        for(i=0;num!=0;i++)

        {

                 p[i]=num%10+'0';

                 num=num/10;

        }

        if(sign<0)

                 p[i++]='-';

        p[i]='\0';

        for(j=0,i=i-1;i>=j;i--,j++)

        {

                 temp=p[i]; p[i]=p[j]; p[j]=temp;

        }

}

9、不使用库函数将数字转换为字符串,例如数字1234转换为“1234”。

#include<stdio.h>

#define N 10

void fun(int p,char ch[]);

void main()

{

        int num;

        char ch[N];

        printf("input number:");

        scanf("%d",&num);

        fun(num,ch);

        puts(ch);

}

void fun(int p,char ch[])

{

        int i,j;

    char t;

        for(i=0;p!=0;i++)

        {

                 ch[i]=p%10+'0';

                 p=p/10;

        }

        ch[i]='\0';

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

        {

                 t=ch[j]; ch[j]=ch[i]; ch[i]=t;

        }

}

10、请编写函数fun ( char *p )的功能是:在p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH。

#include<stdio.h>

#define N 20

void fun(char *p);

void main()

{

        char ch[N];

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

        gets(ch);

        fun(ch);

        printf("调用后字符串中的内容为:");

        puts(ch);

}

void fun(char *p)

{

        int max; char t;

        int i,k;

        max=0;   

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

        {

                 if(p[i]>p[max])

                 {

                         max=i;

                 }

        }

        for(k=max;k>0;k--)

        {

                 t=p[k];             p[k]=p[k-1];            p[k-1]=t;

        }     

}

11、实现一个字符串大小比较函数,若有两个字符串s1和s2,s1与s2相等返回0,s1>s2返回1,s1<s2返回-1

#include<stdio.h>

#define N 20

int mystrcmp(char ch1[],char ch2[]);

void main()

{

        char ch1[N],ch2[N];

        printf("请输入两个字符串:\n");

        gets(ch1);

        gets(ch2);

        printf("返回值为:%d\n",mystrcmp(ch1,ch2));

}

int mystrcmp(char ch1[],char ch2[])

{

        int i=0,j=0,k=0;

        do

        {      k=ch1[i++]-ch2[j++];

        }while ( k==0 && (str1[i]!='\0' || str2[j]!='\0') );

        return k; 

}

12、编写一个程序将两个字符串连接起来并输出结果

#include<stdio.h>

#define N 20

char * mystrcat(char ch1[],char ch2[]);

void main()

{

        char ch1[N],ch2[N];

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

        gets(ch1);

        gets(ch2);

        printf("连接后为:%s\n",  mystrcat(ch1,ch2));

}

char *  mystrcat(char ch1[],char ch2[])

{

        int i,j;

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

        for(j=0;ch2[j]!='\0';j++,i++)

        {

                 ch1[i]=ch2[j];

        }

        ch1[i]='\0';

        return ch1;

}

13、请编写一个函数void fun(char *tt,int pp[]),统计在字符串中'a'到'z'26个字母各自出现的次数,并依次放在pp所指数组中。例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.

#include<stdio.h>

#define N 100

void fun(char *tt,int pp[]);

void main()

{

        char a[N];

        int pp[26]={0},i=0;

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

        gets(a);

        fun(a,pp);

        printf("'a''z'26个字母各自出现的次数:\n");

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

        {

                 printf("%3d",pp[i]);

        }

        printf("\n");

}

void fun(char *tt,int pp[])

{   char c;

        while(*tt)

        {

                 c=*tt;

                 pp[c-'a']++;

                 tt++;

        }

}

14、编写程序,移动字符串中的内容,移动的规则如下:把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后,字符串中的内容应该是DEFGHIJKABC。

方法一:

#include<stdio.h>

#define N 100

void fun(char ch[],int m);

void main()

{

        char ch[N];

        int m;

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

        gets(ch);

        printf("请输入m:");

        scanf("%d",&m);

        fun(ch,m);

        puts(ch);

}

void fun(char ch[],int m)

{

        char ch1[N],ch2[N];

        int i,j=0;

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

        {

                 ch1[i]=ch[i];

        }

        ch1[i]='\0';

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

        {

                 ch[i-m]=ch[i];

        }

        for(j=0;ch1[j]!='\0';j++,i++)

        {

                 ch[i-m]=ch1[j];

        }

        ch[i]='\0';

}

方法二:

#include<stdio.h>

#include<string.h>

#define N 100

void fun (char * ptr,int m);

void main()

{

        char ch[N];

        int m;

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

        gets(ch);

        printf("请输入m:");

        scanf("%d",&m);

        fun(ch,m);

        puts(ch);

}

void fun (char * ptr,int m)

{

        int lenth=strlen(ptr)-1;

        int i;

        int j;

        //将第1个到第m字符与最后交换

        for(i=0,j=lenth;i<m;i++)

        {

                

                 char tmp=ptr[i];

                 ptr[i]=ptr[j];

                 ptr[j]=tmp;

                 j--;

        }

        //反转lenth-m+1lenth的部分

        for(i=lenth-m+1,j=lenth;i < j;i++,j--)

        {

                 char tmp=ptr[i];

                 ptr[i]=ptr[j];

                 ptr[j]=tmp;

                

        }

        //反转0lenth-m的部分

        for(i=0,j=lenth-m; i < j;i++,j--)

        {

                 char tmp=ptr[i];

                 ptr[i]=ptr[j];

                 ptr[j]=tmp;

        }

        //反转0lenth-m-m的部分

        for(i=0,j=lenth-m-m;i < j;i++,j--)

        {

                 char tmp=ptr[i];

                 ptr[i]=ptr[j];

                 ptr[j]=tmp;

        }

}

15、有一个字符串包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成另一个字符串并输出

#include<stdio.h> 

#include<string.h>

#define N 50

void mystrcpy(char *p1,char *p2,int m); 

void main() 

{

        int n,m; 

    char str1[N],str2[N]; 

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

    gets(str1);

    printf("输入m的值:");  

    scanf("%d",&m);

        n=strlen(str1);

    if(n<m) 

        {

                 printf("错误");

        }

    else 

    { 

        mystrcpy(str1,str2,m); 

        puts(str2); 

    }  

 

void mystrcpy(char *p1,char *p2,int m) 

{

        int n; 

        n=0; 

        while( p1 && (n<m-1) )

        {

                 n++;

                 p1++; 

        } 

        while(*p1!='\0') 

        {

                 *p2=*p1;

                 p1++;

                 p2++;

        }

        *p2='\0';

}

16、设计函数char *insert(s1, s2, n),用指针实现在字符串s1中的指定位置n处插入字符串s2,s1字符串有足够的空间存放s2字符串。

#include <stdio.h>

#include <string.h>

#define N 50

char * insert(char s1[],char s2[],int n);

void main()

{

        int n;

        char ch1[N+N],ch2[N];

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

        gets(ch1);

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

        gets(ch2);

        printf("请输入插入位置:");

        scanf("%d",&n);

        printf("输出字符串为:");

        puts(insert(ch1,ch2,n));

}

char * insert(char s1[],char s2[],int n)

{

        int i,j,n1,n2;

        n1=strlen(s1);

    n2=strlen(s2);

        if( n<1||n>n1+1)

        {

                 printf("插入位置不合法\n:");

                 return NULL;

        }

    for(i=n1;i>=n-1;--i)

    {

        s1[i+n2]=s1[i];

    }

        n--;

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

    {

        s1[n++]=s2[i];

    }     

        return s1;

}

17、编写函数fun(char *s, int *t),其功能是:统计形参s所指字符串中数字字符出现的次数,并存放在形参t所指的变量中,最后在主函数中输出。例如,形参s所指的字符串为:abcdef35adgh3kjsdf7。输出结果为:4。

#include<stdio.h>

#define N 20

void fun(char *s,int *t);

void main()

{

        char s[N];

        int t=0;

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

        gets(s);

        fun(s,&t);

        printf("数字有:%d\n",t);

}

void fun(char *s,int *t)

{

        int i;

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

        {

                 if(s[i]>=48 && s[i]<=57)

                 {

                         (*t)++;

                 }

        }

        return ;

}

18、使用指针编写一个程序,输入星期,输出该星期的英文名,用指针数组处理

#include"stdio.h"

#define N 7

void main()

{

        int d;

        char p[N]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

        printf("input day:");

        scanf("%d",&d);

        if(d>=1 && d<=7)

        {

                 printf("%s\n",p[d-1]);

        }

        else

        {

                 printf("Illegal day\n");

        }

}

19、使用指针编写一个程序,将输入的3个字符串按从小到大的顺序排列,并输出结果

#include<stdio.h>

#include<string.h>

#define N 3

#define M 20

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

void main()

{

        char ch[N][M];

        int i,j;

        printf("请输入%d个字符串:",N);

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

        {

                 gets(ch[i]);

        }

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

        {

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

                 {

                         if(strcmp(ch[j],ch[j+1])>0)

                         {

                                  swap(ch[j],ch[j+1]);

                         }

                 }

        }

        printf("排序后为:\n");

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

        {     

                 puts(ch[i]);

        }

}

void swap(char *p1,char *p2)

{

        char t[M];

        strcpy(t,p1);    strcpy(p1,p2);         strcpy(p2,t);

}

8 结构体、共用体、枚举

1、定义一个结构类型变量(包括年、月、日),实现输入一个日期显示它是该年第几天。

#include<stdio.h>

typedef struct date

{

    int year;

    int month;

    int day;

}DATE;

void main()

{

    DATE today;

    int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int i,sum=0;

    printf("请输入日期:");

    scanf("%d%d%d",&today.year,&today.month,&today.day);

    if(today.year%4==0 && today.year%100!=0 || today.year%400==0)

    {

        m[2]=29;

    }

    for(i=1;i<today.month;i++)

    {

        sum+=m[i];

    }

    sum+=today.day;

    printf("它是%d年的第%d天\n",today.year,sum);

}

2、定义一个结构类型数组(包括年、月、日),实现输入十个日期,按日期从大到小排序输出。

#include<stdio.h>

#define N 10

typedef struct date

{

   int year;

   int month;

   int day;

}DATE;

void temp(DATE *p1,DATE *p2);

void main()

{

   DATE today[N];

   int i,j;

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

   {

      printf("请输入日期:");

      scanf("%d%d%d",&today[i].year,&today[i].month,&today[i].day);

   }

  

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

   {

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

      {

          if(today[j].day<today[j+1].day)

          {

              temp(&today[j],&today[j+1]);

          }

      }

   }

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

   {

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

      {

          if(today[j].month<today[j+1].month)

          {

              temp(&today[j],&today[j+1]);

          }

      }

   }

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

   {

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

      {

          if(today[j].year<today[j+1].year)

          {

              temp(&today[j],&today[j+1]);

          }

      }

   }

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

   {

       printf("%d年%d月%d日\n",today[i].year,

today[i].month,today[i].day);

   }

}

void temp(DATE *p1,DATE *p2)

{

   DATE t;

   t=*p1;  *p1=*p2;    *p2=t;

}

3、编写程序,用结构体类型实现复数的加、减、乘、除运算,每种运算用函数完成。

方法一:

#include<stdio.h>

typedef struct complex

{

      float real;

      float imag;

}COMPLEX;

void add(COMPLEX *str,COMPLEX str1,COMPLEX str2);

void sub(COMPLEX *str,COMPLEX str1,COMPLEX str2);

void mul(COMPLEX *str,COMPLEX str1,COMPLEX str2);

void div(COMPLEX *str,COMPLEX str1,COMPLEX str2);

void main()

{

      COMPLEX str,str1,str2;

      char ch;

      printf("请输入复数的实部,虚部及运算:");

      scanf("%f%f %c%f%f",&str1.real,&str1.imag,&ch,&str2.real,&str2.imag);

      switch(ch)

      {

      case '+':

              add(&str,str1,str2);

              break;

      case '-':

              sub(&str,str1,str2);

              break;

      case '*':

              mul(&str,str1,str2);

              break;

      case '/':

              div(&str,str1,str2);

              break;

      default:

              printf("无效运算符\n");

              break;

      }

      if(str.imag>0)

      {

              printf("%0.1f+%0.1fi\n",str.real,str.imag);

      }

      else

      {

              printf("%0.1f%0.1fi\n",str.real,str.imag);

      }

}

void add(COMPLEX *str,COMPLEX str1,COMPLEX str2)

{

      str->real=str1.real+str2.real;

      str->imag=str1.imag+str2.imag;

}

     

void sub(COMPLEX *str,COMPLEX str1,COMPLEX str2)

{

      str->real=str1.real-str2.real;

      str->imag=str1.imag-str2.imag;

}

void mul(COMPLEX *str,COMPLEX str1,COMPLEX str2)

{

      str->real=str1.real*str2.real-str1.imag*str2.imag;

      str->imag=str1.real*str2.imag+str1.imag*str2.real;

}

void div(COMPLEX *str,COMPLEX str1,COMPLEX str2)

{

str->real=(str1.real*str2.real+str1.imag*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);

      str->imag=(str1.imag*str2.real-str1.real*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);

}

方法二:

#include<stdio.h>

typedef struct complex

{

      float real;

      float imag;

}COMPLEX;

COMPLEX add(COMPLEX str1,COMPLEX str2);

COMPLEX sub(COMPLEX str1,COMPLEX str2);

COMPLEX mul(COMPLEX str1,COMPLEX str2);

COMPLEX div(COMPLEX str1,COMPLEX str2);

void main()

{

      COMPLEX str,str1,str2;

      char ch;

      printf("请输入复数的实部,虚部及运算:");

      scanf("%f%f %c%f%f",&str1.real,&str1.imag,&ch,&str2.real,&str2.imag);

      switch(ch)

      {

      case '+':

              str=add(str1,str2);

              break;

      case '-':

              str=sub(str1,str2);

              break;

      case '*':

              str=mul(str1,str2);

              break;

      case '/':

              str=div(str1,str2);

              break;

      default:

              printf("无效运算符\n");

              break;

      }

      if(str.imag>0)

      {

              printf("%0.1f+%0.1fi\n",str.real,str.imag);

      }

      else

      {

              printf("%0.1f%0.1fi\n",str.real,str.imag);

      }

}

COMPLEX add(COMPLEX str1,COMPLEX str2)

{ COMPLEX str;

      str.real=str1.real+str2.real;

      str.imag=str1.imag+str2.imag;

return str;

}

     

COMPLEX sub(COMPLEX str1,COMPLEX str2)

{ COMPLEX str;

      str.real=str1.real-str2.real;

      str.imag=str1.imag-str2.imag;

return str;

}

COMPLEX mul(COMPLEX str1,COMPLEX str2)

{ COMPLEX str;

      str.real=str1.real*str2.real-str1.imag*str2.imag;

str.imag=str1.real*str2.imag+str1.imag*str2.real;

return str;

}

COMPLEX div(COMPLEX str1,COMPLEX str2)

{ COMPLEX str;

str.real=(str1.real*str2.real+str1.imag*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);

      str.imag=(str1.imag*str2.real-str1.real*str2.imag)/(str2.real*str2.real+str2.imag*str2.imag);

return str;

}

4、定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下: 

struct date

{        int month;

        int day;

        int year;

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

       float ave;

    };

1)定义输入单个学生信息的函数Input(struct stu *a) ;

2)定义输出单个学生信息的函数Output(struct stu a) ;

3)定义输入一批学生信息的函数Inputarray(struct stu a[ ],int n);

4)定义输出一批学生信息的函数Outputarray(struct stu a[ ],int n));

5)请编写按姓名进行查找的函数Searchname,若找到,返回表示该学生的信息,不排除有有同名同姓的情况;否则,返回 查无此人。

6)请编写函数Sortname,它的功能是:按每个学生的名字由小到大输出学生的记录。

编程建立的结构体数组通过输入输入存放全班(最多50人)学生信息,按学生的姓名从到大排序,输出学生的所有信息。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define N 50

struct date

{        int year;

         int month;

        int day;      

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

          float ave;

    };

void input(struct stu *s);

void output(struct stu s);

void inputarray(struct stu s[],int n);

void outputarray(struct stu s[],int n);

void Searchname(struct stu *tp,int n);

void Sortname(struct stu *tp,int n);

main()

{   

int n;

struct stu s[50];

n=3;       //假设1班有3名学生

printf("请输入本班共%d个学生信息:\n",n);

inputarray(s,n);     //从键盘输入学生数据

printf("本班共%d个学生信息:\n",n);

outputarray(s,n);

Searchname(s,n);

printf("排序后的学生信息:\n");

outputarray(s,n);

printf("\n");

}

void input(struct stu *s)

{ int j;

      printf("请输入学生学号:");

      scanf("%d",&(*s).num);

    printf("请输入学生姓名:");

      scanf("%s",(*s).name);

      printf("请输入学生性别:");

      scanf(" %c",&(*s).sex);

      printf("请输入学生的出生年月日: ");

      scanf("%d%d%d",&(*s).birthday.year,&(*s).birthday.month,

&(*s).birthday.day);

      printf("请输入学生的4科成绩: ");

      (*s).ave=0;

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

      {

              scanf("%f",&(*s).score[j]);

              (*s).ave+=(*s).score[j];

      }

      (*s).ave =(*s).ave/4.0;

      }

void output(struct stu s)

{

      int j;

      printf("学号:%d\n姓名:%s\n性别:%c\n",s.num,s.name,s.sex,s.score);

          printf("出生年月日:%d-%d-%d\n", s.birthday.year, s.birthday.month,

                                                       s.birthday.day);

      printf("成绩:");

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

      {

              printf("%6.1f\t",s.score[j]);

      }     

      printf("%6.1f\n",s.ave);

}

void inputarray(struct stu *s,int n)

{ int i,j;

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

      {

      printf("请输入学生学号:");

      scanf("%d",&(s[i]).num);

    printf("请输入学生姓名:");

      scanf("%s",(s[i]).name);

      printf("请输入学生性别:");

      scanf(" %c",&(s[i]).sex);

      printf("请输入学生的出生年月日: ");

      scanf("%d%d%d",&(s[i]).birthday.year,&(s[i]).birthday.month,

&(s[i]).birthday.day);

      printf("请输入学生的4科成绩: ");

      (s[i]).ave=0;

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

      {

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

              (s[i]).ave+=(s[i]).score[j];

      }

      (s[i]).ave =(s[i]).ave/4.0;

      }

}

void outputarray(struct stu s[],int n)

{

      int i,j;

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

      {

      printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);

          printf("出生年月日:%d-%d-%d\n", s[i].birthday.year, s[i].birthday.month,

                                                       s[i].birthday.day);

              printf("成绩:");

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

              {

                      printf("%6.1f\t",s[i].score[j]);

              }     

              printf("%6.1f\n",s[i].ave);

      }

}

void Searchname(struct stu *tp,int n)

{

      int i,flag=0;

      char f[N];

      printf("请输入要查找的学生姓名:");

      getchar();

      gets(f);

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

      {

              if((strcmp(tp[i].name,f))==0)

              {

                      output(tp[i]);

                      flag=1;

              }

      }

      if(flag==0)

              printf("查无此人\n");

      printf("\n");

}

void Sortname(struct stu *tp,int n)

{

      int i,j;

      struct stu p;

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

      {

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

              {

                      if((strcmp(tp[j].name,tp[j+1].name))>0)

                      {

               p=tp[j];

              tp[j]=tp[j+1];

                               tp[j+1]=p;

                      }

              }

      }

     

}

5、已知一无符号的整数占用了4个字节的内存空间,现欲从低位存储地址开始,将其每个字节作为单独的一个ASCII码字符输出,试用共同体类型实现上述转换。

#include<stdio.h>

 union  change

{

      int  a;// 共用内存空间

      char b[4];//表示a的四个字节

 };

void  main ()

{

    union  change  nm;

    int  i;

    scanf("%d",&nm.a);

    for(i = 0; i<sizeof(int);i++)

    printf("%d个字节为:%d\n ",i+1,nm.b[i]);

    printf("\n");

}

6、已知一长度为2个字节的整数,现欲将其高位字节与低位字节相互交换后输出,试用共同体类型实现这一功能。

#include<stdio.h>

 union number

{

      short int num;

      char ch[2];

};

void main()

{

      char temp;

      union number a;

      scanf("%d",&a.num);

      temp=a.ch[0];           //交换高低位字节

      a.ch[0] = a.ch[1];

      a.ch[1] = temp;

      printf("高低位字节交换后为:%d\n",a.num);

}

7、 现在有教师(姓名、单位、住址、职称)和学生(姓名、班级、住址、入学成绩)的信息。请在输入10名教师和学生的信息后,按姓名进行排序,最后按排序后的顺序进行输出,对于教师要输出姓名、单位、住址和职称,对学生要输出姓名、班级、住址和入学成绩。请编程实现。  

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define N 30

union categ1

{

              int score;                         //入学成绩

              char title[20];           //职称

};

union categ2

{

              char grade[20];           //班级

         char position[20];             //部门

 };

typedef struct information

{                   

      char name[20];         //成员姓名

      char addr[20];

      char job;

      union categ1 category1;

      union categ2 category2;  

}PERSON;

void output(PERSON per[],int n);

void input(PERSON per[],int n);

void sort(PERSON per[],int n);

int main()

{

      PERSON person[N];

      int n;

      printf("有多少成员: ");

      scanf("%d",&n);

      input(person,n);

      printf("老师和学生的信息:\n");

      output(person,n);

      printf("排序后老师和学生的信息:\n");

      sort(person,n);

      output(person,n);

}

void input(PERSON per[],int n)

{

      int i;

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

      {

              printf("请问输入的是老师还是学生的信息(st)\n");

              scanf(" %c",&per[i].job);        

              if(per[i].job=='s')

              {      printf("请输入学生的姓名:\n");

                  scanf("%s",per[i].name);

                      printf("请输入学生的班级:\n");

                  scanf("%s",per[i].category2.grade);

                      printf("请输入学生的住址:\n");

                  scanf("%s",per[i].addr);           

                  printf("请输入学生的入学成绩:\n");

                  scanf("%d",&( per[i].category1.score) );                  

              }

              else if(per[i].job=='t')

              {

                      printf("请输入老师的姓名:\n");

                  scanf("%s",per[i].name);

                      printf("请输入老师的单位:\n");

                  scanf("%s",per[i].category2.position );

                      printf("请输入老师的住址:\n");

                  scanf("%s",per[i].addr);           

                  printf("请输入老师的职称:\n");

                  scanf("%s", per[i].category1.title  );

                     

              }

              else

                      printf("输入有误\n");

      }

      printf("\n");

}

void output(PERSON per[],int n)

{

              int i;

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

      {

              if(per[i].job=='s')

              {     

                      printf("学生\t");            

                  printf("%s\t",per[i].name);

                  printf("%s\t",per[i].category2.grade);

                  printf("%s\t",per[i].addr);        

                 printf("%d\n", per[i].category1.score );                      

              }

              else if(per[i].job=='t')

              {

                      printf("老师\t");      

                  printf("%s\t",per[i].name);

                  printf("%s\t",per[i].category2.position );

                  printf("%s\t",per[i].addr);        

                  printf("%s\n", per[i].category1.title  );

                     

              }

      }     

      printf("\n");

     

}

void sort(PERSON per[],int n)

{

      int i,j;

      PERSON temp;

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

      {

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

              {

                      if(strcmp(per[i].name,per[j].name)<0)

                      {

                               temp=per[i];

                               per[i]=per[j];

                               per[j]=temp;

                      }

              }

      }

}

8、请定义枚举类型score,用枚举元素代表成绩的等级,如:90分以上为优(excellent),80—89分之间为良(good),60-79分之间为中(general),60分以下为差(fail),通过键盘输入一个学生的成绩,然后输出该生成绩的等级。

#include<stdio.h>

enum score

{

      excellent=90,good=80,general=60,fail=0

};

main()

{

      int n;

      printf("please input:");

      scanf("%d",&n);

      if(n>=excellent)

              printf("等级为优\n");

      else

      {

              if(n>=good)

                      printf("等级为良\n");

              else

              {

                      if(n>=general)

                               printf("等级为中\n");

                      else

                               printf("等级为差\n");

              }

      }

}

9、请定义枚举类型money,用枚举元素代表人民币的面值。包括1,2,5分;1,2,5角;1,2,,5,10,50,100元。从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量,要求显示100元、50元、10元、5元、2元、1元、1角、5分、1分各多少张。

#include<stdio.h>

typedef enum money

{

fen1=1,fen2,fen5,jiao1,jiao2,jiao5,yuan1,yuan2,yuan5,yuan10,yuan50,yuan100

}MONEY;

void main()

{

      int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;

      int n;

      double m;

      printf("请输入金额:");

      scanf("%lf",&m);

      for( ; ; )

      {

              if(m>=100)

              {

                      n=12;

                      m=m-100;

              }

              else if(m>=50)

              {

                      n=11;

                      m=m-50;

              }

              else if(m>=10)

              {

                      n=10;

                      m=m-10;

              }

              else if(m>=5)

              {

                      n=9;

                      m=m-5;

              }

              else if(m>=2)

              {

                      n=8;

                      m=m-2;

              }

              else if(m>=1)

              {

                      n=7;

                      m=m-1;

              }

              else if(m>=0.1)

              {

                      n=4;

                      m=m-0.1;

              }

              else if(m>=0.05)

              {

                      n=3;

                      m=m-0.05;

              }

              else if(m>=0.01)

              {

                      n=1;

                      m=m-0.01;

              }

              switch(n)

              {

              case yuan100:

                      a++;

                      break;

              case yuan50:

                      b++;

                      break;

              case yuan10:

                      c++;

                      break;

              case yuan5:

                      d++;

                      break;

              case yuan2:

                      e++;

                      break;

              case yuan1:

                      f++;

                      break;

              case jiao1:

                      g++;

                      break;

              case fen5:

                      h++;

                      break;

              case fen1:

                      i++;

                      break;

              default:

                      printf("input error\n");

                      break;

              }

              if(m<0.01)

              {

                      i++;

                      break;

              }

      }

      printf("100元有%d\n",a);

      printf("50元有%d\n",b);

      printf("10元有%d\n",c);

      printf("5元有%d\n",d);

      printf("2元有%d\n",e);

      printf("1元有%d\n",f);

      printf("1角有%d\n",g);

      printf("5分有%d\n",h);

      printf("1分有%d\n",i);

}

9 动态内存分配

1、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个整数,然后求这10个整数中的最大值。 

#include<stdio.h>

#include<stdlib.h>

main()

{

int  i, n, *p;                //p是一个指向int型变量的指针变量

n=10;

if( (  p=(int *) malloc(n*sizeof(int))  )  ==  NULL)

{

printf("不能成功分配存储空间。\n");

exit(0);

}

for (i=0;i<n;i++)       //给数组赋值

          scanf(“%d”,p+i);   // p+i等价于 &p[i]

max=p[0];

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

{

if( *(p+i) > max)

max= *(p+i);    //*(p+i) 等价于p[i]

}

for(i=0; i<n;i++) /*打印数组元素*/

          printf(“%2d”,p[i]);

printf(“\nmax=%d\n”,max);

free(p);

}

2、定义一个动态数组,长度为变量n,用随机函数给数组各元素赋值。然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void sort(int *a,int n);

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

void main()

{

        int *p=NULL;

        int i,n;

        printf("input n:");

        scanf("%d",&n);

        if((p=(int *) malloc (n*sizeof(int)))==NULL)

        {

                 printf("不能成功分配内存单元\n");

                 exit(0);

        }

        srand(time(NULL));

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

        {

                 p[i]=rand() % 100 + 1;

        }

        sort(p,n);

        printf("排序后为:");

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

        {

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

        }

        printf("\n");

}

void sort(int *a,int n)

{

        int i,j;

        int temp;

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

        {

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

                 {

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

                         {

                                  swap(&a[j],& a[j+1]);                             

                         }

                 }

        }

}

void swap(int *p1,int *p2)

{

        int t;

        t=*p1;     *p1=*p2;   *p2=t;

}

3、用头插法创建一个存放整数的单链表,以输入-1做结束标志,并打印输出单链表。

#include <stdio.h>

#include<stdlib.h>

struct node

{

int data;

struct node *next;

} ;

typedef  struct  node  LNode; 

typedef  struct  node * LinkList; 

void CreateHeadList (LinkList  L);  

void OutputList(LinkList L);      

void DestroyList(LinkList  L);     

main()

{

LinkList  head;          //定义一个LinkList 型的变量head

if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

      { 

            printf("申请空间失败!"); 

            exit(0); 

       } 

       head ->next=NULL;      //新建了一个空的单链表head

CreateHeadList ( head);     //用头插法输入数据创建各结点

OutputList(head);         //输出以head为头的链表各结点的值

DestroyList (head);        //销毁以head为头的链表各结点

}

/*定义插法创建带头结点的单链表的函数*/

void CreateHeadList(LinkList  L) 

{      LNode *p;

int  x, flag=-1; 

      scanf("%d",&x);

while (x != flag)

      { 

if( ( p =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

              { 

                   printf("申请空间失败!"); 

                   exit(0); 

            } 

            p->data=x;      //x的数据类型为int

            p->next=L->next; 

            L->next=p; 

        scanf("%d",&x);

      } 

/*定义输出带头结点的单链表的函数*/

void OutputList(LinkList  head) 

{

struct node *p;

p=head->next ;           //取得链表的头指针

while(p!=NULL)    //只要p指向的结点非空

{

printf("%d\t",p->data);       //p->data数据类型为int

p=p->next;                 //p指向该结点的下一个结点

}

printf("\n");

}

/*定义销毁带头结点的单链表的函数*/

void  DestroyList (LinkList  head)

{

struct node  *p, *q;

p=head;              //取得链表的头指针

while(p!=NULL)       //只要p指向的结点非空

{

q=p->next;        //p的下一个结点的地址保存在q

free(p);           //释放p指向的结点

p=q;             

}

}

4、用尾插法创建一个存放整数的单链表,以输入-1做结束标志,并打印输出单链表。然后求这批整数中的最大值。

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

typedef  int  ElemType;

struct  node

{

ElemType  data;          //数据成员data类型为ElemType类型

struct node  * next;

} ;

typedef  struct node  LNode; 

typedef  struct node * LinkList; 

void input(ElemType *s);

void output(ElemType s);

int compare(ElemType a,ElemType b);

void CreateTailList (LinkList L);//用头插法创建一个单链表L

void OutputList (LinkList  L);//输出以L为头的单链表各结点的值

LNode * searchmax(LinkList L);

void DestroyList (LinkList  L);

int  main()

{

LNode * max;

LinkList  head;       //head是保存单链表的表头结点地址的指针

if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

                {    printf("申请空间失败!"); 

exit(0); 

head->next=NULL; 

CreateTailList(head);

printf("创建的单链表:\n");

OutputList(head);

max=searchmax(head);

printf("最大值:\n");

 output(max->data );

printf("\n");

DestroyList (head);

}

//用尾插法创建带头结点的单链表

void CreateTailList(LinkList  L) 

{    

ElemType flag=-1,x;

LNode *p,* tail;

 int i=0;

 tail=L;              //设置尾指针,方便插入

 input(&x);      //xchar型变量;

while ( compare(x,flag)!=0)

       { 

                      p=(LNode *)malloc(sizeof(LNode)); 

            if(p==NULL) 

                     { 

                           printf("申请空间失败!"); 

                exit(0); 

                         } 

            p->data=x;           //x的实际数据类型为struct stu

                      p->next=NULL; 

                     tail->next=p; 

tail=p; 

input(&x);

       } 

void OutputList (LinkList  head)//输出以head为头的链表各结点的值

{

struct node *p;

p=head->next ;//取得链表的头指针

while(p!=NULL)//只要是非空表

{

output(p->data);    //调用output(p->data)输出结点的数据

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

}

printf("\n");    

}

void  DestroyList (LinkList  head)//输出以head为头的链表各结点的值

{

struct node *p,*q;

p=head;           //取得链表的头指针

while(p!=NULL)    //只要是非空表

{

q=p->next;

free(p);

p=q;

}

}

void input(ElemType *s)

{     

        scanf("%d",&(*s));   

}

void output(ElemType s)

{

printf("%d\t",s);

}

int compare(ElemType  a, ElemType b)

{

 if (a==b)

     return 0;

 else

    if (a<b)

     return -1;

                         else

     return 1;

}

LNode * searchmax (LinkList  list)

{

        LinkList  p = list->next;//上一个节点的指针

        LNode *  max ;//当前节点

        max=p ;

        while(p)

        {

                 if(compare(p->data ,max->data)>0)

                 {

                         max=p ;

                 }

                 p  = p->next;

        }

        return max;

}

5、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个字符串,然后求10个字符串的最大值。 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

char max[20],**cs;   //假设输入的字符串最大长度为19

int i,n;

n=10;

if(  (  cs=( char ** ) malloc(  n*sizeof(char*)  ) ) == NULL)

//申请长度为n的指针数组

{

printf(“不能成功分配存储空间。\n”);

exit(1);

}

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

{   //循环申请长度为20的字符数组

//并将每次申请的字符数组的地址存放在相应的指针数组元素里

if( ( cs[i] = (char *) malloc(20*sizeof(char) )) == NULL )

{  

printf(“不能成功分配存储空间。\n”);

     exit(1);

}

}

fflush(stdin);             //清空输入缓冲区

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

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

{

gets(cs[i]);

}

printf("\n");

strcpy(max,cs[0]);

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

{

if( strcmp(cs[i],max)>0)

strcpy(max,cs[i]);

}

printf(“输入的%d字符串如下:\n”,n);

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

{

puts(cs[i]);

}

printf(“最大的字符串是:%s\n”,max);

printf("\n");

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

{

free(cs[i]);

}

free(cs);

return 0;

}

6、已知head指向一个带头结点的单向链表,链表中每个结点包含字符型数据域(data)和指针域(next)。请编写程序实现如图所示链表的逆置。

若原链表为:

head

//

a

b

c

d

^

head

//

d

c

b

a

^

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

typedef  char  ElemType;

struct  node

{

        ElemType  data;          //数据成员data类型为ElemType类型

        struct node  * next;

} ;

typedef  struct node  LNode; 

typedef  struct node * LinkList; 

void input(ElemType *s);

void output(ElemType s);

int compare(ElemType a,ElemType b);

void CreateTailList (LinkList L);

void OutputList (LinkList  L);

void reverse (LinkList  L);

void DestroyList (LinkList  L);

int  main()

{

        LinkList  head;      

        if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

       {   

                 printf("申请空间失败!"); 

                 exit(0); 

        } 

        head->next=NULL; 

        CreateTailList(head);

        printf("创建的单链表:\n");

        OutputList(head);

        printf("逆置后单链表:\n");

        reverse(head);

        OutputList(head);

        DestroyList (head);

        return 0;

}

//用尾插法创建带头结点的单链表

void CreateTailList(LinkList  L) 

{    

        ElemType flag='\n',x;

        LNode *p,* tail;

        int i=0;

        tail=L;              //设置尾指针,方便插入

        input(&x);      //xchar型变量;

        while ( compare(x,flag)!=0)

       { 

              p=(LNode *)malloc(sizeof(LNode)); 

                 if(p==NULL) 

            { 

                   printf("申请空间失败!"); 

                         exit(0); 

                 } 

                 p->data=x;                                                //x的实际数据类型为struct stu

              p->next=NULL; 

                 tail->next=p; 

                 tail=p; 

                 input(&x);

         } 

void OutputList (LinkList  head)

{

        struct node *p;

        p=head->next ;

        while(p!=NULL)

        {

                 output(p->data);                               //调用output(p->data)输出结点的数据

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

        }

        printf("\n");    

}

void  DestroyList (LinkList  head)//输出以head为头的链表各结点的值

{

        struct node *p,*q;

        p=head;          

        while(p!=NULL)   

        {

                 q=p->next;

                 free(p);

                 p=q;

        }

}

void input(ElemType *s)

{     

        scanf("%c",&(*s));

           

}

void output(ElemType s)

{

        printf("%c\t",s);

}

int compare(ElemType  a, ElemType b)

{

        if (a==b)

                 return 0;

        else

                 if (a<b)

                         return -1;

                 else

                         return 1;

}

void reverse (LinkList  L)

{  //逆置head指针所指向的单循环链表

   LNode *p, *q;

   p=L->next;

   L->next = NULL;

   while (p!=NULL)  //当表不为空时,逐个结点逆置

   {

      q = p->next;

      p->next = L->next;

      L->next = p;

          p=q;

    }

  

  }

7、已知head指向一个带头结点的单向链表,链表中每个结点包含字符串数据域(data)和指针域(next)。请编写程序实现如图所示链表的逆置。

   

若原链表为:

head

//

Shanghai

Beijing

Hangzhou

Guangzhou

^

head

//

Guangzhou

Hangzhou

Beijing

Shanghai

^

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

typedef  char  ElemType[20];

struct  node

{

        ElemType  data;                     //数据成员data类型为ElemType类型

        struct node  * next;

} ;

typedef  struct node  LNode; 

typedef  struct node * LinkList; 

void input(ElemType *s);

void output(ElemType s);

int compare(ElemType a,ElemType b);

void CreateTailList (LinkList L);

void OutputList (LinkList  L);

void reverse (LinkList L);

void DestroyList (LinkList  L);

int  main()

{

        LinkList  head;                                      

        if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

       {

                 printf("申请空间失败!"); 

                 exit(0); 

        } 

        head->next=NULL; 

        CreateTailList(head);

        printf("创建的单链表:\n");

        OutputList(head);

        printf("逆置后单链表:\n");

        reverse(head);

        OutputList(head);

        DestroyList (head);

        return 0;

}

//用尾插法创建带头结点的单链表

void CreateTailList(LinkList  L) 

{    

        ElemType flag="stop",x;

        LNode *p,* tail;

                int i=0;

                tail=L;                                                                //设置尾指针,方便插入

                input(&x);                                                         //xchar[20]类型

        while ( compare(x,flag)!=0)

                { 

                              p=(LNode *)malloc(sizeof(LNode)); 

                                  if(p==NULL) 

                             { 

                                   printf("申请空间失败!"); 

                                          exit(0); 

                                  } 

                                  strcpy(p->data,x);           //x的实际数据类型为char[20]

                              p->next=NULL; 

                             tail->next=p; 

        tail=p; 

        input(&x);

       } 

void OutputList (LinkList  head)

{

        struct node *p;

        p=head->next ;

        while(p!=NULL)

        {

        output(p->data);                 //调用output(p->data)输出结点的数据

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

        }

        printf("\n");    

}

void  DestroyList (LinkList  head)

{

        struct node *p,*q;

        p=head;           //取得链表的头指针

        while(p!=NULL)    //只要是非空表

        {

        q=p->next;

        free(p);

        p=q;

        }

}

void input(ElemType *s)

{     

        scanf("%s",(*s));

           

}

void output(ElemType s)

{

        printf("%s\t",s);

}

int compare(ElemType  a, ElemType b)

{

        if (strcmp(a,b)==0 )

                 return 0;

        else

                 if ( strcmp(a,b)<0 )

                         return -1;

                 else

                         return 1;

}

void reverse (LinkList  L)

{  //逆置head指针所指向的单循环链表

   LNode *p, *q;

   p=L->next;

   L->next = NULL;

   while (p!=NULL)  //当表不为空时,逐个结点逆置

   {

      q = p->next;

      p->next = L->next;

      L->next = p;

          p=q;

    }  

  }

8、用尾插法创建一个存放字符串的单链表,以输入"stop"做结束标志,并打印输出单链表。然后求这批字符串的最大值。

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

typedef  char  ElemType[20];

struct  node

{

ElemType  data;          //数据成员data类型为ElemType类型

struct node  * next;

} ;

typedef  struct node  LNode; 

typedef  struct node * LinkList; 

void input(ElemType *s);

void output(ElemType s);

int compare(ElemType a,ElemType b);

void CreateTailList (LinkList L);//用头插法创建一个单链表L

void OutputList (LinkList  L);//输出以L为头的单链表各结点的值

LNode * searchmax(LinkList L);

void DestroyList (LinkList  L);

int  main()

{

LNode * max;

LinkList  head;       //head是保存单链表的表头结点地址的指针

if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

        {    printf("申请空间失败!"); 

exit(0); 

head->next=NULL; 

CreateTailList(head);

printf("创建的单链表:\n");

OutputList(head);

max=searchmax(head);

printf("最大值:\n");

        output(max->data );

printf("\n");

DestroyList (head);

}

//用尾插法创建带头结点的单链表

void CreateTailList(LinkList  L) 

{     

ElemType flag="stop",x;

LNode *p,* tail;

int i=0;

        tail=L;              //设置尾指针,方便插入

        input(&x);      //xchar型变量;

while ( compare(x,flag)!=0)

        { 

                       p=(LNode *)malloc(sizeof(LNode)); 

            if(p==NULL) 

             { 

                            printf("申请空间失败!"); 

                exit(0); 

                 } 

           strcpy( p->data,x);           //x的实际数据类型为char [20]

                       p->next=NULL; 

             tail->next=p; 

tail=p; 

input(&x);

        } 

void OutputList (LinkList  head)//输出以head为头的链表各结点的值

{

struct node *p;

p=head->next ;//取得链表的头指针

while(p!=NULL)//只要是非空表

{

output(p->data);    //调用output(p->data)输出结点的数据

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

}

printf("\n");     

}

void  DestroyList (LinkList  head)//输出以head为头的链表各结点的值

{

struct node *p,*q;

p=head;           //取得链表的头指针

while(p!=NULL)    //只要是非空表

{

q=p->next;

free(p);

p=q;

}

}

void input(ElemType *s)

{      

scanf("%s",(*s));         

}

void output(ElemType s)

{

printf("%s\t",s);

}

int compare(ElemType  a, ElemType b)

{

 if ( strcmp(a,b)==0)

     return 0;

 else

    if (strcmp(a,b)<0)

     return -1;

                 else

     return 1;

}

LNode * searchmax (LinkList  list)

{

LinkList  p = list->next;//上一个节点的指针

LNode *  max ;//当前节点

max=p ;

while(p)

{

         if(compare(p->data ,max->data)>0)

         {

                 max=p ;

         }

         p  = p->next;

}

return max;

}

9、请编写程序,利用malloc函数开辟动态存储单元,顺序存放输入的10个学生数据,学生信息包含学号,姓名,性别,出生日期、分数,然后输出这10个学生中的平均分最高的学生的全部信息。定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下: 

struct date

{        int month;

        int day;

        int year;

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

     float ave;

    };

源代码:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct date

{        int year;

         int month;

        int day;

      

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

    float ave;

    };

void output(struct stu s)

{

int j;

printf("学号:%d\n姓名:%s\n性别:%c\n",s.num,s.name,s.sex,s.score);

    printf("出生年月日:%d-%d-%d\n", s.birthday.year, s.birthday.month,

                                                       s.birthday.day);

printf("成绩:");

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

{

         printf("%6.1f\t",s.score[j]);

}     

printf("%6.1f\n",s.ave);

}

void input(struct stu *s)

{ int j;

printf("请输入学生学号:");

scanf("%d",&(*s).num);

    printf("请输入学生姓名:");

scanf("%s",(*s).name);

printf("请输入学生性别:");

scanf(" %c",&(*s).sex);

printf("\n请输入学生的出生年月日: ");

scanf("%d%d%d",&(*s).birthday.year,&(*s).birthday.month,

&(*s).birthday.day);

printf("\n请输入学生的4科成绩: ");

(*s).ave=0;

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

{

         scanf("%f",&(*s).score[j]);

         (*s).ave+=(*s).score[j];

}

(*s).ave =(*s).ave/4.0;

}

main()

{   

int i,k,n;

struct stu *ps;

printf("请输入动态数组的大小:\n");

scanf("%d",&n);

ps=(struct stu*)malloc(n*sizeof(struct stu));

if(ps == NULL)

{

printf("不能成功分配存储空间。\n");

    exit(1);

}

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

{

    input(ps+i);     //从键盘输入学生数据

}

k=0;

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

{

if( ps[k].ave < ps[i].ave )

{

      k=i;

}

}

printf("本班共%d个学生信息:\n",n);

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

{

    output(ps[i]);

}

printf("本班%d个学生中的分数最高的学生是第%d个学生:\n",n,k+1);

output(ps[k]);

printf("\n");

free(ps);

}

10、请编写程序,利用malloc函数开辟动态存储单元,链式存放输入的10个学生数据,学生信息包含学号,姓名,性别,出生日期、分数,然后输出这10个学生中的平均分最高的学生的全部信息。定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下: 

struct date

{        int month;

        int day;

        int year;

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

       float ave;

    };

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

typedef struct date

{

int year;

int month;

int day;

}DATE;

struct stu

{

      int num;

      char name[20];

      char sex;

  DATE birthday;

      float score;

};

typedef  struct stu  ElemType;

struct  node

{

ElemType  data;          //数据成员data类型为ElemType类型

struct node  * next;

};

typedef  struct node  LNode; 

typedef  struct node * LinkList; 

void Input(ElemType *s);

void output(ElemType s);

int compare(ElemType a,ElemType b);

void CreateTailList (LinkList L);     //用头插法创建一个单链表L

void OutputList (LinkList  L);       //输出以L为头的单链表各节点的值

void DeleteList (LinkList  L);

int  main()

{

LinkList  head;                //head是保存单链表的表头结点地址的指针

if( ( head =(LNode *) malloc( sizeof(LNode) ) )==NULL) 

         printf("申请空间失败!"); 

         exit(0); 

head->next=NULL; 

CreateTailList(head);             //把所新建的单链表表头地址赋给head

OutputList(head);

DeleteList(head);

return 0;

}

/*用尾插法创建带头结点的单链表*/

void CreateTailList(LinkList  L) 

LNode *p,* tail;

ElemType x,flag={0,"",'\0',0}; 

    tail=L;         //设置尾指针,方便插入

Input(&x);

while ( compare(x,flag)!=0)

         p=(LNode *)malloc(sizeof(LNode)); 

         if(p==NULL) 

         { 

                 printf("申请空间失败!"); 

                 exit(0); 

         } 

         p->data=x; //x的数据类型为字符数组时,要调用字符串拷贝函数strcpy()

         p->next=NULL; 

         tail->next=p; 

         tail=p; 

         Input(&x);

}

/*输出以head为头的链表各节点的值*/

void OutputList (LinkList  head)

{

struct node *p;

p=head;                         //取得链表的头指针

while(p!=NULL)                 //只要是非空表

{

output(p->data);       //不论data成员为什么类型,都可调用output(p->data)输出节点的数据

p=p->next;                      //p指向下一个节点

}

}

/*输出以head为头的链表各节点的值*/

void  DeleteList (LinkList  head)

{

struct node *p,*q;

p=head;                                                               //取得链表的头指针

while(p!=NULL)                      

{

         q=p->next;

         free(p);

         p=q;

}

}

void Input(ElemType *s)

{

printf("请输入学生学号:");

scanf("%d",&(*s).num);

    printf("请输入学生姓名:");

scanf("%s",(*s).name);

printf("请输入学生性别:");

scanf(" %c",&(*s).sex);

printf("请输入学生出生日期:");

scanf("%d%d%d",&(*s).birthday.year,& (*s).birthday.month,

                 &(*s).birthday.day);

printf("请输入学生成绩:");

scanf("%f",&(*s).score);

}

void output(ElemType s)

{

printf("学号:%d\n姓名:%s\n性别:%c\n出生日期:%d%d%d\n成绩:%6.1f\n",

         s.num,s.name,s.sex,s.birthday.year,s.birthday.month,

         s.birthday.day,s.score);

}

int compare(ElemType  a, ElemType b)

{

if (a.num==b.num)

         return 0;

   else

         if (a.num<b.num)

                 return -1;

         else

                 return 1;

}

10 文件

1、根据程序提示从键盘输入一个已存在的文本文件的完整文件名,并再输入一个新文本文件的完整文件名,然后编程将已存在文本文件中的内容全部拷贝到新文本文件中去,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。

#include <stdio.h>

#include <stdlib.h>

int main( )

FILE *in,*out;

char  ch,infile[40],outfile[40];  

printf("输入读入文件的名字:");      //输入已存在的文件名

scanf("%s",infile);  

if((in=fopen(infile,"r"))==NULL)     //文件指针in指向读入文件

        {      printf("无法打开此文件\n");

     exit(0 );                  //如果文件打开失败,退出系统

}  

printf("输入输出文件的名字:");   //输入要创建的文件名

scanf("%s",outfile);  

if((out=fopen(outfile,"w"))==NULL)   //文件指针out指向输出文件

{       printf("无法打开此文件\n");

exit(0);

}

while(!feof(in))      //检查输入文件当前文件位置指针是否移到文件末尾

{   ch=fgetc(in);    //从读入文件中读出一个字符

    fputc(ch,out);   //将此字符写入到输出文件

putchar(ch);     //将此字符输出到显示器

}

putchar(10);         //输出换行符

fclose(in);                        //关闭读入文件

        fclose(out);                       //关闭输出文件

return 0;

}

                                                                                                                                 

2、根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将源文本文件的内容追加到目的文本文件的原内容之后,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。

#include <stdio.h>

#include <stdlib.h>

#include<ctype.h>

int main( )

{

FILE *p,*q;

char  ch,file1[40],file2[40];  

    printf("输入源文件的名字:");  

 scanf("%s",file1);  

 if((p=fopen(file1,"r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

printf("输入目的文件的名字:");  

scanf("%s",file2);  

 if((q=fopen(file2,"a+"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                    

}

printf("源文件的内容:\n");

while(!feof(p))      /*检查当前文件位置指针是否移到文件末尾*/

 {  

         ch=fgetc(p);

         printf("%c",ch);

         fputc(ch,q);  

 }

rewind(q);

    printf("\n目的文件的内容:\n");

while( !feof(q) )

{

         ch = fgetc(q);

         printf("%c",ch);

}

fclose(p);  

fclose(q); 

return 0;

}

3、编写一个程序,把一个文件的内容复制到另一个文件上,在复制时把大写字母改为小写字母,其它字符保持不变,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。

#include <stdio.h>

#include <stdlib.h>

#include<ctype.h>

int main( )

{

FILE *p,*q;

char  ch,file1[40],file2[40];  

    printf("输入源文件的名字:");  

scanf("%s",file1);  

 if((p=fopen(file1,"r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

printf("输入目的文件的名字:");  

scanf("%s",file2);  

 if((q=fopen(file2,"w"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                    

}

printf("源文件的内容:\n");

while(!feof(p))      /*检查当前文件位置指针是否移到文件末尾*/

 {  

         ch=fgetc(p);

         printf("%c",ch);

         if( islower(ch) )

                 ch -=32;

         fputc(ch,q);  

 }

fclose(p);  

fclose(q);

if((q=fopen(file2,"r"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                    

}

printf("\n目的文件的内容:\n");

while( !feof(q) )

{

         ch = fgetc(q);

         printf("%c",ch);

}

fclose(q); 

return 0;

}

4、根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将源文本文件的内容追加到目的文本文件的原内容之前,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。

#include <stdio.h>

#include <stdlib.h>

int main( )

{

FILE *in1,*out,*in2;

char  ch,file1[20],file2[20];  

    printf("输入源文件的名字:");  

scanf("%s",file1);  

 if((in1=fopen(file1,"r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

printf("输入要目的文件的名字:");  

scanf("%s",file2);  

if((in2=fopen(file2,"r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

if((out=fopen("temp.txt","w"))==NULL)

         printf("无法打开此文件\n");

         exit(0);

}

while(!feof(in2))    

 {  

         ch=fgetc(in2);

         fputc(ch,out);

 }

fclose(in2);

fclose(out);

if((out=fopen(file2,"w"))==NULL) 

         printf("无法打开此文件\n");

         exit(0);

}

if((in2=fopen("temp.txt","r"))==NULL)

         printf("无法打开此文件\n");

         exit(0);

}

printf("源文件的内容:\n");  

while(!feof(in1))      /*检查当前文件位置指针是否移到文件末尾*/

 {  

         ch=fgetc(in1);

         fputc(ch,out);

         putchar(ch);    

 }

while(!feof(in2))      /*检查当前文件位置指针是否移到文件末尾*/

 {  

         ch=fgetc(in2);

         fputc(ch,out);          

 }

    fclose(in1);

fclose(in2);

fclose(out);

printf("\n目的文件内容:\n");

if((in1=fopen(file2,"r"))==NULL) 

         printf("无法打开此文件\n");

         exit(0);

}

while( !feof(in1) )

{

         ch = fgetc(in1);

         putchar(ch);

}

fclose(in1);  

return 0;

}

5、请编写一个程序,比较两个文件,如果相等则返回0;否则返回1。

#include <stdio.h>

#include<stdlib.h>

int CompareFile( char * f1,  char* f2)

{

    int result = 0;      

    long size1=0,size2= 0 ;   

     char ch1,ch2 ;        

FILE *p,*q; 

   if( (p=fopen(f1,"r") )==NULL)

   {

   printf("无法打开文件1");

   exit(0);

   }

   if( (q=fopen(f2,"r") )==NULL)

   {

   printf("无法打开文件2");

   exit(0);

   }

fseek(p, 0, 2);

    size1= ftell(p);

    fseek(p, 0, 0);

    fseek(q, 0, 2);

    size2= ftell(q);

    fseek(q, 0, 0);

    if(size1 != size2)

{   result = 1;

    return result;

}

    while( !feof(p) &&  !feof(q) )

{

         ch1 = fgetc(p);

         ch2 = fgetc(q);

        if(ch1!=ch2)

         {

                 result = 1;

                 break;

         }     

}

        if( ch1!=EOF || ch2!=EOF )

{      result = 1;   

}

fclose(p);

    fclose(q);

    return result;

}

main()

{

   char f1[40],f2[40];

   int resule;

   printf("请输入文件1的名字:  ");

   scanf("%s",f1);

   printf("请输入文件2的名字:  ");

   scanf("%s",f2);  

   resule=CompareFile(f1,f2);

   if(resule==0)

        printf("两个文件相等\n");

    else

        printf("两个文件不相等\n");   

}

6、编写一个程序,交替地读取两个文件的正文行,并把它们送到stdout文件上。如果一个文件读完,那么就把另一个文件余下的内容全部复制到stdout上。

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

int main( )

{

FILE *f1,*f2;

char ch[1024];

char file1[40],file2[40];  

printf("输入文件1的名字:");  

scanf("%s",file1);  

 if((f1=fopen(file1,"r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

printf("输入文件2的名字:");  

scanf("%s",file2);  

if((f2=fopen(file2,"r"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

while(!feof(f1)  &&   !feof(f2) )

{

         fgets(ch,1023,f1);

         puts(ch);

         fgets(ch, 1023,f2);

         puts(ch);

}

while(!feof(f1))

{               fgets(ch, 1023,f1);

                 puts(ch);                  

}

while(!feof(f2))

{

         fgets(ch, 1023,f2);

         puts(ch);

}

fclose(f1);

fclose(f2);

return 0;

}

7、设文件number.dat中存放了一组整数。请编程统计并输出文件中正整数、零和负整数的个数。

#include <stdio.h>

#include <stdlib.h>

int main( )

{

FILE *p;

int num;

int n1=0,n2=0,n3=0;

 p=fopen("number.dat","r");

 if(p == NULL)

 {

          printf("打开文件失败\n");

          exit(0);

 }

 while(!feof(p))

 {

         fscanf(p,"%d",&num);//%d的格式代开文件,存放到num

         if(num>0)

                 n1++;

         else if(num<0)

                 n2++;

         else

                 n3++;

 }

 printf("正整数的个数为 =%d\n",n1);

printf("负整数的个数为=%d\n",n2);

printf("0的个数为=%d\n",n3);

fclose(p);   

return 0;

}

8、有两个磁盘文件“A.txt”和“B.txt”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,输出到一个新文件“C.txt”中。

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

int main( )

{

FILE *f1,*f2,*f3;

char ch1[1024],ch2[500],ch;

int i,j,n;      

if((f1=fopen("A.txt","r"))==NULL)   /*以只读的方式打开读入文件*/

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

if((f2=fopen("B.txt","r"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

         if((f3=fopen("C.txt","w"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

i=0;

while(!feof(f1))

{              

         ch1[i]=fgetc(f1);

         i++;

                

}

ch1[i-1] = '\0';

j=0;

while(!feof(f2))

{

         ch2[j]=fgetc(f2);

         j++;

        

}

ch2[j-1] = '\0';

strcat(ch1,ch2);

n=i+j-2;

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

{

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

         {

                 if(ch1[i]>ch1[j])

                 {

                          ch = ch1[i];

                          ch1[i] = ch1[j];

                          ch1[j] = ch;

                 }

         }

}

fputs(ch1,f3);

fclose(f1);

fclose(f2);

fclose(f3);      

if((f3=fopen("C.txt","r"))==NULL) 

{

          printf("无法打开此文件\n");

          exit(0);                     /*如果文件打开失败,退出系统*/

}

printf("C.txt文件的内容为:\n");

while(!feof(f3))

{

         ch = fgetc(f3);

         printf("%c",ch);

}

printf("\n");

return 0;

}

9、设文件student.dat中存放着一年级全部学生的基本情况,定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:

struct date

{     int year;

int month;

      int day;       

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

       float ave;

    };

请编程序,从文件读出一年级学生的信息,在显示器输出学生信息。

#include <stdio.h>

#include <string.h>

struct date

{     int year;

       int month;

      int day;       

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

     float ave;

    };

void load_txt (struct stu s[],int *n);

void outputarray (struct stu s[],int n);

void main()

{

struct stu s[100];   //假设全班人数不超过100

int n;

load_txt (s,&n);

outputarray(s,n);

}

void load_txt (struct stu s[],int *n)

{

FILE *fin;

int i, j ,k ,size;

*n=0 ;          

if((fin=fopen("class.txt","r"))==NULL)    //以只读方式打开文件class.txt

{

printf("Can not open the  file!\n ");

exit(0);

}

/*读取文件数据*/

fseek(fin,0,2);     

size=ftell(fin);       

fseek(fin,0,0);       

i=0;

while( ! ( size == ftell (fin) ))     //判断文件位置指针是否到了文件尾部

{

         fscanf(fin,"%d",&s[i].num);

         fscanf(fin,"%s", s[i].name);

fscanf(fin," %c",& s[i].sex);                      fscanf(fin,"%d%d%d",&(s[i].birthday.year),&(s[i].birthday.month),

                                                  &(s[i].birthday.day));

         fscanf(fin,"%f",& s[i].score[0]);

         fscanf(fin,"%f",& s[i].score[1]);

         fscanf(fin,"%f",& s[i].score[2]);

         fscanf(fin,"%f",& s[i].score[3]);

    s[i].ave=(s[i].score[0]+s[i].score[1]+s[i].score[2]+s[i].score[3])/4;

         i++;

}

*n=i;

fclose(fin);                        //关闭文件

}

void outputarray (struct stu s[],int n)

{

int i,j;

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

{

printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);

printf("出生年月日:%d-%d-%d\n", s[i].birthday.year,

s[i].birthday.month,s[i].birthday.day);

printf("成绩:");

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

{

         printf("%6.1f\t",s[i].score[j]);

}     

printf("%6.1f\n",s[i].ave);

}

return;

}

10、设文件student.dat中存放着一年级全部学生的基本情况,定义描述学生信息(学号、姓名、性别、出生日期、4门课程成绩和平均分)的结构体类型如下:

struct date

{        int month;

        int day;

        int year;

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

       float ave;

    };

请编程序,从文件中读出一年级学生的信息,在显示器输出学生信息,再将学生的名字由小到大排序,将排序后学生信息在显示器输出,并且将排序后学生的信息写入另一个文件studentsort.dat中。

#include <stdio.h>

#include <string.h>

struct date

{     int year;

       int month;

      int day;       

 };

struct stu

{

        int num;

        char name[20];

        char sex;

        struct date birthday;

        float score[4];

     float ave;

    };

void load_txt (struct stu s[],int *n);

void outputarray (struct stu s[],int n);

void stu_sort(struct stu s[],int n);

void save_txt(struct stu s[], int n);

void main()

{

struct stu s[100];   //假设全班人数不超过100

int n;

load_txt (s,&n);

printf("\n原始学生信息为:\n");

outputarray(s,n);

stu_sort(s, n);

printf("\n排序后的学生信息为:\n");

outputarray(s,n);

save_txt(s, n);

}

void load_txt (struct stu s[],int *n)

{

FILE *fin;

int i, j ,k ,size;

*n=0 ;           

if((fin=fopen("student.dat","r"))==NULL) 

{       printf("Can not open the  file!\n ");

         exit(0);

}

/*读取文件数据*/

fseek(fin,0,2);     

size=ftell(fin);       

fseek(fin,0,0);       

i=0;

while( ! ( size == ftell (fin) / /判断文件位置指针是否到了文件尾部

{

         fscanf(fin,"%d",&s[i].num);

         fscanf(fin,"%s", s[i].name);

                 fscanf(fin," %c",& s[i].sex);

                fscanf(fin,"%d%d%d",&(s[i].birthday.year),

&(s[i].birthday.month),&(s[i].birthday.day);

         fscanf(fin,"%f",& s[i].score[0]);

         fscanf(fin,"%f",& s[i].score[1]);

         fscanf(fin,"%f",& s[i].score[2]);

         fscanf(fin,"%f",& s[i].score[3]);

s[i].ave= (s[i].score[0]+ s[i].score[1]+s[i].score[2]+s[i].score[3])/4;

         i++;

}

*n=i;

fclose(fin);                        //关闭文件

}

void outputarray (struct stu s[],int n)

{

         int i,j;

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

{

printf("学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);

printf("出生年月日:%d-%d-%d\n", s[i].birthday.year,

s[i].birthday.month,s[i].birthday.day);

printf("成绩:");

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

{

         printf("%6.1f\t",s[i].score[j]);

}     

printf("%6.1f\n",s[i].ave);

}

return;

}

void stu_sort(struct stu s[],int n)

{

struct stu t;

int i,j,k;

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

{

k=i;

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

         {

                 if( strcmp(s[j].name,s[k].name)<0 )

                 {

                          k=j;

                 }

         }

         if(k!=i)

         {

                 t=s[i]; s[i]=s[k]; s[k]=t;

               }

}

return ;

}

void save_txt(struct stu s[], int n)

{

FILE *fout;

int i ;                  

if((fout=fopen("studentsort.dat","w"))==NULL) 

{

printf("Can not open the file!\n ");

exit(0);

}

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

{     

fprintf(fout,"学号:%d\n姓名:%s\n性别:%c\n",s[i].num,s[i].name,s[i].sex);         

fprintf(fout,"%d-%d-%d\n",s[i].birthday.year,s[i].birthday.month,

s[i].birthday.day);

fprintf(fout,"成绩:%6.1f\t",s[i].score[0]);

fprintf(fout,"%f\t",s[i].score[1]);

fprintf(fout,"%f\t",s[i].score[2]);

fprintf(fout,"%f\t",s[i].score[3]);

fprintf(fout,"%f\n", s[i].ave);      

}

fclose(fout);                        //关闭文件

}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐