学习C语言时候的代码

有点多

/*
已知 s=1!+2!+3!+…+n!,编程求解并依次输出
符合条件s<m的最大n和s值,m从键盘输入。例如:
输入:100000                输出:n=8  s=46233


*/
#include<stdio.h>
#define N 3
void main()
{
	int i;
	long sum=0,n=1;
	for(i=1;i<=N;i++)
	{
		n=n*i;
		sum=sum+n;
	}
	printf("1!+2!=%d",sum);
}
/*
  最大公约数:利用辗转相除法,相减法,穷举法三种
  最小公倍数:两数之积除以最大公约数
*/
#include<stdio.h>

int fun1(int a,int b) // 利用辗转相除法
{
	int temp;
	if(a<b)
	{
	    temp=a;
		a=b;
		b=temp;
	}
	while(b!=0)
	{
		temp=a%b;
		a=b;
		b=temp;
	}
	return a;

}

int fun2(int a,int b)  //相减法
{
	while (a!=b)
	{
		if(a>b) a=a-b;
		else b=b-a;
	}
	return a;
}
int fun3(int a,int b)   //穷举法
{
	int t,i;
	for(i=1;i<=a;i++)
		if(a%i==0 && b%i==0)  t=i;
	return t;
}
void main()
{
	int a,b,max;
	scanf("%d %d",&a,&b);
	max=fun3(a,b);
	
	printf("最大公约数: %d\n",max);

	int qrt=a*b/max;

	printf("最小公倍数:%d\n",qrt);
}

#include<math.h>
#include<stdio.h>
void main()
{
	float PI=0,m=1,i=1;
	//int j=-1;
	int j=1;
     do 
	 { 
		 PI=PI+j/i;
         i=i+2;  j= -j;
     }
     while (1/i>= 0.000001);

	PI=4*PI;
	printf("PI=%f",PI);
}

/*
编程实现:计算1到100之间的奇数之和  偶数之和
*/
#include<stdio.h>
void main()
{
	int i,even=0,odd=0;
	for(i=0;i<=50;i++)
	{
		even+=2*i;
		odd+=2*i-1;
	}
	printf("1到100间的偶数的和为%d:\n",even);
    printf("1到100间的奇数的和为%d:\n",odd);

}
/*
用                                           公式求    
的近似值,直到余项的首项绝对值小于10-6为止
*/
#include<stdio.h>
#include <math.h>
main ( )
{   float PI=0., m=1., i=1.;  int j= -1;
	  do {  PI=PI+m;
		    i=i+2; m=j/i; j= - j;
  		  }
     while (fabs (m)>= 0.000001);
	  PI=4*PI;
	  printf("PI=%f\n", PI);	
}

/*
百钱买白鸡
*/
#include<stdio.h>
void main()
{
	int x,y,z,j=1;
	printf("Possible solutions to buy 100 fowls whith 100 wen:\n");
	for(x=0;x<=20;x++)
		for(y=0;y<=33;y++)
		{
			z=100-x-y;
			if(z%3==0 && 5*x+3*y+z/3==100)
			{
				printf("%2d:cock=%-2d  hen=%-2d  chicken=%-2d\n",j,x,y,z);
				j++;
			}

		}
}

/*
判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes;否则输出no.
*/
#include <stdio.h>
void main()
{
 int a;
 printf("请输入要验证的数:\n");
 scanf("%d",&a);
 if(a%5==0&&a%7==0)
  printf("Yes\n");
 else
  printf("No\n");
}

/*
编程实现:计算1到100之间的奇数之和及偶数之和
*/
#include <stdio.h>
void main ()
{
 int n,even=0,odd=0;
 for(n=1;n<=50;n++)
 {
  even+=2*n;
  odd+=2*n-1;
 }
 printf("1到100间的偶数的和为%d:\n",even);
 printf("1到100间的奇数的和为%d:\n",odd);
}

/*
求Sn=a+aa+aaa+…+aa…a之值,n,a由键盘输入。
*/
#include<stdio.h>
void main()
{
 int a,n,i=1,sn=0,tn=0;
 printf("a,n=:");
 scanf("%d,%d",&a,&n);
 while(i<=n)
 {
  tn=tn+a;
  sn=sn+tn;
  a=a*10;
  ++i;
 }
 printf("a+aa+aaa+…+aa…a=%d\n",sn);
}

//求下列试子的值:1-1/2+1/3-1/4+……+1/99-1/100,将结果输出
#include<stdio.h>
void main()
{
	float sum=1.0,t,s=1;
	int i;
	for(i=1;i<=100;i++)
	{
		t=s/i;
		sum=sum+t;
		s=-s;
	}
	printf("===%5.4f\n",sum);

}
/*
  求素数的子函数
*/
#include<stdio.h>
#include<math.h>
void main()
{
	int i,k,m;
	scanf("%d",&m);
	k=sqrt(float(m));
	for(i=1;i<m;i++)
		if(m%i==0) break;
	if(i>k) printf("%d is prime number!",m);
	else  printf("%d is not a prime number!",m);
}

*
 test2:素数
*/
#include<stdio.h>  
#include<math.h>  
void main()  
{   
       double m;
	   int i, k;  
       for(m=301; m<=330; m=m+2)  
       {    
           k=sqrt(m);  
           for(i=2; i<=k; i++)  
			   if((int)m%i==0) break;  
           if(i>k) printf("%d is a prime number\n", m);  
   }  
}

/*
打印出所有的“水仙花数”。所谓“水仙花
   数”是指一个三位正整数,其各位数字的立方和
   等于该数本身,例如:153=13+53+33
*/
#include<stdio.h>
void main()
{
	int n,i,j,k;
	for(n=100;n<=999;n++)
	{
		i=n/100;
		j=(n/10)%10;
		k=n%10;
		if ( n== i*i*i + j*j*j + k*k*k )
          printf("%d = %d^3 + %d^3 + %d^3\n", n, i, j, k);
	}
}
 
/*
利用一维整型数组可以实现超长整数的加法,编程实现;从键盘输入两个
40位正整数,输出其和
*/
#include<stdio.h>
#define N 2
void main()
{
	int a[N],b[N],s[N+1],i,t=0;
	for(i=N-1;i>=0;i--)       /*输入数组a*/
		scanf("%d",&a[i]);

	for(i=N-1;i>=0;i--)       /*输入数组b*/
		scanf("%d",&b[i]);
	for(i=0;i<N-1;i++)
	{
		s[i]=a[i]+b[i]+t;
		if(s[i]>10)
		{
			t=s[i]/10;
			s[i]=s[i]%10;
		}
		else  t=0;
	}

	if(t==0)
		for(i=N-1;i>=0;i--)
			printf("%d",s[i]);
	else
	{
		s[i]=t;
		for(i=N;i>=0;i--)
			printf("%d",a[i]);
	}
}

