C语言程序设计第四版课后习题-谭浩强

#include<stdio.h>
#include <string.h>
#include <math.h>
/*2.4.1有两个瓶子A和B,分别放醋和酱油,要求将他们互换*/
void swapaandb(int *a,int *b){
	int temp=*a;
	*a=*b;
	*b=temp;
}
/*一次将10个数输入,要求将将其中最大的数输出。*/
void printMax(){
	int max,i;
	int arr[10];
	printf("请输入10个数:");
	scanf("%d\n",&arr[0]);
	max=arr[0];
	for(i=1;i<10;i++){
		scanf("%d\n",&arr[i]);
		if(arr[i]>max){
			max=arr[i];
		}
	}
	printf("最大值为:%d",max);
}
/*(3)有3个数a b c,要求安大小顺序把他们输出。*/
void printFromMax2Min(int a,int b,int c){
	int arr[3]={a,b,c};
	int i,j,t;
	for(i=0;i<2;i++){
		for(j=1;j<3-i;j++){
			if(arr[j]<arr[j-1]){
				t=arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=t;
			}
		}
	}
	for(j=2;j>=0;j--){
		printf("%d\n",arr[j]);
	}
	
}
/*求1+2+3+···+100*/
int sum100(){
	return (1+100)*100/2;
}
/*(5)判断一个数n能否同时被3和5整除。0能,1不能*/
int is5and3(int n){
	if(n%3==0 && n%5==0){
		return 0;
	}
	return 1;
}
/*判断是否是素数*/
int isss(int n){
	int len=sqrt(n),i=2;
	for(;i<=len;i++){
		if(n%i==0){
			return 0;
		}
	}
	return 1;
}
/*将100~200之间的素数输出*/
void printSs(){
	int i=100;
	for(;i<=200;i++){
		if(isss(i)) printf("%d,",i);
	}
}
/*求两个数m和n的最大公约数。*/
int getMaxmandn(int n,int m){
	int min=n,i;
	if(m<n){
		min=m;
	}
	for(i=min;i>0;i--){
		if(n%i==0 && m%i==0){
			return i;
		}
	}
	return -1;
}
/*(7)求方程式ax2+bx+c的根。分别考虑:①有两个不等的实根;②有两个相等的实根。*/
void printGen(){
	float a,b,c;
	printf("请输入三个跟a b c\n");
	scanf("%f,%f,%f",&a,&b,&c);
	printf("%f,%f,%f\n",a,b,c);
	float flag=pow(b,2)-4*a*c;
	printf("1:%f",flag);
	float f1=-b/(2*a);
	printf("2:%f",f1);
	float f2=sqrt(flag)/(2*a);
	printf("3:%f",f2);
	if(flag>(1e-6)){
		printf("one:%f\n",f1+f2);
		printf("two:%f\n",f1-f2);
	}else if(flag<=(1e-6)){
		printf("only one:%f one:%f\n",f1,f1);
	}else{
		printf("none!");
	}
}
/*输出1900-----2000年中是闰年的年份,符合下面俩个条件之一的年份是闰年。
(一)能被4整除但不能被100整除 (二)能被100整除且能被400整除。*/
void printyear(){
	int i=1900;
	for(;i<=2000;i++){
		if((i%4==0 && i%100!=0) || (i%400==0)){
			printf("%d is ruinian",i);
		}
	}
}
/*要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,
经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。 */
void decodeScript(char str[]){
	int i;
	int len=strlen(str);
	for(i=0;i<len;i++){
		str[i]=str[i]+4;
	}
}
/*设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 */
void cicle(){
	float r,h,res;
	printf("请输入圆的半径和圆柱高\n");
	scanf("%f,%f",&r,&h);
	printf("圆的周长为%.2f\n",2*3.14*r);
	printf("圆面积为%.2f\n",3.14*r*r);
	printf("圆球表面积为%.2f\n",4*3.14*r*r);
	printf("圆球体积为%.2f\n",4/3*3.14*r*r*r);
	printf("圆柱体积为%.2f\n",3.14*r*r*h);
}
void printChar(){
	char c1,c2;
	c1=getchar();
	c2=getchar();
	putchar(c1);
	putchar(c2);
	int c3,c4;
	c3=getchar();
	c4=getchar();
	putchar(c3);
	putchar(c4);
	printf("c1=%d;c2=%d\n",c1,c2);
}
/*4.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。*/
void printMax(){
	int a,b,c;
	scanf("%d,%d,%d",&a,&b,&c);
	 int max=a;
	 if(b>max){
	 	max=b;
	 }
	 if(c>max){
	 	max=c;
	 }
	 printf("max:%d\n",max);
}
void printSqrt(){
	float a;
	scanf("%f",&a);
	while(a>=1000){
		printf("请重新输入小于1000的数:\n");
		scanf("%f",&a);
	}
	printf("平方根为:%.2f\n",sqrt(a));
}
/*给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。*/
void printBit(){
	int a,c=0,arr[5];
	printf("请输入一个正整数a:");
	scanf("%d",&a);
	while(a>0){
		arr[c++]=a%10;
		printf("顺序输出:第%d位数为%d\n",c,arr[c-1]);
		a=a/10;
	}
	printf("这是一个%d位数\n",c);
	for(;a<c;a++){
		printf("%d",arr[a]);
	}
}
/*4.10 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000<I≤200000)时,
其中10万元按10%提成,高于10万元的部分,可提成7.5% ;200000<I≤400000时,其中20万元仍按上述办法提成(下同),
高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按1.5%提成;
I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。
要求:(1)用if语句编程序;(2)用switch语句编程序。 
解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。 */
void printBones(){
	float bone[6]={0.1,0.075,0.05,0.03,0.015,0.01};
	float ben[5]={1,1,2,2,4};
	int b,i=0,offset=100000;
	float res=0;
	printf("请输入利润:");
	scanf("%d",&b);
	while(b>ben[i]*offset && i<5){
		res+=bone[i]*ben[i]*offset;
		b-=ben[i]*offset;
		i++;
	}
	res+=bone[i]*b;
	printf("应该发%.2f\n",res);
}
/*输入4个整数,要求按由大到小的顺序输出。*/
void print4NumByOrder(){
	int arr[4];
	int i,j,t;
	printf("请输入4个数");
	scanf("%d,%d,%d,%d",&arr[0],&arr[1],&arr[2],&arr[3]);
	for(i=0;i<3;i++){
		for(j=1;j<4-i;j++){
			if(arr[j]<arr[j-1]){
				t=arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=t;
			}
		}
	}
	for(j=3;j>=0;j--){
		printf("%d\n",arr[j]);
	}
}
/*有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。
塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。*/
void printfH(){
	int h=10,x,y;
	printf("请输入一个坐标");
	scanf("%d,%d",&x,&y);
	int l1=pow(x-2,2)+pow(y-2,2);
	int l2=pow(x+2,2)+pow(y-2,2);
	int l3=pow(x-2,2)+pow(y+2,2);
	int l4=pow(x+2,2)+pow(y+2,2);
	if(l1>1 &&l2>1 &&l3>1 &&l4>1)h=0;
	printf("高度为:%d",h);
	
}
/*5.3输入两个正整数m和n,求其最大公约数和最小公倍数。 */
void printMm(){
	int a,b,i;
	printf("请输入二个正整数:");
	scanf("%d,%d",&a,&b);
	int min=a;
	int max=b;
	if(b<a){
		max=a;
		min=b;
	}
	/*最大公约*/
	for(i=min;i>0;i--){
		if(a%i==0 && b%i==0){
			printf("最大公约数为%d",i);
			break;
		}
	}
	/*最小公倍数*/
	for(i=max;i<=a*b;i++){
		if(i%a==0 && i%b==0){
			printf("最小公倍数为:%d",i);
			break;
		}
	}
}
/*5.4输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。*/
void countNum(){
	char a;
	int w=0,s=0,n=0,o=0;
	printf("请输入一行字符:");
	scanf("%c",&a);
	while(a!='\n'){
		if((a>='A' && a<='Z') ||(a>='a' && a<='z') ){
			w++;
		}else if(a==' '){
			s++;
		}else if(a>='0' && a<='9'){
			n++;
		}else{
			o++;
		}
		scanf("%c",&a);
	}
	printf("英文字母%d,空格%d,数字%d,其他字符%d",w,s,n,o);
}
/*5.5求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。 */
void printSn(){
	int n,i=2,c=1;
	long t=i,sum=i;
	printf("请输入:");
	scanf("%d",&n);
	while(c<n){
		i=i*10;
		t+=i;
		sum+=t;
		c++;
	}
	printf("Sn=%d\n",sum);
}
/*5.6求 ,(即求1!+2!+3!+4!+5!+…+20!) */
void printSNnN(){
	int n,i;
	long sum=0,t=1;
	printf("请输入n:");
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		t=t*i;
		sum+=t;
	}
	printf("Sn=%d",sum);
}
/*求1+2..+100+1+2平方...+50的平方+1+1/2+1/3...+1/10*/
void printfS3(){
	int i;
	float sum=0;
	for(i=1;i<=100;i++){
		sum+=i;
		if(i<=10){
			sum+=1/i;
		}
		if(i<=50){
			sum+=pow(i,2);
		}
	}
	printf("Sn=%.2f\n",sum);
}
/*打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。
例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 */
int isShuiXianHua(int i){
	int t=i,sum=0;
	while(t>0){
		sum+=pow(t%10,3);
		t=t/10;
	}
	if(sum==i){
		return 1;
	}
	return 0;
}
void printShuixianhua(){
	int i=100;
	for(;i<1000;i++){
		if(isShuiXianHua(i)){
			printf("%d ",i);
		}
	}
}
/*一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。
编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1、2、3*/
int isWanshu(int n,int *arr){
	int c=1,i=2,sum=1;
	arr[0]=1;
	for(;i<n;i++){
		if(n%i==0){
			arr[c++]=i;
			sum+=i;
		}
	}
	arr[c]=-1;
	
	if(sum==n){
		return 1;
	}
	return 0;
}
void printWs(){
	int i,arr[100],c=1;
	for(i=1;i<1000;i++){
		if(isWanshu(i,arr)){
			printf("%5d its factors are 1",i);
			c=1;
			while(arr[c]!=-1){
				printf(",%d",arr[c++]);
			}
			printf("\n");
		}
	}
}
void printSum20(){
	int i=0,n;
	float sum=0,fz=2,fm=1,t;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		sum+=(fz/fm);
		t=fz+fm;
		fm=fz;
		fz=t;
	}
	printf("sum=%f\n",sum);
}
/*5.11一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?*/
void printMh(){
	int i,n;
	float sum=100,h=100;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		h=h/2;
		sum+=h*2;
	}
	printf("第%d次共经过%.2f米",n,sum);
	printf("第%d次反弹%.2f米",n,h/2);
}
/*5.12猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。
以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。*/
void printHowMany(){
	int i=1,sum=1;
	for(;i<10;i++){
		sum=(sum+1)*2;
	}
	printf("sum=%d\n",sum);
}
void printSqrt(){
	float x0,x1,n;
	scanf("%f",&n);
	x1=n/2;
	do{
		x0=x1;
		x1=(x0+n/x0)/2;
	}while(fabs(x1-x0)>1e-5);
	printf("平方根为:%f",x1);
	
}
/*用牛顿迭代法求方程在1.5附近的根。牛顿迭代法:https://www.matongxue.com/madocs/205.html*/
void printfGenByNd(){
	float x=1.5,y;
	do{
	y=2*x*x*x-4*x*x+3*x-6;/*函数y的导数6*x*x-8*x+3 */
	x=x-y/(6*x*x-8*x+3);/*切线y=0时候的x的值*/
	}while(fabs(y)>1e-6);
	printf("1.5附近的根为:%.2f\n",x);
	
}
/*用二分法求方程在(-10,10)之间的根
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。
接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,
在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)!  */
void printGenBy2divid(){
	float x1=-10,x2=10,y1,y2,x,y;
		y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
		y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
	if(y1*y2>0){
		printf("无根\n");
		return ;
	}
	do{
		x=(x1+x2)/2;
		y=2*x*x*x-4*x*x+3*x-6;
		if(y1*y<0){
			x2=x;	
		}else if(y2*y<0){
			x1=x;
		}
	}while(fabs(y)>1e-6);
	printf("-10,10之间的根为:%f",x);
	printf("y为:%f",y);
}
void printfxingx(){
	int n,i=1,j;
	printf("请输入多少行:");
	scanf("%d",&n);
	for(;i<=n;i++){
		for(j=0;j<n-i;j++)printf(" ");
		for(j=0;j<(i*2-1);j++)printf("*");
		printf("\n");
	}
	for(i=n-1;i>0;i--){
		for(j=0;j<n-i;j++)printf(" ");
		for(j=0;j<(i*2-1);j++)printf("*");
		printf("\n");
	}
}
int isSuShu(int n){
	int i=2;
	for(;i<=sqrt(n);i++){
		if(n%i==0){
			return 0;
		}
	}
	return 1;
}
void printfShushu(){
	int i,j,n;
	printf("请输入求多少以内的素数:");
	scanf("%d",&n);
	for(i=1;i<n;i++){
		if(isSuShu(i)){
			printf("%d,",i);
		}
		
	}
}
/*选择排序*/
void sortSelect(int arr[],int len){
	int i,j,min,index;
	for(i=0;i<len-1;i++){
		min=arr[i];
		index=i;
		for(j=i+1;j<len;j++){
			if(arr[j]<min){
				min=arr[j];
				index=j;
			}
		}
		arr[index]=arr[i];
		arr[i]=min;
	}
}
/*3、求一个3×3的整型矩阵对角线元素之和。*/
int get44Sum(int arr[4][4]){
	int i,sum;
	for(i=0;i<4;i++){
		sum+=arr[i][i]+arr[i][3-i];
	}
	return sum;
}
void insert_arr(int arr[],int len,int n){
	int res[len+1],index=0,i,flag=1;
	for(i=0;i<len;i++){
		if(flag && n<arr[i]){
			res[index++]=n;
			flag=0;
		}
		res[index++]=arr[i];
	}
	for(i=0;i<len+1;i++){
		printf("%d,",res[i]);
	}
}
/*5、将一个数组中的值按逆序重新存放。例如,原来顺序为8、6、5、4、1。要求改为1、4、5、6、8。*/
void reSort(int arr[],int len){
	int s=0,e=len-1,t;
	while(s<e){
		t=arr[s];
		arr[s]=arr[e];
		arr[e]=t;
		s++;e--;
	}
}
void printYh(){
	int n,i,j;
	printf("请输入多少行:");
	scanf("%d",&n);
	int arr[n];
	arr[0]=1;
	for(i=0;i<n;i++){
		for(j=i-1;j>0;j--){
			arr[j]=arr[j]+arr[j-1];
		}
		arr[i]=1;
		for(j=0;j<=i;j++){
			printf("%3d",arr[j]);
		}
		printf("\n");
	}
}
/*输出奇魔方矩阵
1.第一个元素放在第一行中间一列
2.下一个元素存放在当前元素的上一行、下一列。
3.如果上一行、下一列已经有内容,则下一个元素的存放位置为当前列的下一行。
在找上一行、下一行或者下一列的时候,必须把这个矩阵看成是回绕的。
例如:
8 1 6
3 5 7
4 9 2
*/
void printMagic(){
	int n,nowr,nowl,i,t;
	printf("请输入多少行");
	scanf("%d",&n);
	if(n%2==0){
        return ;
    }
	int arr[n][n];
	/*初始化为0*/
	for(nowr=0;nowr<n;nowr++){
		for(nowl=0;nowl<n;nowl++){
			arr[nowr][nowl]=0;
		}
	}
	arr[0][n/2]=1;
	nowr=0;
	nowl=n/2;
	
	for(i=2;i<=n*n;i++){
		t=(nowr==0)? n-1:(nowr-1)%n;
		if(arr[t][(nowl+1)%n]==0){/*上一行,下一列,没内容*/
			nowr=t;
			nowl=(nowl+1)%n;
			arr[nowr][nowl]=i;
		}else{
			nowr=(nowr+1)%n;/*当前列的下一行*/
			arr[nowr][nowl]=i;
		}
	}
	/*打印*/
	for(nowr=0;nowr<n;nowr++){
		for(nowl=0;nowl<n;nowl++){
			printf("%3d",arr[nowr][nowl]);
		}
		printf("\n");
	}
}
/*8、找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。*/
void findANpot(int arr[5][4]){
	int i,j,max,min,res1[5],res2[4];
	/*每一行的最大值*/
	for(i=0;i<5;i++){
		max=0;
		for(j=1;j<4;j++){
			if(arr[i][j]>arr[i][max]){
				max=j;
			}
		}
		res1[i]=max;/*arr[i][max]处的值为当前第i行的最大值*/
	}
	/*每一列的最小值*/
	for(i=0;i<4;i++){
		min=0;
		for(j=1;j<5;j++){
			if(arr[j][i]<arr[min][i]){
				min=j;
			}
		}
		res2[i]=min;/*arr[min][i]处的值最小*/
	}
	for(i=0;i<5;i++){
		if(i==res2[res1[i]]){
			printf("pot=%d\n",arr[i][res1[i]]);
			return ;
		};
	}
}
/*有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值
。如果该数不在数组中,则输出“无此数”。*/
void findIndexBydivd2n(int arr[],int len){
	int s=0,e,m,n;
	printf("请输入要查找的数:");
	scanf("%d",&n);
	e=len-1;
	while(s<=e){
		m=(s+e)/2;
		if(n>arr[m]){
			s=m+1;
		}else if(n<arr[m]){
			e=m-1;
		}else{
			printf("%d为当前数组的第%d个元素\n",n,m);
			return;
		}
	}
	printf("无此数\n");
}
int main(){ 
	int arr[]={1,4,6,9,13,16,19,28,40,100};
	int len=sizeof(arr)/sizeof(*arr);
	findIndexBydivd2n(arr,len);
	/*int i;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	};*/
	printf("end\n");
	return 0;
}
/*11、输出以下图案:
*  *  *  *  *
   *  *  *  *  *
      *  *  *  *  *
         *  *  *  *  *
            *  *  *  *  *
   */