/*
将二维数组的行和列进行互换,存到另一个二维数组中
*/
#include<stdio.h>
void main()
{
	int a[2][3]={{1,2,3},{4,5,6}};
	int b[3][2],i,j;
	printf("The array a:\n");
	for(i=0;i<2;i++)
		for(j=0;j<3;j++)
		{
			printf("%5d",a[i][j]);
			b[j][i]=a[i][j];
		}
		printf("\n");
	printf("The array b:\n");
	for(j=0;j<3;j++)
		for(i=0;i<2;i++)
			printf("%5d",a[i][j]);
	printf("\n");

}

/*
已有一个已排好的数组今输入一个数要求原来排序的规律将它插入数组中
*/
#include<stdio.h>
void main()
{
	static int a[10]={1,7,8,17,23,24,59,62,101};
	int i,j,t;
	scanf("%d",&a[9]);
	for(i=9;i>0;i--)
		if(a[i]<a[i-1])
		{
			t=a[i-1];
			a[i-1]=a[i];
			a[i]=t;
		}
		for(i=0;i<10;i++)
			printf("%5d",a[i]);
		printf(" ");
}

/*
将一个数组的值按逆序重新存放
*/
#include<stdio.h>
void main()
{
	int i,b[10];
	for(i=0;i<10;++i)
		scanf("%d",&b[i]);
	for(i=9;i>=0;i--)
		printf("%5d",b[i]);

}

/*
打印一下杨辉三角形(要求打印出10行)
*/
#include<stdio.h>
void main()
{
	static int m,n,k,b[15][15];
	b[0][1]=1;
	for(m=1;m<15;m++)
	{
		for(n=1;n<=m;n++)
		{
			b[m][n]=b[m-1][n-1]+b[m-1][n];
			printf("%-5d",b[m][n]);
		
		}
		printf("\n");

	}

}

/*
将数组a中的n个整数按照相反的方向存放
*/
#include<stdio.h>
void fun(int a[],int n)     //传递数组的首元素的地址
{
	int i,j,t=(n-1)/2;
	int temp;
	for(i=0;i<t;i++)
	{
		j=n-1-i;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	//return;
}
void inv(int *x,int n)    //利用指针
{
	int *p,temp,*i,*j,m=(n-1)/2;

	i=x;j=x+n-1;p=x+m;
	for(;i<=p;i++,j--)
	{
		temp=*i;
		*i=*j;
		*j=temp;
	}
	//return ;
}
void main()
{
	int i;
	int a[10]={1,2,3,4,5,6,7,8,9,10};
	int *p=a;
	
	fun(a,10);
	printf("逆序后的数组是:\n");
	for(i=0;i<10;i++,p++)
		printf("->%d",*p);
	printf("\n");
}

/*
1.建立一个11行5列数组名为stu的二维数组,存储学生的学号和成绩
2.输入10个学号及三门考试成绩
3.统计三门课程的总分,存放在最后一列
4.统计1每门课程10个学生的总分,存放在最后一行
5.输出成绩表
*/
#include<stdio.h>
void main()
{
	int stu[11][5];
	int i,j;
	for(i=0;i<10;i++)                /*输入10个学号及三门考试成绩*/
		for(j=0;j<4;j++)
			scanf("%d",&stu[i][j]);  
	for(i=0;i<10;i++)               /*统计三门考试成绩的总分,放在第5列*/
	{
		stu[i][4]=0;
		for(j=1;j<=3;j++)
			stu[i][4]+=stu[i][j];
	}

	for(j=1;j<4;j++)                   /*统计各门成绩的总分,放在最后一行*/
	{
		stu[10][j]=0;
		for(i=0;i<10;i++)
			stu[10][j]+=stu[i][j];

	}
	for(i=0;i<11;i++)                     /*输出成绩表*/
	{
		for(j=0;j<5;j++)
		{
			if(i==10&&(j==0||j==4))
			{
				printf(" ");
				continue;
			}
			printf("%d   ",stu[i][j]);
		}
		printf("\n");
	}
}

/*
从键盘输入日期(yyyy-mm-dd)计算输出该日期那天是该年的第几天
基本算法:将1月至m-1月的各月天数累加,再加上给定的日
每月的天数可有一个一位数组存放初始化为平
    年的天数,然后再根据y年是否为闰年来修正2月
    份的天数。
 •  闰年的条件是符合下面两条件之一:
  ⑴ 能被4整除,但不能被100整除;
  ⑵ 能被400整除 ;
*/
#include<stdio.h>
void main()
{
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int y,m,d,i,days;
	do
	{
		printf("input the date(yyyy-mm-dd):\n");
		scanf("%d-%d-%d",&y,&m,&d);
		a[2]=28+(y%4==0 && y%100!=0 || y%400==0);
	} while (m<1||m>12||d<1||d>a[m]);
	for(i=1,days=d;i<m;i++)
		days+=a[i];
	printf("%d\n",days);
}

/*
给出年、月、日,问是星期几(星期日~六用0~6表示)
*/
int isleap( int y )             /* 是闰年返回1,否则为0 */
{  return ((y%4==0 && y%100!=0) || y%400==0); }

int days_pm(int y, int m)      /* 返回y年m月的天数 */
{  int dpm[13]={ 0, 31, 28, 31, 30, 31, 30, 31, 
                            31, 30, 31, 30, 31}; 
    return dpm[m]+( m==2 ? isleap(y) : 0 );
}
int lastyear ( int y )       /*  返回y-1年12月31日是星期几*/
{  int  i,  n=y-1;               /*  每年365天为52个星期多1天 */
    for(i=1; i<y; i++)    n+=isleap(i);    /* 加上闰年天数 */
    return  n%7;
}
main( )
{  int y, m, d, n, i; 
    printf("\nInput date (yyyy-mm-dd):");
    scanf ("%d-%d-%d",&y, &m, &d);
    for(n= d+lastyear(y), i=1; i<m; i++) 
       n+=days_pm(y, i); 
    printf("%d\n", n%7);
}

/*
给数组的下三角置数,
4
3  7
2  6  9
1  5  8  10
*/
#include<stdio.h>
void main()
{
	int x[4][4],n=0,i,j;
	for(j=0;j<4;j++)        //列指针
		for(i=3;i>=j;i--)   //行指针
		{
			n++;
			x[i][j]=n;
		}
	for(i=0;i<4;i++)
		{for(j=0;j<=i;j++)
			printf("%d  ",x[i][j]);
	printf("\n");}
}

/*
编程计算矩阵5*4整数矩阵周边各元素之和,矩阵的各元素从键盘输入
*/
#include<stdio.h>
void main()
{
	int a[5][4],i,j,sum=0;
	for(i=0;i<5;i++)
		for(j=0;j<4;j++)
			scanf("%d",a[i][j]);
	sum+=a[i][j];

	for(i=0;i<4;i++)
		for(j=0;j<3;j++)
			sum-=a[i][j];

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

/*
编写函数实现计算任意N*4整型矩阵上的周边元素之和
假设输入的数值
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
*/
#include<stdio.h>
#define N 3
int fun(int a[][4],int n)
{
	int i,sum=0;
	for(i=0;i<4;i++)
		sum+=a[0][i]+a[n-1][i];   //第一行和最后一行的和,此时的i代表的是列数
	for(i=1;i<n-1;i++)
		sum+=a[i][0]+a[i][3];       //第一列的的第二行开始到 n-1行的     和最后一列的的第二行开始到 n-1行的,此时的i代表的是行数
	return sum;
}
void main()
{
	int i,j;
	int a[N][4];
	for(i=0;i<N;i++)
		for(j=0;j<4;j++)
			scanf("%d",&a[i][j]);
	int s=fun(a,N);
	printf("矩阵N*4周边的元素之和为:%d",s);
	printf("\n");
}
/*
编程找出一个M*N矩阵中的鞍点
由键盘输入一个3行4列的矩阵,输出矩阵中的鞍点
(即在矩阵行中最大,列中最小的数)。若没有鞍点,输出“NO”字样。

*/
#include<stdio.h>
#include<stdlib.h>
#define M 3
#define N 4
void main()
{
	int a[M][N],i,j,k;
	int max,t;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<M;i++)
	{
		max=0;                        //此时假设每一行的最大值是第一个数即a[i][0]
		for(j=i+1;j<N;j++)            //找出列中的最大值
		{
			if(a[i][j]>a[i][max])
				max=j;
		}
		for(t=1,k=0;k<M&&t;k++)      //判断是否在列中是不是最小值
		{
			if(a[k][max]<a[i][max])  //如果还存在数比a[k][max]的值还小,则置t=0,
				t=0;                 //t是一个标识,t=0  表示不存在,
		}
	}
	if(t) printf("yes,%d\n",a[i][max]);
	else  printf("no");
}

/*
编写一个函数convert ,求一个方阵的转置矩阵;
主函数中输入方阵的阶数和方阵,在主函数中将原矩阵和转置矩阵按原格式输出
---------使用嵌套循环,将二维数组的元素a[i][j]和a[j][i]交换即可。
注意矩阵对角线右上角的所有元素和矩阵对角线左下角的元素交换,对角线元素不用交换。因此,只需要n(n-1)/2次对调
*/
#include<stdio.h>
void main()
{
	void convert(int [10][10]);//函数声明
	int a[10][10],p,q,i,j;
	printf("请输入矩阵的行和列:\n");
	scanf("%d",&p);
	scanf("%d",&q);
	printf("请输入矩阵的元素值:\n");
	for(i=0;i<p;i++)
		for(j=0;j<q;j++)
			scanf("%d",&a[i][j]);
	printf("原矩阵为:\n");
	for(i=0;i<p;i++)
	{
		for(j=0;j<q;j++)
			printf("%d",a[i][j]);
		printf("\n");
	}
	convert(a);
	printf("转置矩阵后为:\n");
	for(i=0;i<p;i++)
	{
		for(j=0;j<q;j++)
			printf("%d",a[i][j]);
		printf("\n");
	}


}
void convert(int a[10][10])//转置就是互换
{
	int i,j,t;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			t=a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=t;
		}
}

/*
有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号
*/
#include<stdio.h>
void main()
{
	int a[3][4],i,j;
	int colum,row;
	printf("please input the array:\n");
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			scanf("%d",a[i][j]);
	printf("\n");
	int max=a[0][0];    //设定最大值是第一个数
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			if(a[i][j]>max)
			{
				max=a[i][j];
				colum=j;
				row=i;
			}
	printf("max=%d,colum=%d,row=%d",max,colum,row);


}
/*
根据主函数,编写一下两个函数
1:求数组a[4][4]主对角线上元素的和 ----区分主对角线和次对角线的区别
2:实现对数组a[4][4]的矩阵转置处理
*/
#include<stdio.h>
void convert(int *p)     //数组转置
{
	int i,j,t;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			t=*(p+4*i+j);
			*(p+4*i+j)=*(p+4*j+i);
			*(p+4*j+i)=t;
		}
}

int total(int a[][4],int n)       //主对角线上元素的和
{
	int i,sum=0;
	for(i=0;i<4;++i)
		if(a[i][i]!=0)
			sum+=a[i][i];
	return sum;
}
int total1(int a[][4],int n)     //次对角线上元素之和
{
	int i,j,sum=0;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			if((i+j)==3) sum+=a[i][j];     //此时仅当i+j=n-1的时候才是次对角线上的点
		}
		return sum;
}

void main()
{
	static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	int *p,i,sum,sum1;
	sum=total(a,4);
	sum1=total1(a,4);
	printf("主对角线之和:%d\n",sum);
	printf("次对角线之和:%d\n",sum1);
	p=*a;
	convert(p);
	printf("转置后的数组是:\n");
	for(i=0;i<4;++i)
		printf("%d %d %d %d \n",a[i][0],a[i][1],a[i][2],a[i][3]);

}

/*
求一个3*3矩阵对角线元素之和
*/
#include<stdio.h>
void main()
{
	int i=0,j=0,a[3][3],s1,s2;
	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			scanf("%d",&a[i][j]);
	s1=a[0][0]+a[1][1]+a[2][2];
	s2=a[0][2]+a[1][1]+a[2][0];
	printf("s1=%d,s2=%d",s1,s2);

}