void printxingx(){
	int i,j,n;
	printf("请输入多少行:");
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<i;j++)printf("  ");
		for(j=0;j<n;j++)printf("* ");
		printf("\n");
	}
}
/*12、有一行电文,已按下面规律译成密码:
	A →Z   a →z
	B →Y   b →y
	C →X   c →x
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。*/
void printMm(char arr[]){
	int len=strlen(arr),i;
	char res[len];
	for(i=0;i<len;i++){
		if(arr[i]>='a' && arr[i]<='z'){
			res[i]='z'-arr[i]+'a';
		}else if(arr[i]>='A' && arr[i]<='Z'){
			res[i]='Z'-arr[i]+'A';
		}else{
			res[i]=arr[i];
		}
		
	}
	printf("密码为:%s\n",arr);
	printf("原码为:%s\n",res);
}
/*13、编一程序,将两个字符串连接起来,不要用strcat函数。*/
void strCatFT(char *str1,char *str2){
	int len1=strlen(str1);
	int len2=strlen(str2);
	int i=0;
	for(;i<len2;i++){
		str1[len1+i]=str2[i];
	}
}
/*14、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。
不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应的ASCII码的差值。
例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’和‘C’的ASCII码差值为2,因此应输出“-2”。
同理:“And”“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,因此应输出“5”。*/
int compareStr(){
	char s1[100],s2[100];
	printf("请输入s1:");
	gets(s1);
	printf("请输入s2:");
	gets(s2);
	int len1=strlen(s1);
	int len2=strlen(s2),min=len1,i;
	if(len2<min){
		min=len2;
	}
	for(i=0;i<min;i++){
		if(s1[i]==s2[i]){
			continue;
		}
		return s1[i]-s2[i];
	}
	return s1[i]-s2[i];
}
/*编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,‘/0’后面的字符不复制。*/
void copyStrff(){
	char s1[200],s2[200];
	printf("请输入s2:");
	scanf("%s",s2);
	int i;
	do{
		s1[i]=s2[i];
	}while(s2[i++]!='\0');
	printf("s1=%s\n",s1);
}
/*求方程 的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。 */
void printGenOver0(float a,float b,float c){
	float t=sqrt(pow(b,2)-4*a*c);
	printf("x1=%.2f,x2=%.2f\n",(-b+t)/(2*a),(-b-t)/(2*a));
}
void printGenLow0(float a,float b,float c){
	float ti=sqrt(4*a*c-pow(b,2))/(2*a);
	float t=-b/(2*a);
	printf("x1=%.2f+%.2fi,x2=%.2f+%.2fi\n",t,ti,t,ti);
}
void printGenEqual0(float a,float b,float c){
	float t=sqrt(pow(b,2)-4*a*c);
	printf("x1=%.2f,x2=%.2f\n",(-b+t)/(2*a),(-b-t)/(2*a));
}
/*7.4写一个函数,使给定的一个二维数组(4×4)转置,即行列互换。 */
void reversArrs(int arr[4][4]){
	int i,j,t;
	for(i=0;i<3;i++){
		for(j=i+1;j<4;j++){
			t=arr[i][j];
			arr[i][j]=arr[j][i];
			arr[j][i]=t;
		}
	}
}
/*7.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。*/
void reverseStr(char arr[]){
	int e=strlen(arr)-1;
	int s=0;
	char t;
	while(s<e){
		t=arr[s];
		arr[s]=arr[e];
		arr[e]=t;
		e--;s++;
	}
}
/*7.10写一函数,输入一行字符,将此字符串中最长的单词输出。 */
void printWordLong(){
	char str[100];
	printf("请输入一行字符串:");
	scanf("%[^\n]",str);
	int i=0,t[2],max=0,s=0;
	int len=strlen(str);
	for(;i<len;i++){
		if(str[i]==' '){
			if(i-s>max){
				max=i-s;
				t[0]=s;
				t[1]=i;
			}
			s=i;
		}
	}
	/*最后一个单词*/
	if(i-s>max){
		max=i-s;
		t[0]=s;
		t[1]=i;
	}
	for(i=t[0];i<t[1];i++){
		printf("%c",str[i]);
	}		
}
/*7.11写一函数用起泡法对输入的字符按由小到大的顺序排列。*/
void sort_bubble(char arr[]){
 	int len=strlen(arr),i=0,j=0;
 	char t;
	for(i=0;i<len-1;i++){
		for(j=1;j<len-i;j++){
			if(arr[j-1]>arr[j]){
				t=arr[j-1];
				arr[j-1]=arr[j];
				arr[j]=t;
			}
		}
	}
}
/*用牛顿迭代法求根。方程为: ,系数a,b,c,d由主函数输入。求X在1附近的一个实根。求出后由主函数输出。*/
float getGenByNiuDun(float a,float b,float c,float d){
	float x,y;
	x=1;
	do{
		y=a*pow(x,3)+b*pow(x,2)+c*x+d;
		x=x-y/(3*a*x*x+2*b*x+c);
		
	}while(y>1e-6);
	return x;
}
/*7.13用递归方法求n阶勒让德多项式的值递归公式为 */
float lrddn(int n,float x){
	if(n==0){
		return 1;
	}
	if(n==1){
		return x;
	}
	return ((2*n-1)*x-lrddn(n-1,x)-(n-1)*lrddn(n-2,x))/n;
}
/*7.13用动态法求n阶勒让德多项式*/
float lrddnd(int n,float x){
	int i;
	float pn1=x,pn2=1,t;
	for(i=2;i<=n;i++){
		t=((2*i-1)*x-pn1-(i-1)*pn2)/i;
		pn2=pn1;
		pn1=t;
	}
	return pn1;
}
7.14输入10个学生5门课的成绩,分别用函数求:

①每个学生平均分;
②每门课的平均分;
③找出最高分所对应的学生和课程;
④求平均分方差:δ=[SXi2]/n-(SXi/n)2,xi为一学生的平均分
在这里插入图片描述

//①每个学生平均分;
void getStuAvg10(float arr[10][5],float stu[10]){
	int i,j;
	float sum;
	for(i=0;i<10;i++){
		sum=0;
		for(j=0;j<5;j++){
			sum+=arr[i][j];
		}
		stu[i]=sum/5;
	}
}
/*②每门课的平均分;*/
void getCourseAvg5(float arr[10][5],float course[5]){
	int i,j;
	float sum;
	for(j=0;j<5;j++){
		sum=0;
		for(i=0;i<10;i++){
			sum+=arr[i][j];
		}
		course[j]=sum/10;
	}
}
/*③找出所有50个分数中最高分所对应的学生和课程;*/
void getCoursMax(float arr[10][5]){
	int i,j,cno,sno;
	float maxPoint=0;
	
	for(i=0;i<10;i++){
		for(j=0;j<5;j++){
			if(arr[i][j]>maxPoint){
				maxPoint=arr[i][j];
				cno=j;
				sno=i;
			}
		}
	}
	printf("%d学生的%d课程为最高分%.2f\n",sno,cno,maxPoint);
}
/*④求平均分方差:δ=[SXi^2]/n-(SXi/n)^2,xi为一学生的平均分 */
float getFangcha(float arr[10][5]){
	float stu[10],sum1=0,sum2=0;
	getStuAvg10(arr,stu);
	int i;
	for(i=0;i<10;i++){
		sum1+=stu[i];
		sum2+=stu[i]*stu[i];
	}
	return sum2/10-pow((sum1/10),2);
}
int main(){
	float arr[10][5]={{10,10 ,10,10 ,10}, 
						{21,21 ,23,23 ,26},
						{31,34 ,36,34 ,31}, 
						{51,55 ,50,50 ,58},
						{65,61 ,67,68 ,64},
						{70,70 ,70,70 ,70}, 
						{81,81 ,83,83 ,86},
						{91,94 ,96,94 ,91}, 
						{41,45 ,40,40 ,48},
						{65,61 ,67,68 ,64}};
	float stu[10];
	float course[5];
	getStuAvg10(arr,stu);
	getCourseAvg5(arr,course);
	getCoursMax(arr);
	int i;
	for(i=0;i<10;i++){
		printf("%.2f,",stu[i]);
	}
	printf("\n没门课程的平均分为:");
	for(i=0;i<5;i++){
		printf("%.2f,",course[i]);
	}
	printf("\n方差为:%.2f\n",getFangcha(arr));
	printf("end\n");
	return 0;
}