/*
计算并输出整型矩阵A(2*3)和整形矩阵B(3*4)的乘积,矩阵A和B的各元从键盘输入
根据矩阵相乘规则,若有矩阵A和B ,满足条件A的列数等于B的行数,则可相乘得矩阵C,C的行数和列数分别等于A的行数和B的
列数,设A为m*n矩阵,B为n*p矩阵,则C为m*p矩阵,且其元素的数学表达式为
*/
#define M 2
#define N 3 
#define P 4
#include<stdio.h>
void main()
{
	int a[M][N],b[N][P],c[M][P],i,j,k;
	printf("please input A:\n");
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			scanf("%d",&a[i][j]);
	printf("Please input B:\n");
	for(i=0;i<N;i++)
		for(j=0;j<P;j++)
			scanf("%d",&b[i][j]);


	for(i=0;i<M;i++)     /*计算C*/
		for(j=0;j<P;j++)
		{
			c[i][j]=0;
			for(k=0;k<N;k++)
				c[i][j]=a[i][k]*b[k][j];
		}


    printf("Result C:");
	for(i=0;i<M;i++)
	{
		printf("\n");
		for(j=0;j<P;j++)
			printf("%5d\t",c[i][j]);
	}


}
#include<stdio.h>   
#define N 10
void main()  
{  
 int a[N][N],i,j,k,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)  
  for(j=0;j<n;j++)
   scanf("%d",&a[i][j]);
  for(i=0;i<n;i++)  
  {
   for(j=i+1;j<n;j++)
   {
    if(a[i][j]==a[j][i])
     k=1;
    else
     k=0;
   }
  }
  if(k=0)
   printf("bushi");
  else 
   printf("shi\n");
  for(i=0;i<n;i++)  
   for(j=0;j<n;j++)
    printf("%d",a[i][j]);
}

//求一个3*3的整型矩阵对角线元素之和。将原矩阵和求出的和输出
#include<stdio.h>
void main()
{
	float a[3][3],sum=0;
	int i,j;
	printf("please input the element:\n");
	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			scanf("%f",&a[i][j]);
	for(i=0;i<3;i++)
		sum+=a[i][j];
	printf("对角线之和是:%6.2f\n",sum);
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
			printf("%5.2f",a[i][j]);
		printf("\n");
	}
}

/*fibonacci数列问题*/
#include<stdio.h>
static long fibonacci(int n)  //内部函数
{
	if(n==1||n==2)
		return 1;
	else
	{
		return fibonacci(n-2)+fibonacci(n-1);
	}
}
void main()
{
	int n,i;
	printf("Input n.");
	scanf("%d",&n);
	for(i=1;i<=n;++i)/*列出每一项的值*/
	{
		printf("%ld",fibonacci(i));
	}
}

#include<stdio.h>
int max(int x,int y)
{
	int z;
	if(x>y)
		z=x;
	else
	{
		z=y;
	}
	return z;
}
int main()
{
	int (*p)(int ,int);
	int a,b,c;
	p=max;
	printf("input:\n");
	scanf("%d %d",&a,b);

}


#include<stdio.h>

void  aust (int i)
{  static int  j = 0;
    j += i++;
    printf ("i= %d, j= %d\n", i, j); 
}
void main( )
{  int i= 0;                                          
   for (; i<4; i+ +) aust (i);
 }


/*
将字符串a复制为字符串b
*/
#include<stdio.h>
void main()
{
	char a[]="i love yingying!",b[20];
	int i;
	for(i=0;*(a+i)!='\0';i++)  //如果不等于'\0',表示字符串尚未处理完
		*(b+i)=*(a+i);
	*(b+i)='\0';    //最后应将'\0'复制过去

	printf("The string a is: %s\n",a);
	printf("The string b is: ");
	for(i=0;*(b+i)!='\0';i++)
		printf("%c",b[i]);
	printf("\n");
}

#include<stdio.h>
void main()
{
	char a[]="I love yingying!",b[20],*p1,*p2;
	p1=a;p2=b;

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

	printf("The string a is: %s\n",a);
	printf("The string b is: ");
	for(int i=0;b[i]!='\0';i++)
		printf("%c",b[i]);
	printf("\n");
	
}
#include<stdio.h>
void copy_string(char a[],char b[])
{
	int i=0;
	while(a[i]!='\0')
	{
		b[i]=a[i];
		i++;
	}
	b[i]='\0';
}
void copy_string1(char *a,char *b)
{
	for(;*a!='\0';a++,b++)
		*b=*a;
	*b='\0';
}
void copy_string4(char *a,char *b)
{
	while((*b=*a)!='\0')
	{
		a++;b++;
	}
}
void copy_string5(char *a,char *b)
{
	while(*a!='\0')
	   *b++=*a++;
	*b='\0';
}
void copy_string6(char *a,char *b)
{
	while(*a)
	   *b++=*a++;
	*b='\0';
}
void copy_string2(char *a,char *b)
{
	while(*b++=*a++);
}
void copy_string3(char *a,char *b)   //建议使用这一种
{
	while((*b++=*a++)!='\0');
}
void main()
{
	char a[]="I am wangma!";
	char b[]="I love yingying!";

	copy_string6(a,b);
	printf("copy string a to b:\nstring a=%s\nstrng b=%s\n",a,b);
	
}

/*
编一个程序:用结构体描述60位学生的信息,包括学号,姓名和三门课的成绩和总成绩,并以函数形式实现以下的功能
1:输入学生的前5项信息,并计算每个学生的总成绩
2:按总成绩的递减顺序对成绩表排序
3:输出排序后的成绩
*/
#include<stdio.h>
#define N 60

struct student
{
	int num;
	char name[10];
	int score[4];   //三门课的成绩和总成绩,定义长度为4的一位数组

};
void main()
{
	struct student stu[N];
	void read(struct student *p,int n);    //输入学生成绩,计算
	void sort(struct student s[],int n);  //排序
	void print(struct student *p,int n);   //打印
	read(stu,N); sort(stu,N);print(stu,N);
}
void read(struct student *p,int n)
{
	int i,j,sum=0;
	for(i=0;i<n;i++,p++)    //输入学号和姓名
		scanf("%d %s",&p->num,&p->name);
	  for(j=0;j<3;j++)
	  {
		  scanf("%d %d %d",&p->score[j]);
		  sum+=p->score[j];  //计算三门课的总成绩
	  }
	  p->score[3]=sum;  //把总成绩放到score[4】中
}
void sort(struct student s[],int n)   //选择排序法
{
	int i,j,k;
	struct student temp;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(s[k].score[3]<s[j].score[3])      k=j;
		}
		if(k!=i)
		{
			temp=s[i];
			s[i]=s[k];
			s[k]=temp;
		}
	}
}
void print(struct student *p,int n)
{
	int i,j;
	for(i=0;i<n;i++,p++)
	{
		printf("%6d %16s",p->num,p->name);
	    for(j=0;j<4;j++)
		   printf("%d",p->score[j]);
	    printf("\n");
	}
}
/*
从键盘任意输入某班20个学生的成绩,打印最高分,并统计不及格学生的人数。
*/
#include<stdio.h>
int FindMax(float score[],int n)
{
	int i;
	float max;
	max=score[0];
	for(i=0;i<n;i++)
	{
		if(score[i]>max)  max=score[i];
	}
	return max;
}
int countFail(float score[],int n)
{
	int count=0,i;
	for(i=0;i<n;i++)
	{
		if(score[i]<60) count++;
	}
	return count;
}
void main()
{
	int i;
	float score[20];
	for(i=0;i<20;i++)
		scanf("%f",&score[i]);
	float MAX=FindMax(score,20);
	int  COUNT=countFail(score,20);
	printf("MAX=%f,COUNT=%d\n",MAX,COUNT);


}

/*
输入20个学生的成绩,求出其中大于平均成绩学生的人数,并对20名学生成绩按从高到低进行排序
*/
#include<stdio.h>
int count1(float score[],int n)   //求大于平均成绩的学生的人数
{
	int i,count=0;                //注意count计数一定要初始化,sum也是
	float sum=0,avg;
	for(i=0;i<n;i++)
		sum+=score[i];
	avg=sum/n;
	for(i=0;i<n;i++)
		if(score[i]>avg) count++;
	return count;
}
void sort(float score[],int n)       //冒泡排序
{
	int i,j;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-1-i;j++)
			if(score[j]>score[j+1])
			{
				float temp=score[j];
				score[j]=score[j+1];
				score[j+1]=temp;
			}
}
void main()
{
	int i;
	float score[20];
	for(i=0;i<20;i++)
		scanf("%f",&score[i]);
	int COUNT=count1(score,20);
	printf("大于平均成绩学生的人数:%d",COUNT);
	sort(score,20);
	for(i=0;i<20;i++)
		printf("%f",score[i]);
}

//编写一个统计学生成绩程序,完成以下功能:输入4个学生的2门课成绩;求出全班的总平均分,将结果输出。
#include<stdio.h>
#define N 4
struct student
{
	char num[3];
	char name[4];
	float score[2];
	float ave;
}stu[N];
void main()
{
	int i,j;
	float sum,average;
	for(i=0;i<N;i++)
	{
		printf("input score of student:%d\n",i+1);
		printf("name:");
		scanf("%s",stu[i].name);
		for(j=0;j<2;j++)
		{
			printf("score %d:",j+1);
			scanf("%f",&stu[i].score[j]);
		}
		average=0;
		for(i=0;i<N;i++)
		{
			sum=0;
			for(j=0;j<2;j++)
				sum+=stu[i].score[j];
			stu[i].ave=sum/2;
			average+=stu[i].ave;
		}
		average/=N;
		printf("   Name    score1  score2   average\n");
		for(i=0;i<N;i++)
		{
			printf("%5s%10s",stu[i].num,stu[i].name);
			for(j=0;j<2;j++)
				printf("%9.2f",stu[i].score[j]);
			printf("    %8.2f\n",stu[i].ave);
		}
		printf("agerage=%5.2f\n",average);
	}
}

/*
有一个班,3个学生,各学4门课,计算总平均分,以及第n个学生的成绩
在上道题的基础上,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩
*/
#include<stdio.h>
void main()
{
	void average(int *score,int n);
	void search(int (*p)[4],int n);
	void search1(int (*p)[4],int n);
	int score[4][4]={{65,66,67,78},{58,69,70,90},{71,72,73,100},{100,99,59,100}};
	average(*score,12);
	search(score,2);
	search1(score,4);

}
//计算总平均分啊
void average(int *p,int n)
{
	//int *p;
	int *p_end;
	int sum=0,aver;
	p_end=p+n-1;
	for(;p<p_end;p++)
		sum+=(*p);
	aver=sum/n;
	printf("The total aver is %d\n",aver);
}

//输出第n个学生的成绩
void search(int (*p)[4],int n)
{
	int i;
	printf("第%d个学生的成绩是:\n",n+1);
	for(i=0;i<4;i++)
		printf("%d  ",*(*(p+n)+i));
	printf("\n");

}

//查找有一门以上课程不及格的学生,输出他们的全部课程的成绩
void search1(int (*p)[4],int n)
{
	int i,j,flag;    //flag是一个标记, 0代表及格,1 代表不及格
	for(j=0;j<n;j++)
	{
		flag=0;
		for(i=0;i<4;i++)
			if((*(*(p+j)+i))<60) 
				flag=1;
		if(flag==1)
		{
			printf("No.%d fails his scores are:\n",j+1);
			for(i=0;i<4;i++)
				printf("%d  ",*(*(p+j)+i));
			printf("\n");
			//printf("亲,还有哦!\n");
		}

	}
}

/*
有10个学生,每个学生的数据包括,学号,姓名,3门课的成绩,从键盘输入10个学生的数据
要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号,姓名,三门课的成绩,平均分数)
*/
#include<stdio.h>
#define N 2

struct student 
{
	int num;
	char name[10];
	int score[3];
	float aver;
}stu[N];

void main()
{
	int i,j,max=0,maxi=0,sum=0;  //maxi最高分学生的序号
	float average=0;

	for(i=0;i<N;++i)
	{
		scanf("%d %s",&stu[i].num,&stu[i].name);
		for(j=0;j<3;j++)
		{
			scanf("%d ",&stu[i].score[j]);
		}
	}

	for(i=0;i<N;i++)
	{
		for(j=0;j<3;j++)
			sum+=stu[i].score[j];
		stu[i].aver=sum/3.0;       //每个学生的平均分
		average+=stu[i].aver;      //学生的平均分之和

		if(sum>max)               //判断最高分学生的序号  
		{
			max=sum;
			maxi=i;
		}

	}
	average/=N;                   //亲,这才是总平均分哦,
	printf("No.  name   score1  score2  score3 average\n");
	
	for(i=0;i<N;++i)
	{
		printf("%d,%s",stu[i].num,stu[i].name);
		for(j=0;j<3;j++)
		{
			printf("%9d",stu[i].score[j]);
			printf("%8.2f\n",stu[i].aver);
		}

	}
	printf("average=%6.2f\n",average);
	printf("The highest score is %d,score total:%d.",stu[maxi].name,max);

}

/*
编程先输入某班30个学生某门课的成绩,对全班30个学生成绩进行由高到低排序,并打印输出排序结果,要求用函数编程实现排序功能。
*/
#include<stdio.h>
void sort(float score[],int n)       //冒泡排序
{
	int i,j;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-1-i;j++)
			if(score[j]>score[j+1])
			{
				float temp=score[j];
				score[j]=score[j+1];
				score[j+1]=temp;
			}
}
void Sort2(float score[],int n)       //选择排序  
{
int i,j,k; float temp;          
	for (i=0; i<n-1; i++)            
  	{
		k = i;                          
  		for (j=i+1; j<n; j++)   
       {
			if (score[j] > score[k])	k = j; 
              if (k != i)                       
               {            
				temp = score[i];              
				score[i] = score[k]; 
				score[k] = temp; 				 
               }  
		}  
	}   
}