7.15写几个函数:

①输10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

/* 结构体*/
typedef struct
{
    int eno;
    char name[20];
} Emp;
/*②按职工号由小到大顺序排序,姓名顺序也随之调整;*/
void sortByEno(Emp arr[10]){
	int i,j;
	Emp t;
	/*插入排序*/
	for(i=0;i<9;i++){
		for(j=i+1;j>0;j--){
			if(arr[j-1].eno>arr[j].eno){
				t=arr[j-1];
				arr[j-1]=arr[j];
				arr[j]=t;
			}else{
				break;
			}
		}
	}
}
/*③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。*/
void getNameByNum(int eno,Emp arr[10],char res[]){
	int i=0,j=9,m;
	while(i<=j){
		m=(i+j)/2;
		if(arr[m].eno<eno){
			i=m+1;
		}else if(arr[m].eno>eno){
			j=m-1;
		}else{
			strcpy(res,arr[m].name);
			break;
		}
	}
}
int main(){
	Emp arr[10];
	int i;
	for(i=0;i<10;i++){
	 Emp e;
	 e.eno=1100-i;
	 sprintf(e.name,"员工_%d",i);
	 arr[i]=e;
	}
	sortByEno(arr);
	for(i=0;i<10;i++){
		printf("编号:%d,姓名:%s\n",arr[i].eno,arr[i].name);
	}
	char name[20]; 
	getNameByNum(1094,arr,name);
	printf("1094name=%s\n",name);
	printf("end\n");
	return 0;
}
7.16写一函数,输入一个十六进制数,输出相应的十进制数。 (各种进制转换)
/*7.16写一函数,输入一个十六进制数,输出相应的十进制数。*/
int hexToDec(char arr[]){
	int i,len,c,res=0;
	len=strlen(arr)-1;
	for(i=len;i>=0;i--){
		c=arr[i];
		if(c>'9'){
			c=10+c-'A';
		}else{
			c=c-'0';
		}
		res+=c*pow(16,len-i);
	}
	return res;
}
/*10进制转十六*/
void DecToHex(int n){
	char arr[n];
	int t,i=0;
	while(n>0){
		t=n%16;
		if(t>9){
			arr[i]='A'+t%10;
		}else{
			arr[i]='0'+t;
		}
		i++;
		n=n/16;
	}
	i--;
	for(;i>=0;i--){
		printf("%c",arr[i]);
	}
}
int main(){
	char arr[100];
	int t;
	printf("请输入一个16进制:");
	scanf("%[^\n]",arr);
	t=hexToDec(arr);
	printf("%s的十进制为%d\n16进制为:",arr,t);
	DecToHex(t);
	printf("end\n");
	return 0;
}
/*二进制转10进制*/
int binary2Decimal(long n){
	int res=0,i=0,oz=0;
	while(n>0){
		oz=n%10;
		res=res+oz*pow(2,i++);
		n=n/10;
		printf("n为%d\n",n);
	}
	return res;
}
/*十进制转二进制*/
long long decimal2Bin(int n){
	int res=0,i=1,oz=0;
	while(n>0){
		oz=n%2;
		res+=oz*pow(10,i);
		i++;
		n=n/2;
	}
	return res;
}
/*八进制转十进制*/
int octal2decimal(long long n){
	int res=0,i=0,oz=0;
	while(n>0){
		oz=n%10;
		res+=oz*pow(8,i);
		i++;
		n=n/10;
	}
	return res;
}
/*十进制转八进制*/
long long decimal2octal(int n){
	int res=0,i=1,oz=0;
	while(n>0){
		oz=n%8;
		res+=pow(10,i)*oz;
		n=n/8;
		i++;
	}
	return res;
}
/*八进制转二进制*/
long long octal2bin(long long n){
	int res=0,i=0,oz=0;
	/*八转十*/
	while(n>0){
		oz=n%10;
		res+=oz*pow(8,i);
		n=n/10;
		i++;
	}
	n=res;
	res=0,i=1,oz=0;
	/*十转二*/
	while(n>0){
		oz=n%2;
		res+=oz*pow(10,i);
		n=n/2;
		i++;
	}
	return res;
}
/*二进制转八进制*/
long long bin2octal(long long n){
	int res=0,i=0,oz=0;
	/*二转十*/
	while(n>0){
		oz=n%10;
		res+=oz*pow(2,i);
		i++;
		n=n/10;
	}
	n=res;
	res=0,i=1,oz=0;
	/*十转八*/
	while(n>0){
		oz=n%8;
		res+=oz*pow(10,i);
		i++;
		n=n/8;
	}
	return res;
}
7.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。
/**/
int i=0;
void numToStr(unsigned long n,char arr[]){
	if(n==0){
		return ;
	}
	numToStr(n/10,arr);
	arr[i++]=n%10+'0';
}
int main(){
	unsigned long t;
	char arr[100];
	printf("请输入一个数:");
	scanf("%d",&t);
	numToStr(t,arr);
	arr[i]='\0';
	printf("%s",arr);
	printf("end\n");
	return 0;
}
7.18给出年、月、日,计算该日是该年的第几天。
/*判断是否是闰年1是*/
int isRunyear(int i){
	if((i%4==0 && i%100!=0) || (i%400==0)) return 1;
	return 0;
}
/*7.18给出年、月、日,计算该日是该年的第几天。 */
int getHowMany(int y,int m,int d){
	int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(isRunyear(y)){
		arr[1]=29;
	}
	int i=0,sum;
	for(;i<m-1;i++){
		sum+=arr[i];
	}
	sum+=d;
	return sum;
}
int main(){
	int y, m, d;
	printf("请输入年:");
	scanf("%d",&y);
	printf("请输入月:");
	scanf("%d",&m);
	printf("请输入日:");
	scanf("%d",&d);
	printf("\n第%d天\n",getHowMany(y,m,d));
	printf("end\n");
	return 0;
}
8.1 输入三个整数,按由小到大的顺序输出。(第8章全部用指针实现)
/*10.1 输入三个整数,按由小到大的顺序输出。(冒泡泡实现)*/
void printFromMtoM(int *a,int *b,int *c){
	int t;
	if(*b<*a){
		t=*a;*a=*b;*b=t;
	}
	if(*c<*b){
		t=*c;*c=*b;*b=t;
	}
	if(*b<*a){
		t=*a;*a=*b;*b=t;
	}
	printf("%d<%d<%d",*a,*b,*c);
}