void main()
{
	float score[30];
	int i;
	printf("Please enter the number and score:\n");
	for(i=0;i<30;i++)
		scanf("%f",&score[i]);
	sort(score,30);
	printf("Sorted results:\n");
	for(i=0;i<30;i++)
     	printf("%f",score[i]);
	
}
/*
用选择法对10个数进行排序
*/
#include<stdio.h>
void main()
{
	int i,j,a[10];
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);

	for(i=0;i<9;i++)  
		{//n个数要进行n-1趟比较
		for(j=0;j<=9-i;j++)          //每趟比较n-i次
			if(a[j]>a[j+1])          //依次比较两个相邻的数,将小数放在前面,大数放在后面
			{
				int t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
	}

	for(i=0;i<10;++i)               //输出比较之后的数组
		printf(" %d",a[i]);
}

/*
选择排序法的基本思想
*/
#include<stdio.h>
void SelectSort(int a[],int n)
{
	int i,j;
	for(i=0;i<n-1;i++)              //n个数要进行n-1趟比较,每次确定一个最小数放在a[i]中
	{
		int k=i;                    //假设a[0]是最小的数,把下标0放在变量K里面,
		for(j=i+1;j<n;j++)          
			if(a[k]>a[j])  k=j;     //如果a[k]>a[j] 前面的数比后面的数大,交换下标,此时k指向小的数
		if(k!=i)
		{
			int temp=a[i];
			a[i]=a[k];
			a[k]=temp;
		}
	}

}
void main()
{
	int a[10],i;
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	SelectSort(a,10);
	printf("排序后的数组:\n");
	for(i=0;i<10;i++)
		printf(" %d",a[i]);
}

/*
典型例题:建立链表,统计链表中所有结点的数据域N之和
*/
#include<stdio.h>
#include<malloc.h>
struct node{
   int n;
   struct node *next;
};
struct node *create()      //建立链表
{
	struct node *head,*p1,*p2;     //定义三个结构体变量
	//head=NULL;                     //设置头指针指向空值,什么也不指向
	head=p1=p2=(struct node *)malloc(sizeof(struct node )) ;   //分配内存空间使p1和p2同时指向这个空间的起始地址
	scanf("%d",&p1->n);            //从终端输入数据域要存入的 值
	while(p1->n!=0)                //输入的值不是空,一直循环下去
	{
		//if(head=NULL)              //第一次头指针什么内容也不指向
		//	head=p1;                
		//else
			p2->next=p1;
		p2=p1;                     //p1始终指向开辟的结点,p2->next=p1,把p1指向的赋给p2
		p1=(struct node *)malloc(sizeof(struct node));
		scanf("%d",&p1->n);
	}

	p2->next=NULL;   //直到p2的指针域指向空值的时候
	return  head;    //返回链表的头指针   
}

int  add(struct node *head)     //把结点加入链表中
{
	struct node *p;
	int sum=0;                   //定义sum变量存放数据域n的和
	p=head;                     
	while(p!=NULL)
	{
		sum+=p->n;
		p=p->next;
	}
	return sum;    //向主调函数返回sum的值,即数据域n的和

}

void main()
{
	struct node *head;
	int m;
	head=create();
	m=add(head);
	printf("%d\n",m);
}

/*
   单链表的创建,插入,删除,输出,定义一个学生的结点,有学号,姓名,三门成绩组成
*/
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define  LEN  sizeof(struct student) 
#define N 2
struct student
{
	int num;
	char name[10];
	int score[4];
	struct student *next;
};


struct student *create()
{
	int i;
	struct student *head,*p1,*p2;
	head=p1=p2=(struct student *)malloc(LEN);
    for(i=0;i<10;i++)
	{
		scanf("%d,%s",&p1->num,&p1->name);
		for(i=0;i<4;i++)
			scanf("%d",&p1->score[i]);
	}
	while (p1->num!=0);
	{
	   p2->next=p1;
	   p1=p2;
	   p1=(struct student *)malloc(LEN);
	   for(i=0;i<10;i++)
	   {
		scanf("%d,%s",&p1->num,&p1->name);
		for(i=0;i<4;i++)
			scanf("%d",&p1->score[i]);
	   }
	   p2->next=NULL;
	   return head;
	} 
	
}


int print(struct student *head)
{
	int i,j;
	struct student *p;
	p=head;
	while (p!=NULL)
	{
		for(i=0;i<N;i++)
			printf("%d %s",p->num,p->name);
		for(j=0;j<4;j++)
			printf("%d",p->score[j]);
		p=p->next;

	}
}

void main()
{
	struct student *head;
	head=create();
	print(head);


}
/*
已知正文有文件abc.txt,
1:统计该文件中词的个数,
2:并求出最长词的长度,
一个词与另外一个词之间由空格符,制表符,换行符分隔
*/
#include<stdio.h>
#include<process.h>
#include<string.h>
void main()
{
	FILE *fp;
	char ch;
	int word=0,maxlen=0,length=0,flag=0;  //word存放词的个数,maxlen存放最大词的长度,length存放当前词的长度,flag为状态标记,(1表示当前字符在单词中,0表示当前字符不再某词中)
	if((fp=fopen("f:\\file.txt","r"))==NULL)   //打开文件
	{
		printf("can not open the file!\n");
		return ;
	}
	ch=fgetc(fp);       
	while(ch!=EOF)
	{
		if(ch==' '||ch=='\t' || ch=='\n')   //判断单词的分隔,即此时单词结束
		{
			if(flag==1)
			{
				flag=0;
				if(length>maxlen) maxlen=length;
			}
		}
		else if(flag==0)   //单词没有结束,还有字符呢,亲
		{
			flag=1;
			length=1;   //计数
			word++;     
		}
		else  length++;
		ch=fgetc(fp);
	}
	fclose(fp);
	printf("word=%d,maxlen=%d\n",word,maxlen);
}
/*
输入一行字符,将此字符串中的最长的单词输出
*/
#include<stdio.h>
#include<string.h>
void LongWord(char str1[100],char word[15])
{
	int i,j=0,t=0;
	static char word1[15];
	for(i=0;str1[i]!='\0';i++)
	{
		if(!(str1[i]>'a' &&str1[i]<'z'|| str1[i]>=65 &&str1[i]<=90))  //检测单词是
		{
			t=j;   
			j=0;
			continue;
		}
		word1[j]=str1[i];
		j++;
		if(j>=t) strcpy(word,word1);
	}
}
void main()
{
	char str0[100],longword[15];
	gets(str0);
	LongWord(str0,longword);
	puts(longword);
}

#include <iostream>
void main()
{
 int word(char c);
 int longest(char str[]);
 int i;
 char str[80];
 printf("输入一行字符串\n\n");
 gets(str);
 printf("\n\n最长的单词为:\n\n");
 for(i=longest(str);word(str[i]);i++)
  printf("%c",str[i]);
 printf("\n");
}
int word(char c)
{
 if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) return 1;
 else return 0;
}
 
int longest(char str[])//【这个函数几乎完全看不懂 望逐句详细解释其逻辑】
{
 int i,flag=1,len=0,point,max_len=0,max_point;
 for(i=0;i<=strlen(str);i++)//解析每个字符
 {
  if(word(str[i]))    //是英文字母的话
  {
   if(flag==1)       //成立的话说明这个英文字母是单词的第一个
   {
    point=i;        //单词第一个找到后改变标志
    flag=0;
   }
   else len++;      //开始对这个单词长度进行累加
  }
  else           //非英文字母的话
  {
   flag=1;       //等待第一个英文字母的出现,所以flag=1(要是下一个是英文字母的话就能执行上面的if)
   if(len>max_len)//之前累加的单词长度是否比上一个单词更长(第一次的话max_len初始化为0,len必大于max_len)
   {
    max_len=len;//将单词长度保存下来
    max_point=point;//将最长单词的第一个英文字母在字符串中的位置保存下来
   }
   len=0;
  }
 }
 return (max_point);
}
/*
打印九九乘法表
*/
#include<stdio.h>
void main()
{
	int i,j;
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=i;j++)
			printf("%d*%d=%-4d",j,i,i*j);
		printf("\n");
	}
}

/*
打印星号图形
*******
 *****
  ***
   *
设:行数为n
    行号为i,依次取值:1,2,3,4,5,,,n

则:第一行第1~2n-1列打印*号,其他打印空格
    第二行第2~2n-2列打印*号,其他打印空格
	第三行第1~2n-3列打印*号,其他打印空格
	......
	第n行第n~2n-n列打印*号,其他打印空格
     分析行号i与*号和空格的关系得出: 
     第i行第i~2n-i列打印*号,其他打印空格

*/
#include<stdio.h>
void main()
{
	int i,j,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=2*n-1;j++)
			if(j>=i&& j<=2*n-i)
				printf("*");
			else printf(" ");
			printf("\n");
	}
}

/*
打印图形
*******
 *****
  ***
   *
方法1:
设:行数为n
    行号为i,依次取值:1,2,3......n
则:第一行打印空格0个,*为2n-1个
    第二行打印空格1个,*为2n-3个
	第三行打印空格2个,*为2n-5个
	.......
第n行打印空格打印空格n-1个,*为2n-(2n-1)个即1个
   分析行号i与空格和*号的关系得出: 
   第i行打印空格i-1个,打印*号2n-(2i-1)个

*/
#include<stdio.h>
void main()
{
	int n,m,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i-1;j++)
			putchar(' ');
		for(j=1;j<=2*(n-i)+1;j++)
			putchar('*');
		printf("\n");
	}
}

#include "stdio.h"      /* 空心方法2 */
void main()
{   int  n, i, j;
     scanf("%d", &n);
     for( i=1; i<=n; i++ )
     {   for( j=1; j<=2*n-1; j++ )
              if(j==i || j==2*n-i || i==1&&j%2==1)
                  printf("*");
              else  printf(" ");
          printf("\n");
     }
}

/*
打印星号图形
* * * * *
 *     *
  *   *
   * *
    *
1,左边的空格数相同,即i-1个
2,*号加*号减的空格总数,与实心的*好数相同,即2(n-i)+1
3,不同的是:设每行的*号和*号间的空格的编号为j,依次取值1,2,,,,,2(n-i)+1
则第1行,当j%2==1时打印*号,其他打空格
     其余行,当j==1和j==2(n-i)+1时打印*号,其他打
     空格

*/
#include<stdio.h>
void main()
{
	int i,j,n;
	printf("input n=");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i-1;j++)
			putchar(' ');
		for(j=1;j<=2*(n-i)+1;j++)
			if(i==1 &&j%2 ||j==1||j==2*(n-i)+1)
				putchar('*');
			else putchar(' ');
			printf("\n");
	}
}