int main(){
	int a,b,c,*y, *m, *d;
	printf("请输入三个数:");
	scanf("%d,%d,%d",&a,&b,&c);
	y=&a;
	m=&b;
	d=&c;
	printFromMtoM(y,m,d);
	printf("end\n");
	return 0;
}
8.2 输入三个字符串,按由小到大的顺序输出
/**/
void printStrFromMtoM(char *a,char *b,char *c){
	char *t;
	if(strcmp(a,b)>0){
		t=a;a=b;b=t;
	}
	if(strcmp(b,c)>0){
		t=c;c=b;b=t;
	}
	if(strcmp(a,b)>0){
		t=a;a=b;b=t;
	}
	printf("%s<%s<%s\n",a,b,c);
}
int main(){
	char a[20],b[20],c[20];
	printf("请输入三字符串:");
	scanf("%s%s%s",a,b,c);
	printStrFromMtoM(a,b,c);
	printf("end\n");
	return 0;
}

8.3 输入 10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写 三个函数,①输入 10个数,②进行处理,③输出10个数。
/**/
void changeArr(int *arr,int len){
	int i=1,max=0,min=0;
	if(len <=0){
		return ;
	}
	for(;i<len;i++){
		if(arr[i]>arr[max]){
			max=i;
		}else if(arr[i]<arr[min]){
			min=i;
		}
	}
	i=arr[max];
	arr[max]=arr[len-1];
	arr[len-1]=i;
	i=arr[min];
	arr[min]=arr[0];
	arr[0]=i;
	
}
void changeArr(int *arr,int len){
	if(len <=0){
		return ;
	}
	int i=1,*max,*min;
	max=arr,min=arr;
	for(;i<len;i++){
		if(arr[i]>*(max)){
			max=arr+i;
		}else if(arr[i]<*(min)){
			min=arr+i;
		}
	}
	i=*(max);
	*(max)=*(arr+len-1);
	*(arr+len-1)=i;
	i=*(min);
	*(min)=*(arr);
	*(arr)=i;
}
int main(){
	int arr[]={5,8,1,2,4,3,6,9,0,10,7};
	
	int len=sizeof(arr)/sizeof(*arr);
	printf("len=%d\n",len);
	changeArr(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	};
	printf("end\n");
	return 0;
}

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

在这里插入图片描述

/*在主函数中输入 n个数和输出调整后的 n个数。*/
void  changeArrIndex(int *arr,int n,int m){
	int i=0,res[n];
	for(;i<n;i++){
		*(res+(i+m)%n)=*(arr+i);
	}
	for(i=0;i<n;i++){
		*(arr+i)=*(res+i);
	}
}
int main(){
	int arr[]={5,8,1,2,4,3,6,9,0,10,7};
	
	int len=sizeof(arr)/sizeof(*arr);
	printf("len=%d\n",len);
	changeArrIndex(arr,len,1);
	int i;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	};
	printf("end\n");
	return 0;
}

8.5 有 n 人围成一圈,顺序排号。从第 1 个人开始报数,从 1 到 3 报数,凡报到 3 的人退 出圈子,问最后留下的是原来的第几号的那位。
/*约瑟夫问题
*/
int getLast(int n){
	int arr[n],i=0,c=0,res,l=n;
	while(l>1){
		if(arr[i]!=-1){
			if(c==2){
				arr[i]=-1;
				l--;
			}else{
				res=i;
			}
			c=(c+1)%3;
			
		}
		i=(i+1)%n;
	}
	return res+1;
	
}
int main(){
	printf("last=%d\n",getLast(10));
	printf("end\n");
	return 0;
}


8.7有一字符串,包含 n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
/**/
void getCopyFromm(char *from,char *to,int m){
	int len=strlen(from),i;
	for(i=m;i<len;i++){
		to[i-m]=from[i];
	}
	to[i-m]='\0';
}
int main(){
	char *from="hello wojdh!",to[50];
	getCopyFromm(from,to,5);
	printf("to=%s\n",to);
	printf("end\n");
	return 0;
}

8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放在4个最小的元素(按从左到右,从上到下顺序依次从小到大存放),写一函数实现,用main函数调用
/*10.10*/
void changeArrs(int arr[5][5]){
	int res[5],i,j,k,l=0,t,temp[25];
	
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			temp[l++]=arr[i][j];
		}
	}
	/*冒泡排序*/
	for(i=0;i<25;i++){
		for(j=1;j<25-i;j++){
			if(temp[j]<temp[j-1]){
				t=temp[j];
				temp[j]=temp[j-1];
				temp[j-1]=t;
			}
		}
	}
	res[4]=temp[24];
	printf("res=%d\n",res[4]);
	for(i=0;i<4;i++)res[i]=temp[i];
	
	/*按从左到右,从上到下顺序依次从小到大存放*/
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			if(arr[i][j]==res[0]){
				t=arr[0][0];
				arr[0][0]=res[0];
				arr[i][j]=t;
				res[0]=-1;
				i=0,j=0;
			}else if(arr[i][j]==res[1]){
				t=arr[0][4];
				arr[0][4]=res[1];
				arr[i][j]=t;
				res[1]=-1;
				i=0,j=0;
			}else if(arr[i][j]==res[2]){
				t=arr[4][4];
				arr[4][4]=res[2];
				arr[i][j]=t;
				res[2]=-1;
				i=0,j=0;
			}else if(arr[i][j]==res[3]){
				t=arr[4][0];
				arr[4][0]=res[3];
				arr[i][j]=t;
				res[3]=-1;
				i=0,j=0;
			}else if(arr[i][j]==res[4]){
				t=arr[2][2];
				arr[2][2]=res[4];
				arr[i][j]=t;
				res[4]=-1;
				i=0,j=0;
			}
		}
	}	
}
int main(){
	int array[5][5] ={{5,4,0,15,65},
					  {6,7,9,14,16},
					{98,75,66,47,32},
					{10,53,1,13,19},
					{120,99,35,39,28}};
	changeArrs(array);
	int i,j;
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			printf("%d ",array[i][j]);
		}
		printf("\n");
	}
	printf("end\n");
	return 0;
}
8.11在主函数中输入12个等长的字符串。用另一个函数对他们排序。然后在主函数输出这12个已排序好的字符串。
/**/
void sortArr(char arr[12][10]){
	int i,j;
	char t[10];
	for(i=0;i<11;i++)
	{
		for(j=0;j<12-i;j++){
			if(strcmp(arr[j],arr[j-1])<0){
				strcpy(t,arr[j]);
				strcpy(arr[j],arr[j-1]);
				strcpy(arr[j-1],t);
			}
		}
	}
}
int main(){
	char str[12][10] = {"January","February","March","April",
            "May","June","July","August","September","October",
            "November","December"};
	sortArr(str);
	int i,j;
	for(i=0;i<12;i++){
		printf("%s\n ",str[i]);

	}
	printf("end\n");
	return 0;
}


8.12 用指针数组处理上一题目,字符串不等长。
/**/
void sortArr(char *arr[12]){
	int i,j;
	char *t;//test
	for(i=0;i<11;i++)
	{
		for(j=1;j<12-i;j++){
			if(strcmp(arr[j],arr[j-1])<0){
				t=arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=t;
			}
		}
	}
}
int main(){
	char *str[12],*temp[12]={"January","February","March","April",
            "May","June","July","August","September","October",
            "November","December"};
	int i,j;
	for (i=0; i<12; i++){
        str[i]=(char *)malloc(10*sizeof(char));      //为指针数组分配内存动态空间
		str[i]=temp[i];
    }
	sortArr(str);
	for(i=0;i<12;i++){
		printf("%s\n ",str[i]);

	}
	printf("end\n");
	return 0;
}
8.13用矩形法求定积分的通用函数,分别求 1.sinx, 2.cosx,3.e^x
/**/
double getJifen(double top,double bottom,int func){
	double (*fun)(double);//定义函数指针
	switch (func){
	case 1:
		fun=sin;
		break;
	case 2:
		fun=cos;
		break;
	case 3:
		fun=exp;
		break;
	}	
	double sum=0;
	int i,offset=200000;
	double o=(top-bottom)/offset;
	double x=bottom;
	for(i=1;i<=offset;i++){
		x=x+o;
		sum+=(*fun)(x)*o;
	}
	return sum;
}
int main(){
	double pi = 3.141592;
	printf("%f\n ",getJifen(pi,0,1));//2.000
	printf("end\n");
	return 0;
}
8.14将N个数按输入时顺序的逆序排列,用函数实现
/*8.14将N个数按输入时顺序的逆序排列,用函数实现*/
double backWardRank(int *arr,int n){
	int i,t;
	n--;
	for(i=0;i<n;i++,n--){
		t=*(arr+i);
		*(arr+i)=*(arr+n);
		*(arr+n)=t;
	}
}
int main(){
	int arr[]={5,8,1,2,4,3,6,9,0,10,7};
	
	int len=sizeof(arr)/sizeof(*arr);
	backWardRank(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	};
	printf("end\n");
	return 0;
}
输入一个字符串,内有数字和非数字字符。如A123X456Y7A,302ATB567BC,打印字符串中所有连续(指不含非数字字符)的数字所组成的整数。
/**/
int getNums(char *str,long long res[]){
	char *t=str,nums[11];
	int i,j=0;
	long long num;
	while(*t!='\0'){
		i=0;
		while(*t>='0' && *t<='9'){
			nums[i++]=*t;
			t++;
		}
		nums[i]='\0';
		num = atol(nums);
		if(num>0){//这里没有考虑0的情况
			res[j++]=num;
		}
		t++;
	}
	return j;
}
int main(){
	char *arr={"A123X456Y7A,302ATB567BC"};
	long long res[100];
	;
	int i;
	int len=getNums(arr,res);
	for(i=0;i<len;i++){
		printf("%d,",res[i]);
	};
	printf("end\n");
	return 0;
}

实现strcpy
/*字符串复制:值复制*/
void stringcopy1(char *to,char *from){
	int i;
	for(;from[i]!='\0';i++){
		to[i]=from[i];
	}
	to[i]='\0';
}
/*字符串复制:值复制*/
void stringcopy2(char *to,char *from){
	int i;
	for(;from[i]!='\0';i++){
		*(to+i)=*(from+i);
	}
	to[i]='\0';
}
int main(){
	char p[]="A123X456Y7A,302ATB567BC";
	char *arr;
	arr=p;
	char res[100];
	stringcopy1(res,arr);
	printf("%s\n",res);
	*(arr)='b';
	stringcopy2(res,arr);
	printf("%s\n",res);
	printf("end\n");
	return 0;
}


实现strcmp
/*17、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。
不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应的ASCII码的差值。
例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’和‘C’的ASCII码差值为2,因此应输出“-2”。
同理:“And”“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,因此应输出“5”。*/
int strcmp1(char *s1,char *s2){
	int len1=strlen(s1);
	int len2=strlen(s2);
	int min=len1,i;
	if(len1>len2){
		min=len2;
	}
	for(i=0;i<min;i++){
		if(s1[i]!=s2[i]){
			break;
		}
	}
	return s1[i]-s2[i];
}
int main(){
	char *s1="A123X";
	char *s2="A123X";
	
	printf("%d\n",strcmp1(s1,s2));
	
	printf("end\n");
	return 0;
}