/*
输出星号图形
    *
   ***
  *****
 *******
  *****
   ***
    *
*/
#include<stdio.h>
void main()
{
	int i,j,n;
	printf("input n:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)   /*控制输出前n行*/
	{
		for(j=1;j<=10;j++)
			putchar(' ');
		for(j=1;j<=n-i;j++)
		{
			putchar(' ');putchar(' ');       /*每行的起始空格越来越少*/
		}
		for(j=1;j<i*2;j++)
		{
			putchar('*');putchar(' ');       /*每行的'*'越来越多*/
		}
		putchar('\n');
	}

	for(i=1;i<=n-1;i++)   /*控制输出后n行*/
	{
		for(j=1;j<=10;j++)
			putchar(' ');
		for(j=1;j<=i;j++)
		{
			putchar(' ');putchar(' ');       /*每行的起始空格越来越多*/
		}
		for(j=1;j<(n-i)*2;j++)
		{
			putchar('*');putchar(' ');       /*每行的'*'越来越少*/
		}
		putchar('\n');
	}

}
/*
    *
   ***
  *****
 *******
*********
*/
#include<stdio.h>
void main()
{
	int i,j;
	for(i=0;i<5;i++)
	{
		for(j=0;j<=4-i;j++)
			printf(" ");
		for(j=0;j<=2*i-1;j++)
			printf("*");
		printf("\n");
	}
}
/*
有两个磁盘文件A和B 各存放一行字母,要求把这两个文件中的信息合并
按照字母顺序排列,输出到一个新文件c中
*/
#include<stdio.h>
void main()
{
	FILE *fp;
	int i,j,n,k;
	char c[100],t,ch;
	if((fp=fopen("d:\\file\\test1.txt","r"))==NULL)
	{
		printf("can't open the file!\n");
		return;
	}
	printf("File A:\n");
	for(i=0;(ch=fgetc(fp))!=EOF;i++)
	{
		c[i]=ch;
		putchar(c[i]);
	}
	fclose(fp);

	k=i;

	if((fp=fopen("d:\\file\\test2.txt","r"))==NULL)
	{
		printf("can't open the file!\n");
		return;
	}
	printf("\nFile B:\n");
	for(i=0;(ch=fgetc(fp))!=EOF;i++)
	{
		c[k+i]=ch;
		putchar(c[k+i]);
	}
	fclose(fp);

	n=k+i;
	
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(c[i]>c[j])
			{
				t=c[i];
				c[i]=c[j];
				c[j]=t;
			}
	printf("\n连接在一起然后根据字母排序");
	printf("\nFile c:\n");
	for(i=0;i<n;i++)
	{
		putc(c[i],fp);
	    putchar(c[i]);
	}
	fclose(fp);

}

/*
从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁从键盘 输入一个字符串,将其中的小写母全部转换成大然后出到磁文件 “test” “test” “test” “test” “test” 中保存。输入的字符串以 中保存。输入的字符串以 中保存。输入的字符串以 中保存。输入的字符串以 中保存。输入的字符串以 中保存。输入的字符串以 “!”结
*/
#include<stdio.h>
#include<string.h>
void main()
{
	FILE *fp;
	char str[100];
	int i=0;
	if((fp=fopen("d:\\file\\test.txt","w"))==NULL)
	{
		printf("can't open the file!\n");
		return;
	}

	printf("input a string:\n");
	gets(str);
	while(str[i]!='!')
	{
		if(str[i]>='a' && str[i]<='z')
			str[i]=str[i]-32;
		fputc(str[i],fp);
		i++;
	}

	fclose(fp);
	fp=fopen("d:\\file\\test.txt","r");
	fgets(str,strlen(str)+1,fp);
	printf("%s\n",str);
	
	fclose(fp);

}
/*
将文件a1的内容复制到文件a2中
*/
#include<stdio.h>
void main()
{
	FILE *fp1;
	FILE *fp2;
	char c;
	fp1=fopen("d:\\file\\a.txt","r");
	fp2=fopen("d:\\file\\b.txt","w");
	do
	{
		c=fgetc(fp1);
		fputc(c,fp2);
	} while(c!=EOF);    //直到char c中木有任何值

	fclose(fp1);
	fclose(fp2);
}
void filecopy(FILE *fp1,FILE *fp2)
{
	char ch;
	ch=getc(fp1);//先读一次文件再去半段文件是否结束
	while(!feof(fp1))  //当未到文件末尾时进行循环
	{
		putc(ch,fp2);
		ch=getc(fp1);//逐个字符进行复制
	}
}

/*
在文件wm.txt中存放了若干个字符串,要求编写程序统计出其中大写字母的个数
*/
#include<stdio.h>
void main()
{
	FILE *fp;
	int count=0;
	char c;
	fp=fopen("d:\\file\\wm.txt","r");
	c=fgetc(fp);
	while(c!=EOF)
	{
		if(c>='A' && c<='Z') 
			count++;
		c=fgetc(fp);
	}
	printf("the count is %d",count);
	fclose(fp);
}

/*
在磁盘文件上存有10个学生的数据,要求将第1,3,5,7,9个学生数据输入计算机
,并在屏幕上显示出来
*/
#include<stdio.h>
#include<stdlib.h>
struct student
{
	char name[10];
	int num;
	int age;
	char sex;
}stu[10];

void main()
{
	int i;
	FILE *fp;
	if((fp=fopen("d:\\file\\student.txt","rb+"))==NULL)
	{
		printf("can not open the file\n");
		return;
	}

	for(i=0;i<10;i=i+2)    //注意i的增量 i+=2
	{
		fseek(fp,i*sizeof(struct student),0);
		fread(&stu[i],sizeof(struct student),1,fp);
		printf("%s %d %d %c\n",stu[i].name,stu[i].num,stu[i].age,stu[i].sex);

	}
	fclose(fp);

}

/*
统计当前目录文件file.txt中子串read出现的次数
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
	FILE *fp;
	int t,ch,num=0;   //num记录出现的次数
	char str[5]="read",buf[5];
	if((fp=fopen("d:\\file\\file.txt","r+"))==NULL)
	{
		printf("cnanot open the file\n");
		return;
	}

	for(t=0;t<4;t++)
		buf[t]=fgetc(fp);     //分别取4个字符存放在buf[t]中与str进行比较
	buf[t]='\0';              //补字符串结尾标记

	if(strcmp(str,buf)==0)  num++;

	while((ch=fgetc(fp))!=EOF)
	{
		for(t=0;t<3;t++)
			buf[t]=fgetc(fp);
		buf[t]='\0';
		if(strcmp(str,buf)==0)  num++;
	}

	fclose(fp);
	printf("The number of read is %d\n",num);
}

/*
在a1.txt文件存放了100个整数,要求编写程序,程序的功能是
将这100个数按升序排列,将排列结果保存到a2.txt中
*/
#include<stdio.h>
void main()
{
	FILE *fp1,*fp2;
	int a[100],i,j;
	fp1=fopen("d:\\file\\a1.txt","w");
	fp2=fopen("d:\\file\\a2.txt","w");
	                        //输入
	for(i=0;i<100;i++)
		fscanf(fp1,"%d",&a[i]);

	for(i=0;i<99;i++)       //冒泡排序法
		for(j=0;j<99-i;j++)
			if(a[j]>a[j+1])
			{
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
			            //输出
	for(i=0;i<100;i++)
		fprintf(fp2,"%d",a[i]);
	fclose(fp1);
	fclose(fp2);


}

/*
设职工数据为:工号,姓名,性别,年龄,工资,将6名职工的数据从键盘输入
然后送入磁盘文件worker.txt中保存,再读此文件并输出这些数据,依次打印出来
*/
#include<stdio.h>
#define SIZE 6

struct woker_type
{
	int num;
	int age;
	char name[10];
	char sex;
	float pay;
}worker[SIZE];

void save()
{
	FILE  *fp;
	int i;
	if((fp=fopen("d:\\file\worker.txt","rb"))==NULL)
	{
		printf("can not open the file!\n");
		return;
	}
	for(i=0;i<SIZE;i++)
	{
		if(fwrite(&worker[i],sizeof(struct worker_type),1,fp)!=1)
			printf("file write error!\n");
	}
	fclose(fp);
}

void main()
{
	int i;
	FILE *fp;
	for(i=0;i<SIZE;i++)
		scanf("%d %d %c %d %f",&worker[i].num,&worker[i].name,&worker[i].sex,&worker[i].age,&worker[i].pay);
	save();
	printf("\n No  Name  Sex  Age  Pay\n");
	fp=fopen("d:\\file\\worker.txt","rb");
	for(i=0;i<SIZE;i++)
	{
		fread(&worker[i],sizeof(struct worker_type worker[SIZE]),1,fp);
		printf("%5d  %-8s  %-5c  %-5d  %6.2f\n",worker[i].num,worker[i].name,worker[i].sex,worker[i].age,worker[i].pay);

	}
}



猜你喜欢

转载自blog.csdn.net/iwm_NeXT/article/details/7487933