8.18编写一个程序,输入月份号,输出该月份号的英文名称。例如输入8,测输出“August”,要求用指针数组处理
/*8.18编写一个程序,输入月份号,输出该月份号的英文名称。例如输入8,测输出“August”,要求用指针数组处理。*/
void printfEn(int num){
	char *str[12] = {"January","February","March","April",
            "May","June","July","August","September","October",
            "November","December"};
    printf("%s\n",*(str+num-1));
    
}
int main(){
	printfEn(12);
	printf("end\n");
	return 0;
}
习题 8.19(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间(2)释放free;
/*习题 8.19(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),
指向字符串开始的空间。new(n)表示分配n个字节的内存空间*/
char *news(int n){
	char *p;
	p=(char *)malloc(n*sizeof(char));
	return p;
}
int main(){
        char *t=news(12);
        char s='a';
        for(;s<'l';s++){
                *t=s;
				t++;
        }
        *t='\0';
        printf("k=%c\n",*(t-1));
        printf("str=%s\n",t-11);
        free(t-11);//释放地址
        printf("str=%s\n",t-11);
        printf("end\n");
        return 0;
}


用指向指针的方法对5个字符串排序并输出
/*用指向指针的方法对5个字符串排序并输出*/
void sortArr(char **str){
	int len=12;
	char *t,**p1,**p2;
	
	for(p1=str;p1<str+len-1;p1++)//冒泡
	{
		for(p2=str+1;p2<str+len;p2++){
			if(strcmp(*(p2),*(p2-1))<0){
				t=*p2;
				*p2=*(p2-1);
				*(p2-1)=t;
			}
		}
	}
}
int main(){
		int i;
		char str[12][10] = {"January","February","March","April",
		            "May","June","July","August","September","October",
		            "November","December"};
		char *str1[12],**s;
		for(i=0;i<12;i++){
			str1[i]=str[i];
		};
        s=str1;    
		sortArr(s);
		for(i=0;i<12;i++){
			printf("%s,",*(s+i));
		};
        printf("end\n");
        return 0;
}
8.21用指向指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和整数在主函数中输入。最后在主函数中输出。
/*8.21用指向指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和
    整数在主函数中输入。最后在主函数中输出。
*/
void sortArrByPoint(int *arr,int len){
	int t,*p1,*p2;
	
	for(p1=arr;p1<arr+len-1;p1++)//冒泡
	{
		for(p2=arr+1;p2<arr+len;p2++){
			if(*p2<*(p2-1)){
				t=*p2;
				*p2=*(p2-1);
				*(p2-1)=t;
			}
		}
	}
}
int main(){
	int arr[]={5,8,1,2,4,3,6,9,0,10,7};
	
	int len=sizeof(arr)/sizeof(*arr);
	sortArrByPoint(arr,len);
	int i;
	for(i=0;i<len;i++){
		printf("%d,",arr[i]);
	};
	printf("end\n");
	return 0;
}

9.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
/*9.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。*/
typedef struct{
	int y;
	int m;
	int d;
}Data;
/*判断是否是闰年1是*/
int isRunyear(int i){
	if((i%4==0 && i%100!=0) || (i%400==0)) return 1;
	return 0;
}
/*计算该日在本年中是第几天,注意闰年问题。 */
int getHowMany(Data d){
	int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(isRunyear(d.y)){
		arr[1]=29;
	}
	int i=0,sum;
	for(;i<d.m-1;i++){
		sum+=arr[i];
	}
	sum+=d.d;
	return sum;
}
int main(){
	Data d;
	d.y=2020;
	d.m=12;
	d.d=31;
	printf("第%d天\n",getHowMany(d));
	printf("end\n");
	return 0;
}
编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录
/*9.3编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,
每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。
编写一个函数input,用来输入5个学生的数据记录。*/
typedef struct{
	int num;
	char name[20];
	int score[3];
}stu;
void printfStu(stu *s,int len){
	int i;
	stu *p,t;
	for(p=s;p<s+len;p++){
		t=*p;
		printf("学号:%d,姓名:%s,",t.num,t.name);
		for(i=0;i<3;i++){
			printf("第%d门成绩为%d",i+1,t.score[i]);
		}
		printf("\n");
	}
}
void input1(stu *s,int len){
	int i,j;
	for(i=0;i<len;i++){
		s[i].num=1000+i;
		sprintf(s[i].name,"%s_0%d","学生",i);//学生_0i
		for(j=0;j<3;j++){
			s[i].score[j]=rand()%50+50;
		}
	}
}
int main(){
	stu ss[10];
	input1(ss,10);
	printfStu(ss,10);
	printf("end\n");
	return 0;
}
有10个学生,每个学生的数据包括学号、姓名、3门课的成绩
/*9.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)*/
double *getAvgScore(stu *s,int len){
	double *p;
	p=(double *)malloc(3*sizeof(double));
	int i,j;
	for(i=0;i<len;i++){
		for(j=0;j<3;j++){
			p[j]+=s[i].score[j];
		}
	}
	for(j=0;j<3;j++){
		p[j]=p[j]/len;
	}
	return p;
}
int main(){
	stu ss[10];
	input1(ss,10);
	double *p=getAvgScore(ss,10);
	int j;
	for(j=0;j<3;j++){
		printf("%f\n",p[j]);
	}
	printf("end\n");
	return 0;
}
9.7-9.9链表的增删改
/*9.7-9.9链表的增删改*/
struct Stu{//结构体
	int no;
	float score;
	struct Stu *next;
}stu;
struct Stu * creatStu(int n){//创建具有n个节点的链表
	struct Stu *head,*last,*t;
	head=malloc(sizeof(stu));
	last=head;
	while(n>0){
		t=malloc(sizeof(stu));
		t->no=1100-n;
		t->score=rand()%50+50;
		last->next=t;
		last=t;
		n--;
	}
	return head;
}
void printfStu(struct Stu *s){//打印stu
	struct Stu *t;
	t=s->next;
	while(t!=NULL){
		printf("学号%d,分数%.2f\n",t->no,t->score);
		t=t->next;
	};
}
void addStu(struct Stu *s){//添加
	struct Stu *t;
	t=s;
	while(t->next!=NULL){
		t=t->next;
	};
	struct Stu *news=malloc(sizeof(stu));
	news->no=t->no+1;
	news->score=rand()%50+50;
	t->next=news;
}
void delStu(struct Stu *s,struct Stu *del){//删除指定节点
	struct Stu *t,*pre;
	t=s->next;
	pre=s;
	printf("学号%d,分数%.2f\n",del->no,del->score);
	while(t!=NULL){
		if(t->no==del->no){
			pre->next=t->next;
			break;
		}
		pre=t;
		t=t->next;
	};
}
int main(){
	int n=10;
	struct Stu *s=creatStu(n),*t;
	printfStu(s);
	printf("end\n");
	addStu(s);
	struct Stu *news=malloc(sizeof(stu));
	news->no=1098;
	delStu(s,news);
	printfStu(s);
	printf("end\n");
	return 0;
}
9.10合并两个链表,按照学号升序排列,s2合并给s1
/*按照学号升序排序*/
void sortLinkListAsc(struct Stu *s){
	struct Stu *min,*news,*t;
	int no;
	float score;
	news=s->next;
	while(news!=NULL){//选择排序
		min=news;
		t=news->next;
		while(t!=NULL){
			if(t->no<min->no){
				min=t;
			}
			t=t->next;
		}
		no=min->no;
		score=min->score;
		
		min->no=news->no;
		min->score=news->score;
		news->no=no;
		news->score=score;
		news=news->next;
	}
}
/*9.10合并两个链表,按照学号升序排列,s2合并给s1*/
void mergeStuAndSort(struct Stu *s1,struct Stu *s2){
	struct Stu *t;
	t=s1;
	while(t->next!=NULL){
		t=t->next;
	}
	t->next=s2->next;
	sortLinkListAsc(s1);
	
}

int main(){
	int n=10;
	struct Stu *s1=creatStu(n),*s2=creatStu(3);
	mergeStuAndSort(s1,s2);
	printfStu(s1);
	printf("end\n");
	return 0;
}


9.11有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点
/*9.11有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点*/
void delBfromA(struct Stu *a,struct Stu *b){
	struct Stu *t1,*t2,*pre;
	t1=a->next;
	t2=b->next;
	pre=a;
	while(t1!=NULL){
		t2=b->next;
		while(t2!=NULL){
			if(t1->no==t2->no){
				pre->next=t1->next;
				t1=pre;
				break;
			}
			t2=t2->next;
		}
		pre=t1;
		t1=t1->next;
	};
}
int main(){
	int n=10;
	struct Stu *s1=creatStu(n),*s2=creatStu(3);
	delBfromA(s1,s2);
	printfStu(s1);
	printf("end\n");
	return 0;
}

9.12建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
/*9.12建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,
如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。*/
struct Student{//结构体
	int no;
	char name[10];
	int sex;
	int age;
	struct Student *next;
}student;
struct Student * creatStu1(int n){//创建具有n个节点的链表,有头节点的链表
	struct Student *head,*last,*t;
	head=malloc(sizeof(student));
	last=head;
	while(n>0){
		t=malloc(sizeof(student));
		t->no=Total--;
		sprintf(t->name,"%s_0%d","学生",n);//学生_0i
		t->sex=rand()%2;
		t->age=10+n%5;
		last->next=t;
		last=t;
		n--;
	}
	return head;
}
void printfStu1(struct Student *s){//打印stu
	struct Student *t;
	t=s->next;
	while(t!=NULL){
		printf("学号%d,姓名%s,性别%d,年龄%d\n",t->no,t->name,t->sex,t->age);
		t=t->next;
	};
}
void delLinkedListByage(struct Student *s,int age){
	struct Student *t,*pre;
	t=s->next;
	pre=s;
	while(t!=NULL){
		if(t->age==age){
			pre->next=t->next;
			t=pre;
		}
		pre=t;
		t=t->next;
	};
}
int main(){
	int n=10;
	struct Student *s1=creatStu1(n);
	printfStu1(s1);
	delLinkedListByage(s1,12);
	printfStu1(s1);
	printf("end\n");
	return 0;
}
10.4从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘 文件“test”中保存。输入的字符串以“!”结束
/*10.4 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,
然后输出到一个磁盘 文件“test”中保存。输入的字符串以“!”结束。*/
void inputAllUpcase(char strs[]){
	int i,len=strlen(strs);
	while(strs[i]!='!'){
		if(strs[i]>='a' && strs[i]<='z'){
			strs[i]=strs[i]-32;
		}
		i++;
	}
	FILE *f;
	f=fopen("./test","a+");
	fputs(strs,f);
	fclose(f);
}
void printfFile(FILE *f){
	if(f==NULL){
		printf("输入的文件不存在!");
		exit(0);
	}
	fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
	long size=ftell(f);//获取从文件头到文件指针处的的长度
	char buff[size+1];
	fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
	fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
	buff[size]='\0';//加上结束符
	printf("file content is:%s\n",buff);
	fclose(f);
}
int main(){
	char strs[100];
	printf("请输入字符串于!结束");
	scanf("%s",strs);//gets(strs);新的版本出错!
	inputAllUpcase(strs);
	FILE f=fopen("./test","r+");
	printfFile(f);
	printf("end\n");
	return 0;
}
10.5 有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,输出到一个新文件”C”中。
void printfFile(FILE *f){
	if(f==NULL){
		printf("输入的文件不存在!");
		exit(0);
	}
	fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
	long size=ftell(f);//获取从文件头到文件指针处的的长度
	char buff[size+1];
	fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
	fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
	buff[size]='\0';//加上结束符
	printf("file content is:%s\n",buff);
	fclose(f);
}
/*读取文件中的所有内容,返回字符串*/
char *getAllFileContent(FILE *f){
	if(f==NULL){
		printf("输入的文件不存在!");
		exit(0);
	}
	fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
	long size=ftell(f);//获取从文件头到文件指针处的的长度
	char *buff=malloc((size+1)*sizeof(char));//在堆上分配内存,因为函数栈结束之后,局部变量中的数据分配在栈内存空间的,一旦函数结束之后,内存就被释放,会出现乱码,或者被分配给其他函数
	fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
	fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
	buff[size]='\0';//加上结束符
	fclose(f);
	return buff;
}
/*根据字母大小排序*/
sortByWord(char *str){
	int i,j,len=strlen(str)-1;
	char t;
	for(i=0;i<len-1;i++){//冒泡
		for(j=1;j<len-i;j++){
			if(str[j]<str[j-1]){
				t=str[j];
				str[j]=str[j-1];
				str[j-1]=t;
			}
		}
	}
}
void merge2C(char *a,char *b){
        int i=0,j=0;
        char t;
        FILE *f;
        f=fopen("./C","a+");
        while((a[i]!='\0' && a[i]!='\n') || (b[j]!='\n' && b[j]!='\0')){
                if(a[i]>b[j] && b[j]!='\0' && b[j]!='\n' ){
                        t=b[j];
                        j++;
                }else{
                        t=a[i];
                        i++;
                }
                fputc(t,f);
        }
        printfFile(f);
}


/*13.5 有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并,按字母顺序排列,
输出到一个新文件”C”中。*/
void mergeAndSortAndSave(){
	FILE *fa,*fb;
	fa=fopen("./A","r+");
	fb=fopen("./B","r+");
	char *a=getAllFileContent(fa);
	char *b=getAllFileContent(fb);
	sortByWord(a);
	sortByWord(b);
	printf("a is:%s\n",a);
	printf("b is:%s\n",b);
	merge2C(a,b);
	free(a);//通过malloc分配的堆内存需要手动释放空间!
	free(b);
}

int main(){
	mergeAndSortAndSave();
	printf("end\n");
	return 0;
}
10.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据,包括学生号、姓名、三 门课成绩,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件 stud 中
/*10.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据,包括学生号、姓名、三 门课成绩,,
计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件 stud 中。 */
typedef struct{
	int num;
	char name[20];
	int score[3];
}stu;
void inputStuData(stu s[],int len){
	int i;
	printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
	for(i=0;i<len;i++){
		scanf("%d %s %d %d %d",&s[i].num,&s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
	}
}
void outPutFile(stu s[],int len){
	int i;
	float sum;
	FILE *f;
	f=fopen("./stud","a+");
	fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
	for(i=0;i<len;i++){
		sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
		fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],sum/3);
	}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
	fclose(f);
}
int main(){
	stu s[5];
	inputStuData(s,5);
	outPutFile(s,5);
	printf("end\n");
	return 0;
}
10.7 将上题 stud 文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一 个新文件 stu-sort 中
/*10.7 将上题 stud 文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一 个新文件 stu-sort 中*/
void readStud(stu s[]){
	FILE *f;
	char tmp[255];
	int i=0;
	f=fopen("./stud","r+");
	fgets(tmp,255,f);
	while(!feof(f)){
		fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
		i++;
	}
	fclose(f);
}
void sortByAvg(stu s[],int len){
	int i,j;
	stu t;
	for(i=0;i<len-1;i++){
		for(j=1;j<len-i;j++){
			if(s[j].avg<s[j-1].avg){
				t=s[j];
				s[j]=s[j-1];
				s[j-1]=t;
			}
		}
	}
	
}
void outPutSortFile(stu s[],int len){
	int i;
	FILE *f;
	f=fopen("./stu-sort","a+");
	fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
	for(i=0;i<len;i++){
		fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
	}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
	fclose(f);
}
int main(){
	stu s[5];
	readStud(s);
	sortByAvg(s,5);
	outPutSortFile(s,5);
	printf("end\n");
	return 0;
}
10.8 将上题以排序的学生成绩文件进行插入处理。插入一个学生的 3 门课成绩,程序先计算 新插入学生的平均成绩,然后将它按平均成绩由低到高的顺序插入,插入后建立一个新文件。
/*10.8 将上题以排序的学生成绩文件进行插入处理。插入一个学生的 3 门课成绩,程序先计算 新插入学生的平均成绩,
然后将它按平均成绩由低到高的顺序插入,插入后建立一个新文件。*/
typedef struct{
	int num;
	char name[20];
	int score[3];
	float avg;
}stu;
void inputStuData(stu s[],int len){
	int i;
	printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
	float sum;
	for(i=0;i<len;i++){
		scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
		sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
		s[i].avg=sum/3;
	}
}
void readStud(stu s[],char *filename){
	FILE *f;
	char tmp[255];
	int i=0;
	f=fopen(filename,"r+");
	fgets(tmp,255,f);
	while(!feof(f)){
		fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
		i++;
	}
	fclose(f);
}
void outPutSortFile(stu s[],int len,char *filename){
	int i;
	FILE *f;
	f=fopen(filename,"a+");
	fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
	for(i=0;i<len;i++){
		fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
	}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
	fclose(f);
}
void insertNew(stu ss[],stu s,int len){
	int i;
	len--;
	for(i=0;i<len;i++){
		if(s.avg<ss[i].avg){
			while(i<len){
				ss[len]=ss[len-1];
				len--;
			}
			break;
		}
	}
	ss[i]=s;
}
int main(){
	stu s1[1],s[6];
	char *fileName,*newFileName;
	fileName="./stu-sort";
	newFileName="./nstu-sort";
	inputStuData(s1,1);//新添加学生信息
	readStud(s,fileName);//读取文件里面的学生信息
	/*插入*/
	insertNew(s,s1[0],6);
	outPutSortFile(s,6,newFileName);//存入新的文件
	printf("end\n");
	return 0;
}


10.9 上题结果仍存入原有的 stu_sort 文件而不另建立新文件。
/*10.9 上题结果仍存入原有的 stu_sort 文件而不另建立新文件。*/
typedef struct{
	int num;
	char name[20];
	int score[3];
	float avg;
}stu;
void inputStuData(stu s[],int len){
	int i;
	printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
	float sum;
	for(i=0;i<len;i++){
		scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
		sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
		s[i].avg=sum/3;
	}
}
void readStud(stu s[],char *filename){
	FILE *f;
	char tmp[255];
	int i=0;
	f=fopen(filename,"r+");
	fgets(tmp,255,f);
	while(!feof(f)){
		fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
		i++;
	}
	fclose(f);
}
void outPutSortFile(stu s[],int len,char *filename){
	int i;
	FILE *f;
	f=fopen(filename,"w");
	fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
	for(i=0;i<len;i++){
		fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
	}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
	fclose(f);
}
void insertNew(stu ss[],stu s,int len){
	int i;
	len--;
	for(i=0;i<len;i++){
		if(s.avg<ss[i].avg){
			while(i<len){
				ss[len]=ss[len-1];
				len--;
			}
			break;
		}
	}
	ss[i]=s;
}
int main(){
	stu s1[1],s[6];
	char *fileName,*newFileName;
	fileName="./stu-sort";
	inputStuData(s1,1);//新添加学生信息
	readStud(s,fileName);//读取文件里面的学生信息
	/*插入*/
	insertNew(s,s1[0],6);
	outPutSortFile(s,6,fileName);//存入新的文件
	printf("end\n");
	return 0;
}


10.12 从键盘输入若干行字符,每行长度不等,输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。
/*13.12 从键盘输入若干行字符,每行长度不等,输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。*/
void getStringAndSave(){
	FILE *f;
	f=fopen("./test","a+");
	int flag=1;
	char c;
	char str[255];
	while(flag==1){
		printf("input string:\n");
      	gets(str);
      	fprintf(f,"%s ",str);
      	printf("continue?");
      	c=getchar();
      	if(c=='N' || c=='n'){
      		flag=0;
      	}
      	getchar();
	}
	fclose(f);
	f=fopen("./test","r+");
	int i;
	while(!feof(f)){
		fscanf(f,"%s",str);
		for(i=0;str[i]!='\0';i++){
			if(str[i]>='a' && str[i]<='z'){
				str[i]=str[i]-32;
			}
			
		}
		printf("%s\n",str);
		
	}
	fclose(f);
}
int main(){
	getStringAndSave();
	printf("end\n");
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值