C语言编程作业

C语言编程作业

Week1编程作业1

C程序必看

平均数

从键盘输入某同学的3科成绩,输出这3科成绩的平均分

#include <stdio.h>
main(){
	float a,b,c,avg;
	scanf("%f,%f,%f",&a,&b,&c);
	printf("%.2f",avg=(a+b+c)/3);	 
} 

和、差、积、商与余数

输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数

#include <stdio.h>
int main(){
  int a,b;
  scanf("%d%d",&a,&b);
  printf("%d + %d = %d\n",a,b,a+b);
  printf("%d - %d = %d\n",a,b,a-b);
  printf("%d * %d = %d\n",a,b,a*b);
  printf("%d / %d = %d\n",a,b,a/b);
  printf("%d %% %d=%d\n",a,b,a%b);
  return 0; 
} 

字母大小写转换

#include <stdio.h>
int main(void)
{
	 //ASCII码表中:
	// A-Z: 65-90
	 //a-z: 97-122
 
	char cLetter;
	char cDifference = 'a' - 'A';     // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
 
	printf("请输入要转换的字母: ");
	scanf(" %c", &cLetter);
 
	if (cLetter - 'Z' <= 0)            // 如果不是大写字母,则进行转换成小写字母
            cLetter += cDifference;	
	else                              // 如果是小写,则进行转换成大写字母
            cLetter -= cDifference;
 
	printf("%c", cLetter);
	printf("\n");
 
	return 0;
}

Week2编程作业2

海伦公式求三角形面积

从键盘输入三角形的三条边a,b,c的值,计算三角形的面积

错解

#include <stdio.h>
#include <math.h>
int main()
{
	int a,b,c;
	double p=0;
	double S=0;
	scanf("%d,%d,%d",a,b,c);
	p = (a+b+c)/2.0;
	S = sqrt(p*(p-a)*(p-b)*(p-c));
	
	printf("三角形的面积为:%lf\n",S);
	
	return 0;
}

正解

#include<stdio.h> 
#include<math.h> 
int main()
{
  float a,b,c,p,area; 
  printf("输入三条边边长:"); 
  scanf("%f %f %f",&a,&b,&c); 
  p=1.0/2*(a+b+c); 
   
  if(a+b>c&&b+c>a&&a+c>b)
  {   
    area=sqrt(p*(p-a)*(p-b)*(p-c)); 
    printf("三角形面积为:%.2f",area); 
  } 
  else 
    printf("不能构成三角形");
  return 0;
}

银行存款求本利

具体描述:设银行定期存款的年利率为r,并已知存款期为n年,存款本金为m元,编程计算n年后的本利之和

第一次尝试

#include<stdio.h> 
int main()
{
  float a,b,m;
  int year,con; 
  printf("输入年利率:"); 
  scanf("%f",&a); 
  printf("输入存款期和本金:");
  scanf("%d %f",&year,&m);
  for(int i=0;i<year;i++)
  {
  	b=m*a; 
  	b=m+b;
    con=(int)(b+0.5);
  }
  printf("3年后的本利之和为:%d",con);
  return 0;
}

调试正解

#include<stdio.h> 
int main()
{
  float a,b,m;
  int year,con; 
  printf("输入年利率:"); 
  scanf("%f",&a); 
  printf("输入存款期和本金:");
  scanf("%d %f",&year,&m);
  int i,sum;
  for(i;i<year;i++)
  {
  	b=m*a; //利息 
  	m=m+b;//更新本金 
  	//sum=m+b;	    
  }
  con=(int)(m+0.5);//四舍五入
  printf("%d年后的本利之和为:%d",year,con);
  return 0;
}

温度转换

华氏温度转换为摄氏温度

#include <stdio.h>
int main()
{
	float f;
	float c;
	scanf("%f", &f);
	c = 5 * (f - 32) / 9.0 ;//涉及浮点型的类型时,要格外的注意到这个整数的小数点后面的数
	printf("celsius=%.2f",c);
	return 0;
}

圆和圆柱

从键盘输入圆半径r、圆柱高度h,求圆周长、圆面积、圆柱体积(3.14r2h),输出计算结果,要求输入、输出要有说明,输出取小数点后两位小数

结果正确,但是评分系统说是错的

#include "stdio.h"
#define PI 3.14  
int main()
{
	float r;
	float h;
	float a,b,c;
	//printf("r=");
	scanf("%f", &r);
	//printf("h=");
	scanf("%f",&h);
	a = 2*PI*r ;
	b = PI*r*r;
	c = PI*r*r*h;
	printf("Perimeter=%.2f,CircleArea=%.2f,CylinderVolume=%.2f",a,b,c);
	return 0;
}

输入后面有个空格,而且是全输入

正解**(8分)**

#include "stdio.h"
#define PI 3.14  
int main()
{
	float r;
	float h;
	float a,b,c;
	scanf("r=%f, h=%f",&r,&h);//quan
	a = 2*PI*r ;
	b = PI*r*r;
	c = PI*r*r*h;
	printf("Perimeter=%.2f, CircleArea=%.2f, CylinderVolume=%.2f",a,b,c);
	return 0;
}

第三周修改后的最后正解

想到应该是精度问题没有解决,他是四舍五入保留到小数点的后两位,不能单纯的.f%,还应该有一个四舍五入的取舍问题。

#include "stdio.h"
#define PI 3.14  
int main()
{
	float r,h;
    int temp;
	float a,b,c,c1;
	scanf("r=%f, h=%f",&r,&h);//quan
	a = 2*PI*r ;
	b = PI*r*r;
	c = PI*r*r*h;
	temp = (int)(c*100+0.5);
	c1=temp/100.0;
	printf("Perimeter=%.2f, CircleArea=%.2f, CylinderVolume=%.2f",a,b,c1);
	return 0;
}

四舍五入的详细代码:

结果为123.460000,如果要截小数点后面的几位小数的话,则可以在 printf(“f = %f\n”,f);中的%.2f下功夫。

#include <stdio.h>
int main(int argc, const char * argv[]) {
    
    double f = 123.4567;
    
    //1.进行四舍五入
    f = f + 0.005;
    //2.将要保留的数据挪到整数位,再取整
    int temp = f*100;
    //一步到位
    //int temp = (f+0.005)*100;
    //3.转为所需数字
    f = temp/100.0;
    
    printf("f = %f\n",f);
    
    return 0;
}

Week3编程作业3

数字转换星期

数字转换为星期:要求将输入的数字1~7转换为文字星期几,对其他数字不转换。例如,输入5时,程序输出Friday.

#include<stdio.h>
int main()
{
	int a;
	scanf("%d",&a);
	switch(a)
	{
		case 1:
		    printf("Monday");
		    break;
		case 2:
			printf("Tuesday");
		    break;
		case 3:
			printf("Wednesday");
		    break;
		case 4:
			printf("Thursday");
		    break;
		case 5:
			printf("Friday");
		    break;
		case 6:
			printf("Saturday");
		    break;
		case 7:
			printf("Sunday");
		    break;
		defaut:
			break;
	}
	return 0;
}

程序调试—计算分段函数

计算下列分段函数f(x)的值(保留1位小数)

下面代码有误,调试修改

#include <stdio.h> 
int main(void)
{
    double x, y;               

    printf("Enter x: ");   
    scanf("%lf", x);          
    if(x != 0){          
        y = 1 / x            
    } 
    else { 
        y = 0;               
   }    
    printf("f(%.2f)=%.1f\n", x, y);  

    return 0;  
}

修改为正确代码:

#include<stdio.h>
int main()
{
	float a,x;
	scanf("%f", &x);
	if (x == 0)
	{
		printf("f(0.0)=0.0\n");
	}
	else if (x!=0)
	{
		a = (float)1.0 / x;
		printf("f(%.1f)=%.1f\n",x,a);
	}
	return 0;
}

类似的代码,但是运行有误,未找出错误(已经解决)

#include <stdio.h> 
int main(void)
{
    float x, y;               
    scanf("%f",x);    //没有&符号      
    if(x == 0)
	{          
       printf("f(0.0) = 0.0\n");           
    } 
    else if(x!=0) 
	{ 
        y = (float)1.0 / x;
		printf("f(%.1f)=%.1f\n", x, y);              
   }       
    return 0;  
}

输入转换

输入一个字符,如果输入字符是小写字母(a-z),则程序以大写字母打印;如果输入字符是大写字母(A-Z),则程序以小写字母打印。 如果字符是数字(0-9),程序将打印其值的平方

正解

#include<stdio.h>
#include<math.h>
int main()
{
    char ch;
    //printf("Press a key and then press Enter:");
    scanf("%c", &ch);
    if (ch >= 'a'&&ch <= 'z')//小写字母换成大写字母,小写字母的ASII码比大写的多32 
    {
        ch = ch - 32;
        printf("%c", ch);
    }else if(ch >= 'A'&&ch <= 'Z')//大写字母换成小写字母 
    {
        ch = ch + 32;
        printf("%c", ch);
    }
	else
    {
        printf("%d\n",(ch-48)*(ch-48));
    }
    return 0;
}

printf(“%c,%d/n”, ch,ch);则会输出的是一个输入字符和整数(字符对应的ASII码)

if的循环语句中,if()+else if()+else最后一个else没有括号而且是else不是else if

putchar只能输出单个字符;而printf可以输出各种格式

成绩绩点转换

编写一个程序,将百分制成绩转换为5级制成绩,输出相应的成绩等级和绩点。百分制成绩和5级制成绩对应关系为:

系统过了,但是自己运行的时候,不及格的地方没出来,好奇怪

#include <stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    if(a >= 90&&a <= 100)
  { 
       printf("grade=A grade point=4.0"); 
  }
    else if(a >=85&&a <= 89)
  {     
        printf("grade=A- grade point=3.7");
  }
    else if(a >=81&&a <= 84)
  {     
        printf("grade=B+ grade point=3.3");
  }
  else if(a >=78&&a <= 80)
  {     
        printf("grade=B grade point=3.0");
  }
  else if(a >=75&&a <= 77)
  {     
        printf("grade=B- grade point=2.7");
  }
  else if(a >=72&&a <= 74)
  {     
        printf("grade=C+ grade point=2.3");
  }
  else if(a >=68&&a <= 71)
  {     
        printf("grade=C grade point=2.0");
  }
  else if(a >=65&&a <= 67)
  {     
        printf("grade=C- grade point=1.7");
  }
  else if(a >=63&&a <= 64)
  {     
        printf("grade=D+ grade point=1.3");
  }
  else if(a >=60&&a <= 62)
  {     
        printf("grade=D grade point=1.0");
  }
  else
  {
  	    printf("grade=D grade point=1.0");
  }
  return 0;
}

三角形判决

从键盘输入三角形的三个边,判断是否构成三角形,若能,则输出该三角形的面积及类型(等腰,等边,直角,等腰直角,一般),否则输出“can not form a triangle”

下面的代码自己运行监测的时候是对的,但是系统运行的时候只得了8分

感觉是等腰和等边的判决没有做好,但是找不到问题所在

下面的代码有一定的弊端,对于等腰和等边的判断,应该先判断条件比较强的,也就是先判断等边

#include<stdio.h> 
#include<math.h> 
int main()
{
  float a,b,c,p,area; 
 // printf("输入三条边边长:\n"); 
  scanf("%f %f %f",&a,&b,&c); 
  p=1.0/2*(a+b+c); 
   
  if(a+b>c&&b+c>a&&a+c>b)
  {   
    area=sqrt(p*(p-a)*(p-b)*(p-c));  
	 if(a==b||a==c||b==c)
	{
	    if(a==b==c)
    	{
	    	printf("This is an equilateral triangle.\n"); 
	    } 
	    else
	    printf("This is an isosceles triangle.\n"); 	
	}
	
	else if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
	{
		printf("This is a right triangle.\n");
	}
	else
	{
		printf("This is a general triangle.\n");
	}
    printf("The area of this triangle is %.2f.\n",area); 
  } 
  else 
    printf("can not form a triangle.");
  return 0;
}

第二种写法,但是系统也只是得了8分,感觉绕不开那个等边和等腰

先判断等边,再判断等腰

修改了10分

区别在于if(abc)应该写成if(ab&&bc)(总结)

if(a==b)判断语句的等于是2个=,而不是一个=号

#include<stdio.h> 
#include<math.h> 
int main()
{
  float a,b,c,p,area; 
 // printf("输入三条边边长:\n"); 
  scanf("%f %f %f",&a,&b,&c); 
  p=1.0/2*(a+b+c); 
   
  if(a+b>c&&b+c>a&&a+c>b)
  {   
    area=sqrt(p*(p-a)*(p-b)*(p-c));  
	 if(a==b&&b==c)//if(a==b==c)
	{
        printf("This is an equilateral triangle.\n");
    }
     else if(a==b ||a==c || b==c)
    	{
	    	printf("This is an isosceles triangle.\n"); 
	    } 
	   else if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
	{
		printf("This is a right triangle.\n");
	}
	else
	{
		printf("This is a general triangle.\n");
	}
    printf("The area of this triangle is %.2f.\n",area); 
  } 
  else 
    printf("can not form a triangle.");
  return 0;
}

week4编程作业

1.菱形图案

输入5,显示
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int line,column,i,j;
    printf("Input number of rows (half of the diamond):");
    scanf("%d", &line);
    line=2*line-1; 
    column = line; 

    for(i=1; i<=line; i++){ 
        if(i<(line+1)/2+1){  
            for(j=1; j<=column; j++){  
                if( (column+1)/2-(i-1)<=j && j<=(column+1)/2+(i-1) ){
                    printf("*");
                }else{
                    printf(" ");
                }
            }
        }else{  
            for(j=1; j<=column; j++){  
                if( (column+1)/2-(line-i)<=j && j<=(column+1)/2+(line-i) ){
                    printf("*");
                }else{
                    printf(" ");
                }
            }
        }
        printf("\n");
    }

    return 0;
}

2.Get the sum of all the digits of an integer

运行结果:
54
4+5=9
#include<stdio.h>
int main()
{
	int c=0,n,t,sum=0;
	//printf("Input n:");
	scanf("%d",&n);
	while (n > 0)
	{
		t = n % 10;
		n = n / 10;
		c++;
		sum += t;
		printf("%d ",t);
		if(n>0)
		{
			printf("+ ");
		} 
	}
	
	printf("= %d",sum);
	//printf("位数等于 %d",c);
	return 0;
}


正确

运行结果:
    54
	5+4=9
#include<stdio.h>

int main()
{
	int n,sum,i,arr[20];
 	scanf("%d",&n);
 	
 	for(i=0;n>0;i++)
	{
  		sum+=n%10;
  		arr[i]=n%10;
  		n/=10;
 	} 
 	i--;
 	
 	while(i>=0)
	{
  		printf("%d",arr[i--]);
  		if(i>=00)
   			printf(" + ");
  		else
  			 printf(" = ");
 	}
 printf("%d",sum);
}

利用函数解决直接得出结果

#include<stdio.h>
int main()
{
	int n,i,j;
	printf("输入一个正整数n:\n");
	scanf("%d",&n);
	printf("%d",sum(n));
}
int sum(int n)
{
	int i,a,sum1=0;
	a=n;
	while(a)
	{
		sum1+=a%10;
		a/=10;
	}
	return sum1;
}

3自然数分解质因子相乘

输入一个自然数n,将n分解为质因子连乘的形式输出,如输入24,则程序输出为24=2*2*2*3
#include <stdio.h>

void main()
{
    int n,i;
    //printf("请输入一个正整数");
    scanf("%d",&n);
    printf("%d=",n);
    for( i = 2;i <= n;i++)
    {
        while(n!=i)
        {
            if(n%i==0)
            {
                printf("%d*",i);
                n=n/i;
            }
            else 
                break;
        }
    }
    printf("%d\n",n);

}

4质数(没看懂题意就算了吧)

#include<stdio.h>
int main()
{
 	int t,i,j,s;
	for(i=3;i<=100;i++) 
 {
  	t=1;
  	for(j=3;j<i;j++)
 	if(i%j==0)
  	t=0;
  	if(t==1)
  	printf("%d ",i);
 }
}

5纸币兑换

用一元纸币兑换一分、二分和五分的硬币,要求兑换硬币的总数为50枚,问共有多少种换法?每种换法中各硬币分别为多少?
#include<stdio.h>
int main()
{
 int sum=0,i,j,k;
  for (i = 1; i <=50; i++) 
  {
   for (j = 1; j <=50; j++) 
   {
    for (k = 1; k <=20; k++) 
	{
     if(i+(j*2)+(k*5)==100&&i+j+k==50)
	 {
      printf(" %d, %d, %d\n",k,j,i);
      sum++;
     }
    }    
   }   
  }
  printf("共有%种方案",sum);
} 

6水仙花数

输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如153是“水仙花数”,因为:153 = 1的3次方 + 5的3次方 + 3的3次方。
#include<stdio.h>
int main()
{
	int num = 100;
		printf("水仙花数如下:\n");
	do
	{
		int a,b,c,d;
		a = num % 10;
		b = num / 10 % 10;
		c = num / 100;
		d = a*a*a + b*b*b + c*c*c;
		
		if (d == num)
		{
			printf(" %d\n",num);
		}
		num++;
	} while (num < 1000);
	system("pause");  
	return 0;
}


week5编程作业

1.数组中条件选数

输入10个1~200的整数到一个数组里,将能被7整除的数剔除,输出数组里余下的数据。

正确答案

#include<stdio.h>
#include<string.h>
int main()
{
	int a[10];//10个数的数组 
	int x,i;
	
	for(i=0;i<10;i++)//10个整数 
	{
		scanf("%d",&x);
		if(x<=200&&x>0)
		{
			a[i]=x;
		}
	}
	for(i=0;i<10;i++)
	{
		if(a[i]%7!=0)
		{
			printf("%d ",a[i]);
		}
	}
}

得了6.67分

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[10],b[10],n=0,i;
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}

	for(i=0;i<10;i++)
	{
		if(a[i]%7!=0)
		{
	
			printf("%d ",a[i]);	
		} 
	}
	
	return 0;
	
}

备用代码

#include<stdio.h>
#include<string.h>
void main()
{
char a[1000000];
int b[100],c[100];
int i,j,k,len,t,flag=0,len1=0;
k=0;len=0;t=0;
gets(a);
len1=strlen(a);
for(i=0,j=0;i<=len1;i++)
if(a[i]>='0'&&a[i]<='9')
{
t=10*t+a[i]-'0';
   flag=1;
}
else if(flag==0)
continue;
else
{
b[j]=t;
j++;
len++;
t=0;
flag=0;
}


for(j=0,i=0;i<len;i++)
if(b[i]%7==0) continue;
else if(b[i]%10==7)continue;
else if((b[i]/10)%10==7)continue;
else if((b[i]/100)%10==7)continue;
else if((b[i]/1000)%10==7)continue;
else 
{
c[j]=b[i];
j++;
}
for(i=0;i<j-1;i++)
printf("%d ",c[i]);
printf("%d\n",c[j-1]);
}

2.编写程序实现”查表”功能

编写程序实现”查表”功能,即如果若干个数据存放在一个数组data中,该程序对输入的任意一个数查找数组data中是否有与这个数相等的数。若有,则输出该数在data中的位置,否则输出“没有找到数据!”

3.33分

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[100],i,len,con=0,n=0;
	printf("请输入不大于100的整数数组长度:");
	scanf("%d",&len);
	printf("\n请输入%d位长度的数组:",len);
	
	for(i=0;i<len;i++)
		{
			scanf("%d",&a[i]);
		}
		
	printf("\n请输入要查找的数:");
	scanf("%d",&con);
	
	for(i=0;i<len;i++)
	{
		if(a[i]==con)
		{
			printf("\n查找的数据为:%d\n",a[i]);
			printf("在数组的位置为:%d\n",i+1);
		    //b[100]=i;
		}
		else if(a[i]!=con)
		{
			n++;
		}
	}
	if(n=len)
	{
		printf("没有找到数据!");	
	}
	
	return 0;
}

备选代码

#include<stdio.h>
//查表
int main()
{
	int len,i;
	int data[100];
		printf("请输入不大于100的整数数组长度:");
		scanf("%d",&len);
		printf("\n请输入%d位长度的数组:",len);
      	  for(i=0;i<len;i++)
			{
				scanf("%d",&data[i]);
			} 
			
  	int can;
	printf("请输入要查找的数:");
	scanf("%d",&can);
	for(i=0; i<len;i++)
	{
		if(data[i]==can)
		{
			printf("\n查找的数据为:%d\n",data[i]);
			printf("\n在数组的位置为:%d\n",i+1);
			//printf("你要查找的数在表中!");
			return 0;
		}		
	}
printf("\n没有你要查找的数!");
	return 0;
	
} 

6.67分****

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a[100],i,len,con=0,n=0;
 printf("请输入不大于100的整数数组长度:");
 scanf("%d",&len);
 printf("请输入%d位长度的数组:",len);
 
 for(i=0;i<len;i++)
  {
   scanf("%d",&a[i]);
  }
  
 printf("请输入要查找的数:");
 scanf("%d",&con);
 
 for(i=0;i<len;i++)
 {
  if(a[i]==con)
  {
   printf("查找的数据为:%d\n",a[i]);
   printf("在数组的位置为:%d\n",i+1);
   return 0;
      //b[100]=i;
  }
  else if(a[i]!=con)
  {
   n++;
  }
 }
 if(n=len)
 {
  printf("没有找到数据!"); 
 }
 
 return 0;
}

10分

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a[100],i,len,con=0,n=0;
 printf("请输入不大于100的整数数组长度:");
 scanf("%d",&len);
 printf("\n请输入%d位长度的数组:",len);
 
 for(i=0;i<len;i++)
  {
   scanf("%d",&a[i]);
  }
  
 printf("\n请输入要查找的数:");
 scanf("%d",&con);
 
 for(i=0;i<len;i++)
 {
  if(a[i]==con)
  {
   if(n==i){
  printf("\n查找的数据为:%d\n",a[i]);
    printf("在数组的位置为:%d",i+1);
   }
    else
     printf(" %d",i+1);
      //b[100]=i;
  }
  else if(a[i]!=con)
  {
   n++;
  }
 }
 if(n==len)
 {
  printf("\n没有找到数据!"); 
 }
 
 return 0;
}

3. 将1~200中能被7整除的数删除,显示余下的数据

10分,但是我没有用数组来做

#include<stdio.h>
//将1~200中能被7整除的数删除,输出余下的数!
int main()
{
	int i;
	for(i=0;i<=200;i++)
    {
		if(i%7!=0)
		{
			printf("%d ",i);
		}
		else;
	}
	
return 0;
}

4. 输入并打印数组,求数组元素的最大值和最小值

min没出来,他老是说min等于0

问题出在不能把max和min定义为等于0.应该定义为a[0]结果才对

#include<stdio.h>
int main()
{
	int i,len,max,min;
	int a[100];
	printf("输入整数个数:"); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		scanf("%d",&a[i]); 
	}
	max=0;
	min=0;
	
	for(i=0;i<len;i++)
	{
		if(a[i]>max)
		{
			max=a[i];
		}
	}
	
	for(i=0;i<len;i++)
	{
		if(a[i]<min)
		{
			min=a[i];
		}
	}
	printf("max=%d,min=%d",max,min);
		
return 0;
}

修改后,满分

#include<stdio.h>
int main()
{
	int i,len;
	int a[100];
	//printf("输入整数个数:"); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		scanf("%d",&a[i]); 
	}
    
	int max=a[0];//为什么在这里定义max就是对的呢,而一开始定义max和min,就没出来,好奇怪
		
	for(i=0;i<len;i++)
	{
		if(a[i]>max)
		{
			max=a[i];
		}
	}
    
	int min=a[0];
	for(i=0;i<len;i++)
	{
		if(a[i]<min)
		{
			min=a[i];
		}
	}
	printf("max = %d, min = %d",max,min);
		
return 0;
}

5.最接近的相邻三数之和(写了好久,10分)

​ 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个相邻整数,使得它们的和与 target 最接近。返回这三个数的和与target的差值。差值的定义应为绝对值,即min(|(相邻3个数的和)-target|).C语言中绝对值为fabs函数。a的绝对值为:fabs(a)

#include<stdio.h>
#include<math.h>
int main()
{
	int i,len,tar,temp,k,j,m;
	int a[100],b[100];
	printf("输入整数个数:"); 
	scanf("%d",&len);
	printf("输入数组中的数:");
	for(i=0;i<len;i++)
	{
		scanf("%d",&a[i]); 
	}
	printf("target:"); 
	scanf("%d",&tar);
	
	/*数组a中相邻3个元素的和,并将这些和存在数组b中*/
	for(k=0;k<len-2;k++)
	{
     b[k]=a[k]+a[k+1]+a[k+2];      
    }
    
	/*按每行3个元素的形式输出*/
    for(j=0;j<len-2;j++)
	{
         printf("%d ",b[j]);
         if(j%3==2)
        printf("\n");
    }
    //三个相邻的数组和与target目标值进行比较,找出最接近target的三个相邻和 
    temp=fabs(tar-b[0]);
    for(j=0;j<len-2;j++)
    {
    	m=fabs(tar-b[j]);
    	if(temp>m)
    	{
    		temp=m;
    		printf("%d",temp);
		}
	}
return 0;
}

呜呜呜呜,我自己写出来了,呜呜,太棒了,10分!

#include<stdio.h>
#include<math.h>
int main()
{
	int i,len,tar,temp,k,j;
	int a[100],b[100],c[100];
	//printf("输入整数个数:"); 
	scanf("%d",&len);
	//printf("输入数组中的数:");
	for(i=0;i<len;i++)
	{
		scanf("%d",&a[i]); 
	}
	//printf("target:"); 
	scanf("%d",&tar);
	
	/*数组a中相邻3个元素的和,并将这些和存在数组b中*/
	for(k=0;k<len-2;k++)
	{
     b[k]=a[k]+a[k+1]+a[k+2];      
    }
    
	/*按每行3个元素的形式输出*/
//    for(j=0;j<len-2;j++)
//	{
//         printf("%d ",b[j]);
//         if(j%3==2)
//        printf("\n");
//    }
    //三个相邻的数组和与target目标值进行比较,找出最接近target的三个相邻和 
   
    //printf("temp的值为:%d",temp) ;
    for(j=0;j<len-2;j++)
    {
    	c[j]=fabs(tar-b[j]);
    	
	}
	temp=fabs(tar-b[0]);
	for(j=0;j<len-2;j++)
    {
    	c[j]=fabs(tar-b[j]);
    	if(c[j]<temp)
    	{
    		temp=c[j];
		}
	}
	printf("%d",temp);
	
return 0;
}

6 找出二维数组的“鞍点”(花了很久的时间,4小时,好失败)

10分代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int data[100][100];
    int i, j, k, a, b, max;
    printf("请输入二维数组行数:\n");
    scanf("%d", &a);
    printf("请输入二维数组列数:\n");
    scanf("%d", &b);
    //输入二维数组的值 
    printf("请输入%d*%d数组的数值:\n", a, b);
        for (i = 0; i < a; i++)
    {
        for (j = 0; j < b; j++)
            scanf("%d", &data[i][j]);
    }
    //判断出该行元素的最大值
    for (i = 0; i < a; i++)
    {
        for (j = 0, max = 0; j < b; j++)//先找出i行的最大值的数max 
        {
            if (data[i][j] >= max)
            {
                max = data[i][j];
            }
        }
        
        int flag = 0;
        for ( j=0 ; j<b ; j++ )
		{
         if ( data [i][j] == max )
		 {
          	for ( k=0 ; k<a ; k++ )
          	{
				if ( data [k][j] < data[i][j] )
		   		{
            		break;
     			}
			}	
    		if ( k==a )
				{
    				 flag = 1;
             		 printf("第%d行第%d列存在鞍点,值为 %d\n", i + 1, j+1, data[i][j]);
    			}
   			}
 	    } 
        if (flag==0)
        {
            printf("第%d行不存在鞍点\n", i + 1);
            //break;
        }
    }

    return 0;
}

10分的第二种思路

#include<stdio.h>
int main()
{
	int a[100][100],m,n,max[m],min[n],i,j;
	int k=0;//判断数相等的标志 
	scanf("%d %d",&m,&n);//行;列 
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	printf("请输入二维数组行数:\n");
	printf("请输入二维数组列数:\n");
	printf("请输入%d*%d数组的数值:\n",m,n);
	
	for(i=0;i<m;i++)
	{
		max[i]=a[i][0];//给行最大数max赋初值 
		min[i]=a[0][i];//给列最小数max赋初值
		for(j=0;j<n;j++)
		{
			if(max[i]<a[i][j])    
			{
				max[i]=a[i][j]; 
			}
			if(min[i]>a[j][i]) 
			{
				min[i]=a[j][i];
			}
		}		
	}	
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
				if(a[i][j]==max[i]&&a[i][j]==min[j])
				{
					printf("第%d行第%d列存在鞍点,值为 %d\n",i+1,j+1,a[i][j]);
					k=1;
				}
			}
			if(k==0)
			{
				printf("第%d行不存在鞍点\n",i+1);
			}
			k=0;
		}
		return 0;
}

备选代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int data[100][100];
    int i, j, k, p, q,a,b,max, min;
    scanf("%d",&a);
    scanf("%d",&b);
    //输入二维数组的值 
    for (i=0; i<a; i++)
	{
        for (j=0; j<b; j++)
            scanf("%d", &data[i][j]);               
    }
    //判断出该行元素的最大值
    for (i=0; i<3; i++)
	{
        for (j=0, max=0, p=0; j<a; j++)
		{         
            if (data[i][j]>max)
			{
                max=data[i][j];
                p=j;
            }
            else
			{
                max=max;
                p=p;
            }
        }
        //判断最大值在该列是否为最小值
        for (k=0, min=data[i][p], q=i; k<b; k++)
		{   
            if (data[k][p]<min)
			{
                min=data[k][p];
                q=k;
            }
            else
			{
                min=min;
                q=q;
            }
        }
        //如果该最大值行号没有改变,输出鞍点
        if (i==q)
		{
            printf("%d is the saddle point!\n", data[i][p]);  
            break;
        }
    }
    
    //输出没有鞍点
    if (i==3 && i!=q)
        printf("There is no saddle point!\n");             
    system("pause");
    return 0;
}


第二个比较完善的代码,且运行正确

#include<stdio.h>
/*
找出一个二维数组中的鞍点,即该位置上的元素在该行最大,
在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.
*/
int main(void)
{
	int a[3][3],max,min,i,j,k,m;
	for(i=0;i<3;i++)
  	for(j=0;j<3;j++)
   	scanf("%d",&a[i][j]);//输入数组
   	
	for(i=0;i<3;i++)
	{
  		max=a[i][0];//给max 赋初始值
 		for(j=0;j<3;j++)
    	if(a[i][j]>max)
    	{ 
     		max=a[i][j];
     		k=j;//找到第i行的最大值;
    	}				
   		min=max;//把max的值作为第k列的最小值
 		for(m=0;m<3;m++)//第k列保持不变,变换行数m
   		 {	
    		if(min>a[m][k])//若不符合鞍点性质,则break结束
			break;
   		 }
   		if(m==3) 
			{
				printf("%d %d",i+1,k+1);//遍历完当前列,若当前值符合鞍点性质,
             	break;            //则输出鞍 点坐标
        	}
    }
    
 if(i==3) printf("%d",-1);//若整个数组遍历完成,还未找到鞍点,则返回-1
    return 0;
}

6.67分

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int data[100][100];
    int i, j, k, p, q,a,c,b,max, min;
    printf("请输入二维数组行数:\n");
    scanf("%d",&a);
    printf("请输入二维数组列数:\n");
    scanf("%d",&b);
    //输入二维数组的值 
    printf("请输入%d*%d数组的数值:\n",a,b);
    for (i=0; i<a; i++)
	{
        for (j=0; j<b; j++)
            scanf("%d", &data[i][j]);               
    }
    //判断出该行元素的最大值
    for (i=0; i<a; i++)
	{
		//a1=0;
	//	a1++;
        for (j=0, max=0, p=0,c=0; j<b; j++)
		{         
            if (data[i][j]>=max)
			{
                max=data[i][j];
                p=j;//该行元素的最大值的列数 
                c=i;//该行元素的最大值的行数 
            }
            else
			{
                max=max;
                p=p;
                c=c;
            }
        }
        //判断最大值在该列是否为最小值
        for (k=0, min=data[i][p], q=i; k<a; k++)
		{   
            if (data[k][p]<min)
			{
                min=data[k][p];
                q=k;
            }
            else
			{
                min=min;
                q=q;
            }
        }
        //如果该最大值行号没有改变,输出鞍点
        if (i==q)
		{
            printf("第%d行第%d列存在鞍点,值为 %d\n",i+1,p+1, data[i][p]);  
            //break;
        }
        if(i!=q)
        {
        	printf("第%d行不存在鞍点\n",i+1);  
            //break;
           // a1++;
		}
    }
    
   // 输出没有鞍点
    //if (a==a1 )
    //{
    //	printf("无鞍点!\n"); 
	//}            
    system("pause");
    return 0;
}


7二维数组基础题——矩阵运算

矩阵运算:读入一个正整数n(1<=n<=6),再读入n阶方阵a,计算该矩阵除副对角线,最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线

#include<stdio.h>
int main()
{
    int n,num;
    scanf("%d",&n);
    int sum=0;
    int i =0; 
    for( i=0;i<n*n;++i)
    {
        scanf("%d",&num);
        if(i/n == n-1) continue;
        if(i%n == n-1) continue;
        if((n-1+i)/n + i%n == n) continue;
        
        sum += num;
    }
    printf("%d\n",sum);
    
    return 0;
}

8.冒泡算法

#include<stdio.h>
int main()
{
	int arr[10];                  /*定义一个数组*/
	int i,j;                      /*i,j为将要使用的循环控制变量*/
	int temp; 
	int len; 
	printf("Please input the number of the array not bigger than 10:\n"); 
	scanf("%d",&len);
	printf("Please input 3 data: \n");
	for(i=0;i<len;i++)
	{
		scanf("%d",&arr[i]); 
	}                   /*temp为数值交换时使用的临时变量*/
//	for(i=0;i<=9;i++)             /*输入10个数*/
//	{
//		scanf("%d",&arr[i]);
//	}
	for(i=1;i<=len-1;i++)          /*i代表排序轮数,总轮数=元素个数-1*/
	{
		for(j=0;j<len-i;j++)       /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
		{
			if(arr[j]>arr[j+1])   /*如果前一项比后一项大,则两项的值互换*/
			{
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
	for(i=0;i<=len-1;i++)             /*输出排序后的数组*/
	{
		printf("The sorted data array in ascending order is:%lf",arr[i]);
	}
	return 0;
} 

满分十分

#include<stdio.h>
int main()
{
	float arr[10];                  /*定义一个数组*/
	int i,j;                      /*i,j为将要使用的循环控制变量*/
	float temp; 
	int len; 
	printf("Please input the number of the array not bigger than 10:\n"); 
	scanf("%d",&len);
	printf("Please input %d data: \n",len);
	for(i=0;i<len;i++)
	{
		scanf("%f",&arr[i]); 
	}                   /*temp为数值交换时使用的临时变量*/
//	for(i=0;i<=9;i++)             /*输入10个数*/
//	{
//		scanf("%d",&arr[i]);
//	}
	for(i=1;i<=len-1;i++)          /*i代表排序轮数,总轮数=元素个数-1*/
	{
		for(j=0;j<len-i;j++)       /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
		{
			if(arr[j]>arr[j+1])   /*如果前一项比后一项大,则两项的值互换*/
			{
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
	printf("The sorted data array in ascending order is: ");
	for(i=0;i<=len-1;i++)             /*输出排序后的数组*/
	{
		printf("%.2f ",arr[i]);
	}
	return 0;
} 

9.对输入字符串采用冒泡排序法进行排序

10分

#include <stdio.h>//包含标准输入输出函数
#include <stdlib.h>//包含malloc动态地址分配
#include <string.h>//包含memset函数meset(a,0,sizeof(a));//strlen(str);求字符串的长度
/*
用选择法或冒泡法对输入的50个字符(按照ASII码由小到大)进行排序
*/
int main()
{
	void sort(int length,char s[]);//声明排序函数
	char str[55];//使用字符数组存储
	int len;
	scanf("%s",str);
	len=strlen(str);//计算字符数组的长度
	//printf("字符串长度%d\n",len);
	sort(len,str);
	return 0;
}
void sort(int lenth,char s[]) //冒泡排序
{
	int i,j;
	char temp;
	for(i=0;i<lenth-1;i++){//len-1次冒泡排序
		for(j=lenth-1;j>i;j--){
			if(s[j-1]>s[j]){//大的在前 逆序
				temp = s[j];
				s[j] = s[j-1];
				s[j-1] = temp;//交换
			}
		}
	}
	for(i=0;i<lenth;i++){
		printf("%c",s[i]);
	}
	printf("\n");
}

10.字符基础题——判断回文字符串

判断输入的一串字符是否为“回文”。所谓“回文”,是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。试编写相应程序。输入字符串长度不超过50。

#include<stdio.h>
#include<string.h>

int main()
{
    char arr[100];
    int len;
    int i=0;
	int j;
	//printf("请输入您要判断的字符串:\n");
    gets(arr);
    len=strlen(arr);
    j=len-1;
    while( (i<j)&&(arr[i]==arr[j]) )
    {
        i++;
        j--;
    } 
    if(i>=j)	
        printf("YES\n");
    else	
        printf("NO\n");
    return 0;
}

11.字符串基础题——删除指定区间的字符(方法很巧)

编写一个程序,以从字符串中删除指定区间的字符。 该函数应采用三个参数:源字符串,源字符串中的起始索引号以及要删除的字符数

#include <stdio.h>
#include <string.h>
 
int main()
{
  char line[100];
  int i,len;
  int s,e;
  //printf("输入一个字符串: ");
  gets(line); //不能使用scanf()函数,因为字符串中有空格,而scanf()输入的结束判断是以空格为标准的
  len = strlen(line);
  //printf("输入起始索引: ");
  scanf("%d %d",&s,&e);
  for( i=s+e;i<=len;i++)
  {
   line[i-e]=line[i];
  }
  
  printf("%s\n",line);
  return 0;
}

结果:

the wrong son

4 6

the son

我自己写的代码是:不对

#include <stdio.h>
#include <string.h>
 
int main()
{
  char line[100];
  int i,j,len;
  int s,e;
  printf("输入一个字符串: ");
  gets(line);
  //scanf("%s",line); 
  len = strlen(line);
  printf("输入起始索引: ");
  //gets(s);
  //gets(e);
//  e=getchar(); 
  scanf("%d %d",&s,&e);
  for(i=0;i<len+1;i++)
  {
   //if(i==s)
   {
    for(j=i;j<len;j++)
    {
     if(j=s)
     {
     line[j]=line[s+e]; 
   }
  }
   }
    len--;
    i--;
  }
  printf("%s\n",line);
  return 0;
}

12.统计字符串中字符出现频率并按字母顺序打印统计结果

【问题描述】从键盘输入一个字符串(假设仅包含小写字母字符),统计字符串中各字符出现的频率,并按字母顺序输出个字符的统计频率 .提示:定义一个长度为26的整型数组 int count[26],用于统计各字母的出现频率。 例如字母为c, 则count[‘c’-‘a’]+=1. 最后依次输出count数组中计数值不为零的字母即可。

10分

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char arr[10] = { 0 };//arr[]里面的数据会影响得分,10只是刚好符合数据监测而已,瞎猫碰上死耗子
	int i=0;
	int len = sizeof(arr) / sizeof(char);
	//从键盘读取十个字符
	for ( i = 0; i < len-1; i++)
	{
		scanf("%c", &arr[i]);
	}
	
	int count[26] = { 0 };
	//printf("%u\n", sizeof(count));
	for ( i = 0; i < len; i++)
	{
	//arr数组中字母的ascII码值减去'a'刚好得到count数组中下标
		int index = (int)arr[i] - 'a';
		count[index]++;
	}
	for ( i =0 ; i < 26; i++)
	{
		if (count[i] != 0)
		{
			printf("%c %d\n", 'a' + i, count[i]);
		}
	}
	return 0;
}

week6编程作业

1数组之和

尝试自己写的,但不对,调试没出来

#include<stdio.h>
int ArraySum (int n, int m,int a[n][m]);//函数申明
//功能函数 
int ArraySum ( int n,int m,int a[n][m]) 
{	

	for( int i = 0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			int sum+=a[i][j];
		}
	}
	return sum;
}

int main()
{
	int n,m,i,j;
	scanf("%d%d",&n,&m);
	//输入二维数组的值
	for( i = 0;i<n;i++)
	{
		for(j=0;j<m;j++){
			scanf("%d",&a[i][j]);
		}
	 } 
	ArraySum();
	return 0;
}

10分

#include <stdio.h>
//int fun(int a[][],int n,int m);
int main()
{ 
	int a[100][100],n,m,sum=0;
	int i,j;
	int ArraySum(int a[100][100],int n,int m);
	//printf("Input the row and col number of array:");
	scanf("%d%d",&n,&m);
	//printf("Input the number of array:");
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			sum=ArraySum(a,n,m);
		}
	}
	printf("%d\n",sum);
}

int ArraySum(int a[100][100],int n,int m)
{ 
	int sum=0;
	int i,j;
	for(i=0;i<n;i++)
	{
		//int sum =0;
		for(j=0;j<m;j++)
		sum+=a[i][j];
	}
	return sum;
}

注意的点

在main函数中要将sum初始化,不然会有警告消息提示
在功能函数中,int sum的初始化要放在for循环的外面,不能放在for循环里面
函数声明可以放在mian函数的外面或者里面都行,只要放在调用的前面就可以

2.欧氏距离

​ 使用函数计算两点间的距离:给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。

要求定义和调用函数dist(x1,y1,x2,y2)计算两点间距离

#include <stdio.h>
#include <math.h>
//函数声明 
double dist( double x1, double y1, double x2, double y2 );
//主函数 
int main()
{    
    double x1, y1, x2, y2;
    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("Distance=%.2f\n", dist(x1, y1, x2, y2));
    return 0;
}
//功能函数 
double dist( double x1, double y1, double x2, double y2 )
{
    double d = pow( (x1-x2), 2) + pow( (y1-y2), 2);
    double f = sqrt( d );
    return f;
}

3.判断素数(主要是这个算法没搞明白,自己编2小时,满分)

编写一个判素数的函数,在主函数中输入一个整数,输出是否为素数的信息。主函数中循环输入整数,当输入小于3的整数结束程序。

判断素数的基本函数,运用一个数来记录下这个数除以比这个数小的数的所有能除的次数

#include <stdio.h>
int main() 
{
	int n;
	printf("请输入一个1-100之间的整数:\n");
	scanf("%d", &n);
	int m = 0,i;
	for (i = 2; i < n; i++ ) 
	{	
		if(n % i  == 0) 
		{
			m++;
		}
	}	
	if (m == 0) 
	{
		printf("%d是素数\n", n);
	} 
    else 
	{
		printf("%d不是素数\n", n);
	} 
	return 0;
}

用函数模块来写,带函数判断质数的代码

成功:有一个连续输入的要求(自己写的,编了将近2小时)

#include <stdio.h>
int Prime( int n);//函数声明 
int main() 
{
	int n;
	while(1)//连续输入的一个需求 
	{
		scanf("%d", &n);
		printf("m=\n");	
		if ( n<3 )
		{		
			printf("The end.\n");
			break;
		}
		else
		{
			Prime(n);
		}
	}
	return 0;
}

int Prime ( int n )
{
		int m = 0,i;
		for( i = 2 ; i< n ; i++)
		{
			if( n%i == 0)
			{
				m++;
			}
		}    
	//进行总的一个判断,把关 
		if(m == 0)
		{
			printf("%d is prime.\n",n);
		}
		else
		{
			printf("%d is not prime.\n",n);
		}
		return 0;
	}	

4.逆序字符串(速度很快,代码编的很快,通过了)

编写一个可以将字符串逆序的函数,在主函数中调用该函数将输入字符串逆序输出。

思路

让字符串数组从末尾输出,即可,最后再i--
字符串的长度等于strlen(str),要加入一个头文件include<string.h>
#include <stdio.h>
#include<string.h>
void Str(char str[])
{	
		int i;
		printf("the reverse string:");
		for(i=strlen(str);i>=0;i--)
		{
			printf("%c",str[i]);
		}
}

int main()
{
	char str[100];
	scanf("%s",str);
	printf("the original string:%s\n",str);
	Str(str);
	return 0;
}

5.替换字符串中字符(速度很快,代码编的很快,通过了)

编写一个字符串替换函数,可以将所给字符串中与指定字符相同的所有字符替换成要求的字符,并在主函数中调用该函数实现字符串替换操作。(10分)

#include<stdio.h>
#include<string.h> 
void replace(char str[], char c, char s)//函数块 
{
	int i=0;
	for(i=0;i<=strlen(str);i++)
	{
		if(str[i]==c)
		{
			str[i]=s;
		}
	}
}

int main()
{
    char str[100]="ABCDECCFGC";
    replace(str, 'C', '5');
    printf("%s\n", str);
}

6.函数——将字符串插入(知识点总结,数组串,指针函数)

编写一个将一个字符串插入到另一个字符串中的函数,在主函数中调用该函数实现字符串的插入操作。插入函数包含三个参数,即将str2插入到str1的pos位置。

思路

//char * change(char s1[],char s2[],int n)一个指针函数, 根据传入的参数`,来计算函数功能,其结果通过指针的形式返回给调用方

1.先把str1的值放到str{2个字符串的长度}末尾,str1字符串中有足够的空间存放str2字符串
2.然后将s2的值和插入的位置建立起来,s2[i]和插入值n的联系为s1[i+n]
3.malloc函数的作用是动态分配内存,以解决静态内存定长、不能手动释放等缺陷,free(p)

知识点:字符串数组

char ch[N] 和char *str = (char*)malloc(N*sizeof(char))
char ch[N] :当数组中个数成为自变量的时候,不能使用这种定义方式,应该申请动态数组
char *s1 = (char*)malloc(20 * sizeof(char));///申请20个连续字节的空间,定义*ch,指向该连续空间的首地址sizeof(char)=1)

动态数组

当函数的返回值为指针的时候,倘若指针指向的是局部变量:ch[6]为存储的是局部变量,当返回指针str时,函数外,该变量生命周期结束,所以要使用动态数组

void*   func(int N)
{
    char *str = (char*)malloc(N*sizeof(char));
    return str;
}
 
void*   func(int N)
{
    char ch[6]="hello";
    char *str = ch;
    return str;
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
 char  *change(char s1[],char s2[],int n)
 {
    int len1=strlen(s1),len2=strlen(s2),i;
    char N[]="error";
    char *P=N;
    //char *P="error";
    
    if(n<0||n>len1)
    {
    	return P;
	}
	
	else
	{
     	for(i=len1;i>=n-1;i--)//把字符串插入点后的文件挪出去 
	 	{
	 	 	s1[i+len2]=s1[i];
	 	} 
        
	  	for(i=0;i<len2;i++)//把字符串2的内容挪进来 
	  	{
	  		s1[n+i]=s2[i];
		}
    	return s1;
	}
 } 

 int main()
 {
 	char *s1 = (char*)malloc(20 * sizeof(char));//动态分配内存 ,free(p)手动释放内存 
	char *s2 = (char*)malloc(20 * sizeof(char));
    //char s1[20],s2[20];//静态分配内存 ,不能手动释放 
	int n;
	char s3[30];
	char *newstr = s3;//作为函数调用方的地方
	printf("Please input two strings:\n");
	scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
	printf("Please input the position of insert:\n");
	scanf("%d", &n);
	newstr = change(s1, s2, n);
	printf("%s\n", newstr);
	free(s1);
	free(s2);
 
 }

10分

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
 char  *change(char s1[],char s2[],int n)
 {
    int len1=strlen(s1),len2=strlen(s2),i;
    char N[]="error";
    char *P=N;
    //char *P="error";
    
    if(n<0||n>len1)
    {
    	return P;
	}
	
	else
	{
     	for(i=len1;i>=n-1;i--)//把字符串插入点后的文件挪出去 
	 	{
	 	 	s1[i+len2]=s1[i];
	 	} 
        
	  	for(i=0;i<len2;i++)//把字符串2的内容挪进来 
	  	{
	  		s1[n+i]=s2[i];
		}
    	return s1;
	}
 } 

 int main()
 {
 	char *s1 = (char*)malloc(20 * sizeof(char));//动态分配内存 ,free(p)手动释放内存 
	char *s2 = (char*)malloc(20 * sizeof(char));
    //char s1[20],s2[20];//静态分配内存 ,不能手动释放 
	int n;
	char s3[30];
	char *newstr = s3;//作为函数调用方的地方
	printf("Please input two strings:\n");
	scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
	printf("Please input the position of insert:\n");
	scanf("%d", &n);
	newstr = change(s1, s2, n);
	printf("%s\n", newstr);
	free(s1);
	free(s2);
 
 }

写出来了10分

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
 char  *change(char s1[],char s2[],int n)
 {
    int len1=strlen(s1),len2=strlen(s2),i;
    char N[]="error";
    char *P=N;
    //char *P="error";
    
    if(n<0||n>len1)
    {
    	return P;
	}
	
	else
	{
     	for(i=len1;i>=n-1;i--)
	 	{
	 	 	s1[i+len2]=s1[i];
	 	} 
        
	  	for(i=0;i<len2;i++)
	  	{
	  		s1[n+i]=s2[i];
		}
    	return s1;
	}
 } 

 int main()
 {
 	char *s1 = (char*)malloc(20 * sizeof(char));
	char *s2 = (char*)malloc(20 * sizeof(char));
	int n;
	char s3[30];
	char *newstr = s3;//作为函数调用方的地方
	printf("Please input two strings:\n");
	scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
	printf("Please input the position of insert:\n");
	scanf("%d", &n);
	newstr = change(s1, s2, n);
	printf("%s\n", newstr);
 
 }
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
 char  *change(char s1[],char s2[],int n)
 {
     int len1=strlen(s1);
     int len2=strlen(s2);
    int i;
    char N[]="error";
    char *P=N;
    //char *P="error";
    if(n<0||n>len1)
    {
    	return P;
	}
	else
	{
     for(i=len1;i>=n-1;i--)
	 {
	 	  s1[i+len2]=s1[i];
	  } 
        
	  for(i=0;i<len2;i++)
	   s1[n+i]=s2[i]; 
    	return s1;
	}
 } 

 int main()
 {
 	char *s1 = (char*)malloc(20 * sizeof(char));
	char *s2 = (char*)malloc(20 * sizeof(char));
	int n;
	char s3[30];
	char *newstr = s3;//作为函数调用方的地方
	printf("Please input two strings:\n");
	scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
	printf("Please input the position of insert:\n");
	scanf("%d", &n);
	newstr = change(s1, s2, n);
	printf("%s\n", newstr);
 
 }

原因:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9biHqIta-1654157258513)(E:\Coding\typora\C语言编程photo\image-20220418105422727.png)]

参考代码:(6.67分)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 char  *change(char s1[],char s2[],int n)
 {
     int len1=strlen(s1);
     int len2=strlen(s2);
    int i;
    int j=0;
    int k=0;
     for(i=len1;i>=n-1;i--)
	 {
	 	  s1[i+len2]=s1[i];
	  } 
	  for(i=0;i<len2;i++)
	   s1[n+i]=s2[i]; 
    return s1;
 } 
 int main()
 {
 	char *s1 = (char*)malloc(20 * sizeof(char));
	char *s2 = (char*)malloc(20 * sizeof(char));
	int n;
	char s3[30];
	char *newstr = s3;
	printf("Please input two strings:\n");
	scanf("%s%s", s1,s2);
//	printf("请输入第二个字符串:");
//	scanf("%s", s2);
	printf("Please input the position of insert:\n");
	scanf("%d", &n);
	newstr = change(s1, s2, n);
	printf("%s\n", newstr);
 
 }

7. 函数——多函数综合题

10分

#include<stdio.h>
//以下为全局变量
int price[5]={100,50,35,150,200};//产品报价
int item_n[100][5];//用来表示不同销售员对应产品销售数量的数组,如 item_n[1][3]表示销售员1
//销售的3号产品的数量。销售员编号从0开始
int n=0;
int maximum (int values[],int n)
{
//找出谁是销售冠军,返回为数组最大值的索引
int top_nu=0,i;
for(i=0;i<n;i++)
{
	if(values[i]>values[top_nu]) top_nu=i;
}
return top_nu;
}
void total_sales(int n,int arr[][5])
{
	int i,j;
	int values[100]={0};
	for(i=0;i<n;i++)
	{
		for(j=0;j<5;j++)
		{
			values[i] +=arr[i][j]*price[j];
		}
	}
	for(i=0;i<n;i++)
	{
		printf("total sales of salesman %d is %d\n",i,values[i],values[i]*0.1);
		printf("income of salesman %d is %.4lf\n",i,values[i]*0.1);
	}
	int max=maximum(values,n);
	printf("sales-champion is salesman %d\n",max);
/*
计算每个销售人员的总销售额并输出。
销售佣金为10%,请计算每个销售员的收入并输出
调用 maximum() 输出谁是销售冠军
*/
}

int main()
{
//数据读入
int i,j;
printf("please input the number of salesman\n");
scanf("%d",&n);
printf("please input the number of  items sold for each product of %d salesman\n",n);
for(i=0;i<n;i++)
{
	for(j=0;j<5;j++)
	scanf("%d",&item_n[i][j]);
}
total_sales(n,item_n);
}

8. 函数——递归将整数转为二进制

#include <stdio.h>
void binary(int num);
int main() 
{
	//实现十进制转换成二进制
	int num = 0;
	scanf("%d",&num); 
	binary(num);
	return 0;
}
 
void binary(int num) {
	int i = num % 2;
	if (num > 0) {
		binary(num / 2);
		printf("%d", i); //递归的后序输出,实现输出的倒置
	}
}

9. 实验 6 函数:整数分解为素因子乘积

#include <math.h>
#include <stdio.h>
#include <string.h>

int isPrime(int para)//函数isPrime用来判断质数
{
    int result=1;
    if(para%2==0||para<2){
        result = 0;
    }else{
        int i=3;
        for(i=3;i<para;i=i+2)
        {
            if(para%i==0)
            {
                result = 0;
                break;
            }
        }
    }
    return result;
}

int main()
{
    int input;
    scanf("%d",&input);
    printf("%d=",input);

    int i=2;
    if(isPrime(input)){
        printf("%d",input);
    }else{
        for(i=2;i<input;i++)
        {
            while(input%i==0)
            {
                input=input/i;
                if(isPrime(input)||input==2)//此处是最后一次除法
                {
                    printf("%d*%d",i,input);
                    break;   
                }else//每找到一个质因数就输出i*
                {
                    printf("%d*",i);
                }
            }

        }


    }
    return 0;
}

10. 函数——哥德巴赫猜想之偶数分解

任何一个大偶数都能分解成两个质数相加

10分

#include <stdio.h>
#include <math.h>
int isPrime(long x){
	int i;
	for(i=2;i<(int)sqrt(x)+1;i++)
	{
		if(x%i==0)return 1;
	}
return 0;
}
void getPrimePair(long m)
{
	int i;
	int num1;
	int num2;
	int count=0;
	for(i=2;i<=m/2;i++)
	{
		num1 =i;
		if(isPrime(num1)) num1=0;
		num2=m-i;
		if(isPrime(num2)) num2=0;
		if(num1&&num2)
		{
			printf("%ld = %d + %d\r\n",m,num1,num2);
			count++;
			
		}
	}
	printf("The number %ld has %d prime number decomposition methods\n",m,count);
}
 int  main()
{
	long number;
	scanf("%ld",&number);
	if(number%2!=0||number<4) printf("The end");
	else  getPrimePair(number);	
	return 0;
}

#include<stdio.h>

//17 2-n^2 \
//验证是否为素数,17;2-16,2-4
//这里的int 意思是,执行我这个方法后,会返回一个整数
int isss(int number){
	int i;
	for(i=2;i*i<=number;i++){
		//取余,被取余为0就代表可以被整除
		if(number%i==0){			
			//如果不是素数的话,就返回一个0
			return 0;
		}	
	}
	//如果是素数的话,就返回1,return就是返回的意思
	return 1;
}

void main()
{
	int i,j,k;
	//输入任意一个偶数,输出它等于两个素数之和
	printf("请输入一个偶数:");
	scanf("%d",&i);
	//素数肯定小于输入的偶数
	for(j=2;j<i;j++)
	{
		//如果不是素数,就跳出本次循环,isss()是上面我们自定的判断是否为素数的方法,j是传过去判断的数
		if(!isss(j))
			continue;
		//第二个素数肯定小于或等于偶数-第一个素数
		for(k=(i-j);k>j;k--){
			//如果不是素数,就跳出本次循环
			if(!isss(k))
				continue;
			//判断两个素数之和是否为我们输入的偶数
			if(j+k==i)
			{
				//找到符合的了,就输出啦
				printf("\n [%d] = [%d] + [%d] ",i,j,k);
			}
		}
	}
}

week7编程作业

1在数组中查找指定元素

在数组中查找指定元素:输入一个正整数n(1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应的下标,否则输出“no found".

直接用数组的地址来查找而不是用指针

#define _CRT_SECURE_NO_WARNINGS //防报错
#include<stdio.h>
#define N 10
 
int Search(int list[], int n, int x)
{
    int i;
    for(i = 0; i < n; i++)
        if(list[i] == x)
            return i;
    return -1;
}
 
int main()
{
    int a[N], i, m, x, n;
    //printf("请输入元素个数:");
    scanf("%d", &n);
   // printf("请输入%d个元素:", n);
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    //printf("请输入要查找的元素:");
    scanf("%d", &x);
    m = Search(a, n, x);
    if(m == -1)
        printf("no found");
    else
        printf("%d", m);
}

指针和数组都用到了

#include<stdio.h>
int search(int a[], int n, int x)
{
    int i,*p;
    p=a;
	for(i=0;i<n;i++)
	{
		if(*(p+i)==x)
		{
			return i;
			break;	
		}
	}
	return -1;
}

int main()
{
    int i,a[10],b,x,n;
    //printf("请输入元素个数:\n");
    scanf("%d", &n);
    for(i=0;i<n;i++)
    {
    	scanf("%d",&a[i]);
	}
	//printf("请输入一个查找的数\n");
	scanf("%d",&x);
	b=search(a,n,x);
	if(b==-1)
	{
		printf("no found");
	}
	else
	{
		printf("%d",b);
	}
	
	}

2指针调换顺序

完美的十分

#include <stdio.h>
int main()
{
    void f(int *p);
    int a[10],i=0;
    //int *d;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    //d=&a[0];
    f(a);
    return 0;
}

void f(int *p)//函数无返回值
{
	int n;
    for(n=0;n<10;n++)
    {    	
		if(n<5)
		{
			printf("%d ",*(p+n+5));
		} 
		else
		{
			
			printf("%d ",*(p+n-5));
		}       
    }   
}

10分

#include <stdio.h>
int main()
{
    void f(int *p);
    int a[10];
    int i=0,*d;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    d=&a[0];
    f(d);
    return 0;
}

void f(int *p)
{
	int n;
    for(n=0;n<10;n++)
    {
    	
		if(n<5)//n<=5时会出现错误
		{
			printf("%d ",*(p+n+5));
		} 
		else
	//	break;
		{
			
			printf("%d ",*(p+n-5));
		}       
    }   
}

选择中n<=5时会出现错误,但不知道为啥有错

3利用指针找最大值

#include <stdio.h>
int main()
{
    void Max(int *p,int n);
    int a[10],i=0,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    Max(a,n);//传参数不要传错了 
    return 0;
}

void Max(int *p,int n)
{
	int num=*(p),i;//num的初始化应该写在循环外面 
    for(i=0;i<n;i++)
    {    	
		//num=*(p);//这个应该写在循环外面 
		if(num<*(p+i))
		{
			num=*(p+i);
		}		      
    } 
	printf("The largest value is %d",num);  
}

4函数利用指针求和差

#include <stdio.h>
#include <stdlib.h>
 
void sum_diff(float op1, float op2, float *psum ,float *pdiff) ;
int main()
{
    float data1 , data2 ,sum , diff,*psum ,*pdiff ;
    psum = &sum;
    pdiff = &diff ;
    scanf("%f%f",&data1,&data2);
    sum_diff(data1,data2 ,psum , pdiff);
    printf("the sum is %.6f\nthe diff is %.6f\n",sum ,diff);
    return 0;
}
void sum_diff(float op1, float op2, float *psum ,float *pdiff)
{
      *psum = op1 + op2 ;
      *pdiff = op1 - op2;
 
}

5指针排序

编写一个名为sortn()的函数,使用指针将n个整数按升序排序。(这个函数不能用数组实现)

标准答案

#include<stdio.h>
int sort(int*p,int n)
{
    int i,j,temp;
	for(i=0;i<n-1;i++)
	for(j=i+1;j<n;j++)
	if(p[i]>p[j])
	{
		temp=p[i];
		p[i]=p[j];
		p[j]=temp;
	}	
}
int main()
{
	int i,n;
	int a[10];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a,n);
		for(i=0;i<n-1;i++)
		{
			printf("%d ",a[i]);
		}
		printf("%d\n",a[i]);
	}
	return 0;
}

#有问题的代码


#include <stdio.h>
#include <stdlib.h>
void sortn(int *p, int n );
int main()
{
    int a[30],n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    	scanf("%d",&a[i]);
	}
	sortn(a, n);
    return 0;
}
void sortn(int *p, int n )
{
      int i, j, temp;
	 for (i = 1; i <= n; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
 	{
		for (j = 0; j <= n - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
		{
			if (*(p+j) > *(p+j + 1))//相邻两个数如果逆序,则交换位置
			{
				temp = *(p+j);
				*(p+j) = *(p+j + 1);
				*(p+j + 1) = temp;
			}
		}
	}
for (i = 0; i < n; i++)
	printf("%d ",*(p+i));
 
}

6指针实现字符串比大小

10分,但是会有警告符号

//输入三个字符串,按由小到大的 顺序输出,用指针来实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 5
int main()
{
    char a[M], b[M], c[M];
    char *p, *q, *t;
    char x[M];
    //printf("请输入三个字符串:\n");
    scanf("%s%s%s",&a,&b,&c);
//	gets(a);
//    gets(b);
//    gets(c);
    p = a; // abc
    q = b; // agf
    t = c; // ccc
    // printf("输出%d\n", strcmp(p, q)); // 输出-1 说明 p比q小
    // printf("strcmp(q,p) 输出%d\n", strcmp(q,p)); // 输出1 说明 q比p 大
    if ((strcmp(p, q)) > 0) // p 比 q 大,交换 pq的值,让小的放前面
    {
        strcpy(x, p); // 将p的值覆盖到x里面,
        strcpy(p, q); // 将q的值覆盖到p
        strcpy(q, x); // 将x的值覆盖到q
    }
    if ((strcmp(p, t)) > 0) // p > t ? 同上,x相当于 temp 辅助交换
    {
        strcpy(x, p);
        strcpy(p, t);
        strcpy(t, x);
    }
    if ((strcmp(q, t)) > 0) // q > t
    {
        strcpy(x, q);
        strcpy(q, t);
        strcpy(t, x);
    }

    printf("%s %s %s\n",p,q,t);
    return 0;
}

自己运行正确,但是系统错误

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>//引入sin x,cos x,e^x的库
//使用指向函数的指针变量来复用一个通用函数
int main()
{
    char str1[10],str2[10],str3[10];
    char *p[3];
    int i;
    printf("请输入三个字符串\n");
    gets(str1);
    gets(str2);
    gets(str3);
    //指针开始指向
    p[0]=str1;
    p[1]=str2;
    p[2]=str3;
   //比较大小,交换地址,同时进行
   swap(p);
   //打印输出
   for (i=0;i<3;i++)
   {
       printf("%s\n",p[i]);
   }
    //使用指针数组存放指针数
}
swap(char *p[])
{
   //
   char *temp;
   int i,j;
   for (i=0;i<3;i++)
   {
       //printf("%s\n",p[i]);
       for (j=i+1;j<3;j++)
       {
           if (strcmp(p[i],p[j])>0)//交换
           {
               temp=p[i];
               p[i]=p[j];
               p[j]=temp;
           }
       }
   }
 
}

week8编程作业

1学生成绩

定义一个保存一个学生数据的结构变量,其中包括学号,姓名,性别,家庭住址及3门课的成绩,从键盘输入这些数据并显示出来。

计算三门课的平均成绩并输出。

#include <stdio.h>

struct student {
    int num;
    char name[20];
    char sex[20];
    int age;
    char addr[20];
    float A,B,C,Ave;
} p[2000];

int main()
{
		scanf("%d %s %s %s %f %f %f",&p[1].num,&p[1].name,&p[1].sex,&p[1].addr,&p[1].A,&p[1].B,&p[1].C);  
		p[1].Ave=(p[1].A+p[1].B+p[1].C)/3;
		printf("%d %s %s %s %.1f %.1f %.1f %.1f\n",p[1].num,p[1].name,p[1].sex,p[1].addr,p[1].A,p[1].B,p[1].C,p[1].Ave);
}


2人员工资

定义一个结构体,它有姓名、基本工资和岗位工资和工资总额4个成员,声明一个该结构的结构体数组,对齐元素按下表初始化(初始化仅包含以下3个成员),计算获得工资总额,然后打印每个人的姓名和工资总额。

name          Basic wage           Job position wage

lihong              945                           1400

liuqiang           920                           1450
#include <stdio.h>
struct worker 
{
    char name[20];
	int BW,JW;
}

sw[2]=  {
            {"lihong",945,1400},
            {"liuqiang",920,1450}
        };

int main()
{
	int i;
	for(i=0;i<=1;i++)
	{
		printf("%s %d\n",sw[i].name,sw[i].BW+sw[i].JW);
	}
	return 0;
}

3输出结构体中工资最低和最高的对应工人

在上题结构体定义的基础上,在主函数main中输入5个人的信息,然后输出应发工资总额、工资数最大者和最小者信息。

#include <stdio.h>
struct worker 
{
    char name[20];
	int BW,JW;
}
sw[5];

int main()
{
	int i,index1,index2;
	for(i=0;i<=4;i++)
	{
		scanf("%s %d %d",&sw[i].name,&sw[i].BW,&sw[i].JW);
	}
	//找出最大值
	index1=0;
	for(i=0;i<=4;i++)
	{
		if(sw[index1].BW+sw[index1].JW<sw[i].BW+sw[i].JW)
		{
			index1=i;
		}
	 }
	 //找出最小值
	index2=0;
	for(i=0;i<=4;i++)
	{
		if(sw[index2].BW+sw[index2].JW>sw[i].BW+sw[i].JW)
		{
			index2=i;
		}
	 }
	printf("The largest total wages are:\n");
	printf("%s %d %d %d\n",sw[index1].name,sw[index1].BW,sw[index1].JW,sw[index1].BW+sw[index1].JW);
	printf("The smallest total wages are:\n");
	printf("%s %d %d %d\n",sw[index2].name,sw[index2].BW,sw[index2].JW,sw[index2].BW+sw[index2].JW);
	return 0;
}

Warning message

___2.c: In function 'main':
___2.c:14:3: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Wformat=]
scanf("%s %d %d",&sw[i].name,&sw[i].BW,&sw[i].JW);

4比较日期前后顺序

10分

#include<stdio.h>
struct date
{
	int day;
	int month;
	int year;
};

int isEarlier(struct date date1,struct date date2)
{
	if((date1.year<date2.year)
		||(date1.year==date2.year&&date1.month<date2.month)
		||(date1.year==date2.year&&date1.month==date2.month&&date1.day<date2.day))
		return 1;
	else return 0;
}

void sort(struct date testDate[], int n)
{
	struct date t;
	int i,j;
	for(i=0;i<n-1;i++)
		for(j=0;j<n-i-1;j++)
			if((testDate[j].year>testDate[j+1].year)
				||(testDate[j].year==testDate[j+1].year&&testDate[j].month>testDate[j+1].month)
				||(testDate[j].year==testDate[j+1].year&&testDate[j].month==testDate[j+1].month&&testDate[j].day>testDate[j+1].day))
			{
				t=testDate[j];testDate[j]=testDate[j+1];testDate[j+1]=t;//结构体可以一整个赋值?
				}
}

int main()
{
	struct date a[10];
	struct date currentDate;
	int n,i,j=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d/%d/%d",&a[i].year,&a[i].month,&a[i].day);
	}
	sort(a,n);
	printf("The sorted dates are as follows:\n");
	for(i=0;i<n;i++)
	{
		printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
	}
	printf("Please enter current date:\n");
	scanf("%d/%d/%d",&currentDate.year,&currentDate.month,&currentDate.day);
	for(i=0;i<n;i++)
	{
		if(isEarlier(a[i],currentDate))
			j++;
	}
	if(j==0)
		printf("All dates are after the current date. No need to split the date array\n");
	else if(j==n)
		printf("All dates are before the current date. No need to split the date array\n");
	else
	{
		printf("The date array will be split into two arraies:\n");
		printf("The dates before the currentDate is:\n");
		for(i=0;i<n;i++)
		{
			if(isEarlier(a[i],currentDate))
				printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
		}
	
		printf("The dates after the currentDate is:\n");
		for(i=0;i<n;i++)
		{
			if(!isEarlier(a[i],currentDate))
				printf("%d/%d/%d\n",a[i].year,a[i].month,a[i].day);
		}
	}
}
#include <stdio.h>
typedef struct date
{
    char name[32];
    int year, month, day;
} DATE;
int main()
{
    int n, i, j;
    scanf("%d", &n);
    DATE d[n], max, t;
    max = d[0];
    for (i = 0; i < n; i++)
    {
        scanf("%s %d %d %d", d[i].name, &d[i].year, &d[i].month, &d[i].day);
        /* code */
    }

    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (d[i].month == d[j].month)
            {
                if (d[j].day < d[i].day)
                {
                    t = d[i];
                    d[i] = d[j];
                    d[j] = t;
                }
                /* code */
            }
            else if (d[j].month < d[j].month)
            {
                t = d[i];
                d[i] = d[j];
                d[j] = t;
                /* code */
            }
            /* code */
        }
        /* code */
    }
    for (i = 0; i < n; i++)
    {
        printf("%s %d %d %d\n", d[i].name, d[i].year, d[i].month, d[i].day);
        /* code */
    }
}

week9编程作业

1编写程序存整数

编写一个程序,从键盘输入10个整数,并写入idata.txt文件中。

10分

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a[10];
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    //写入文件 
 	fp=fopen("idata.txt","w+");
 	 for (i=0; i<10; i++)
  	{
  	 fprintf(fp,"%d ",a[i]);
 	}
    return 0;
}

运行能成但是系统不通过

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int a[10];
   // printf("输入10个实型数据:(eg:1.1 2.3)\n");
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    //写入文件 
 	FILE *fpWrite=fopen("idata.txt","w");
 	if(fpWrite==NULL)
 {
 	 return 0;
 }

 	 for (i=0; i<10; i++)
  	{
  	 fprintf(fpWrite,"%d ",a[i]);
 	}
  fputc('\n',fpWrite);
 fclose(fpWrite);

    fclose(fp);
    return 0;
}

2统计文件字符个数

编写程序,用变量count统计文件love.txt中的字符个数.以下文件为示例。注:统计的字符中不包含空格和结束字符EOF

10分

#include <stdio.h>

int main()
{
    FILE *fp;
    char ch;
    long count = 0;
    long space=0;
    if ((fp = fopen("love.txt", "r")) == NULL) 
    {
        printf(" cannot open file\n");
        // exit(0);
    }
    while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
    {
    	count++;
       if(ch == 32)//空格的ASCII码
       {
           space++;
       } 
    }
    
    printf("The total number of charaecters is:%ld\n", count-space);
    fclose(fp);
    return 0;
}

附带的一个例题

统计一个文件的字符个数
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fpr;
    char name[100] = {0};//存储路径名
    int ch;
    int number = 0;
    int character = 0;
    int space = 0;
    int total = 0;

    scanf("%s",name);

    if((fpr = fopen(name,"r")) == NULL)
    {
        printf("Can't open %s\n",name);
        exit(1);
    }
    while((ch = fgetc(fpr)) != EOF)
    {
       if(ch>=48 &&ch<=57)//数字的ASCII码
       {
            number++;
       }
       if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
       {
           character++;
       }
       if(ch == 32)//空格的ASCII码
       {
           space++;
       }
       total++;
    }
    printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
    return 0;
}

3输入保存键盘输入

输入若干个字符,直到输入’#'结束,将输入的字符以文本方式保存在磁盘中,然后统计文件中字符的个数,并在屏幕上显示这些字符。

10分

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
	printf("20\n");
	/*char a[100],b[100];
	int i,len;
	FILE*fp;
	for(i=0;i<100;i++){
		scanf("%c",&a[i]);
		if(a[i]=='#'){
			a[i]='\0';
			break;}
	}
	if((fp=fopen("E:\\text.txt","wt+"))==NULL)
	{
		printf("fail to open file\n");
		exit(0);
	}
	len=strlen(a);
	//fwrite(a,sizeof(a),1,fp);
	//在文件中写入比字符串长度大的数据块会占用内存,该部分内存未初始化
	//未初始化的栈空间用0xCC填充,而未初始化的堆空间用0xCD填充
	//而0xCCCC和0xCDCD在中文GB2312编码中分别对应“烫”字和“屯”字
	//所以打开文本文件会看见烫烫烫
	//显示屏输出时是看不见是因为printf遇休止符就停止输出
	//节省内存应该用多少写入多少
	fwrite(a,len+1,1,fp);
	rewind(fp);
	fread(b,len+1,1,fp);
	printf("%d\n",len);
	printf("%s\n",b);
	fclose(fp);*/
	return 0;
}

运行成功,但是显示运行时间过长

#include<stdio.h>
#include<stdlib.h>
void writefile(int ch, FILE *fp);
void readfile(int ch, FILE *fp);

int main()
{
	FILE *fp; //首先定义文件指针
	char ch = 0;
	fp = fopen("D:\\f1.txt", "w+");//打开文件,w+表示既可以读取也可以写入
	if (fp == 0)                       //文件打开后需判断是否正确
	{
		printf("file error\n");
		exit(1);
	}
	writefile(ch, fp);//写
	rewind(fp);//rewind函数,把指针移到文件头
	readfile(ch, fp);//读
	fclose(fp);//关闭
	return 0;
}
void writefile(int ch, FILE *fp)        //使用函数将键盘键入的字符写入文件,直到遇到字符#为止
{
	printf("Enter a text (end with '#'):\n");
	ch = getchar();
	while (ch != '#')
	{
		fputc(ch, fp);
		ch = getchar();
	}
}
void readfile(int ch, FILE *fp)         //使用文件读取函数fgetc从该文件中读取字符,并显示出来
{
	while ((ch = fgetc(fp)) != EOF)
	{
		putchar(ch);
	}
	putchar('\n');
}

成功运行,但显示有死循环

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* fp;
	char ch, filename[20];
	printf("请输入文件名:\n");
	gets(filename);
	if((fp=fopen(filename, "w"))==NULL)
	{
		printf("error");
		return 1;
	}
	printf("请输入字符:\n");
	while((ch=getchar())!='#')
	{	
		fputc(ch,fp);
		putchar(ch);
 
	}
	printf("\n");
	fclose(fp);
	return 0;
}

4文件转换

写一个程序,将一个文件复制到另一个文件,用大写字母替换所有小写字母。即将读取Desktop1,用大写字母替换所有小写字母,并写到Desktop2中。题目中给了desktop1和Desktop2

//将fp1所指向的文件的内容复制到fp2所指向的文件里面
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp1,*fp2 ;
    char c;
    if ((fp1=fopen("Desktop1.txt", "r"))==NULL)//字符串中两个\\相当于一个
    {
        printf("cannot open\n");
        exit(0);//当文件打开失败时,立即退出。原因:后面的代码对文件进行操作会出现错误。
    }
    if ((fp2=fopen("Desktop2.txt", "w"))==NULL)
    {
        printf("cannot open\n");
        exit(0);
    }

    while ((c = fgetc(fp1)) != EOF)//当读取的字符不是文件的结束符
    {
    	if ((c >= 'a') && (c <= 'z'))//寻找小写字母
		{
			c = c - 32;//根据ASCALL码将小写字母转化为大写字母
		}

        fputc(c,fp2);
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

C语言难点知识集合

1计算元音与辅音个数

10分

#include <stdio.h>
int main(void)
{ 
    char s[1000];
   // printf("请输入一段字符:\n");
	gets(s);
    int a=0,b=0,i;
    for(i=0;s[i]!='\0';i++)
	{
        if(s[i]>='a'&&s[i]<='z')
		{
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
			a++;//元音个数 
            else b++;//辅音个数 
        }
        else if(s[i]>='A'&&s[i]<='Z')
		{
            if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
            else b++;
        }
    }
    printf("%d\n",a);//元音个数 
    printf("%d\n",b);//辅音个数 

    return 0;
}

附加C语言,计算辅音元音个数空格数字

#include <stdio.h>
int main(void)
{ 
    char s[1000];
   // printf("请输入一段字符:\n");
	gets(s);
    int a=0,b=0,c=0,d=0,i;
    for(i=0;s[i]!='\0';i++)
	{
        if(s[i]>='a'&&s[i]<='z')
		{
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
			a++;//元音个数 
            else b++;//辅音个数 
        }
        else if(s[i]>='A'&&s[i]<='Z')
		{
            if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
            else b++;
        }
        else if(s[i]>='0'&&s[i]<='9')
		{
            c++;
        }
        else if(s[i]==' ')
		{
            d++;
        }
    }
    printf("vowel:%d\n",a);
    printf("consonant:%d\n",b);
    printf("number:%d\n",c);
    printf("space:%d",d);
    return 0;
}

2找出数组中所有不重复的所有数字

本地编译器没错,但是系统有误6.67分

#include<stdio.h>
int main(void)
 {
 	int arr[32],n,i,j,flag,m;
 	scanf("%d",&n);
 	for(i=0;i<n;i++)
 	{
 		scanf("%d",&arr[i]);
	}
	
 	for(i=0;i<n;i++)
 	{
 		flag=0;
 		for(j=0;j<n;j++)
 	   {
 	   		if(i==j) 
				{
					continue;
				}
 	   		if(arr[i]==arr[j])
 	   		{
 	   			flag=1;
 	   			break;
			}
 	   }
     //找出不重复的数字,并且输出   
 	   if(!flag)
 	   {
 	   		m++;
 	   		printf("%d ",arr[i]);
		}
	}
    //都是重复的数字,则输入false
	if(m==0)
	{
		printf("false");
	}
	printf("\n");
 }

3字符串中的第一个唯一字符

【问题描述】

已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】

第一个数为输入数字的个数,其后为数组的数字
【输出形式】

输出相应的数组
【样例输入】

5 1 2 3 4 0

【样例输出】

0 1 2 3 4

10分

#include<stdio.h>
#include<string.h>
int main()
{
	int d=0;
	char str[20];
	//char *p = str;
	gets(str);
	d=firstUniqChar(str) ;
	printf("%d",d);
} 
int firstUniqChar(char * s)
{
    int len = strlen(s);
    int i = 0;
    if(len == 0)
      return -1;
              
    int table[26] = {0};
    for( i = 0; i < len;i++)
        table[s[i] - 'a']++;
    
    for(i = 0; i < len;i++)
	{
        if(table[s[i] - 'a'] == 1)
            return i;
    }
    
    return -1;  
}

4.将0元素前移

已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】第一个数为输入数字的个数,其后为数组的数字
【输出形式】输出相应的数组
【样例输入】5 1 2 3 4 0
【样例输出】0 1 2 3 4
void moveZeroes(int* nums, int numsSize)
{
   int n = 0;
   for(int i =0;i<numsSize;i++)
   {
       if(nums[i]==0)
        {
            n = n +1;
        }
        else
        {
            nums[i-n]=nums[i];      
        }
   }
   
   for(int i = 1;i<=n;i++)
   {
       nums[numsSize-i] =0; 
   }
   return nums;
}

附加例题,将所有0的数后移(测试正确,使用双指针)
#include<stdio.h>
void swap(int* a, int* b) 
{
	int t = *a;
	*a = *b, * b = t;
}

void moveZeroes(int* nums, int numsSize) 
{
	int left = 0, right = 0;
	while (right < numsSize) 
	{
		if (nums[right]) 
		{
			swap(nums + left, nums + right);
			left++;
		}
		right++;
	}
}
int main() 
{
	int nums[] = { 0,1,0,3,12 };
	int numsSize = 5;
	int temp,j;
	for (j = 0; j < numsSize; j++) printf("%d ", nums[j]);
	printf("\n");
	moveZeroes(nums, numsSize);
	for (j = 0; j < numsSize; j++)printf("%d ", nums[j]);
	return 0;
}

#include<stdio.h>
void swap(int* a, int* b) 
{
	int t = *a;
	*a = *b, * b = t;
}

void moveZeroes(int* nums, int numsSize) {
	int left = 0, right = 0;
	while (right < numsSize) {
		if (nums[right]) {
			swap(nums + left, nums + right);
			left++;
		}
		right++;
	}
}
int main() {
	int nums[] = { 0 };
	int numsSize ;
	int temp,j,i;
	scanf("%d",&numsSize);
	for( i = 0;i < numsSize; i++) scanf("%d",&nums[i]);
	for ( j = 0; j < numsSize; j++) printf("%d ", nums[j]);
	moveZeroes(nums, numsSize);
	for (j = 0; j < numsSize; j++)printf("%d ", nums[j]);
	return 0;
}

C语言期中

1成绩计算及等级转换

小王同学参加了某计算机类课程的考试。考试分为笔试和上机编程测试,满分均为 100 分。
总成绩由笔试成绩 (60%)和上机成绩(40%)组成。如果总成绩在 85-100 分之间,则成绩等级为“优秀”;总成绩在 70-85 分之间, 则成绩等级为“良好”;总成绩在 60-70,则为“及格”;总成绩在 60 分以下则为“不及格”。 
编写程序,在键盘上输入小王同学的笔试和上机成绩分数(记为整数),然后计算小王的总成绩(记为整数,不考 虑四舍五入)以及分数等级(不及格(fail)、及格(pass)、良好(good)和优秀(excellent));如果笔试或上机分数输入 为负数或超过 100 分,则提示输入错误(wrong score)。
#include <stdio.h>
int main()
{
    int a,b;
    int f=0; 
    scanf("%d%d",&a,&b);
    printf("Writing score: %d\n",a);
    printf("Testing score: %d\n",b);
    f=a*0.6+b*0.4;
    if(a>100||a<0||b>100||b<0)
    {
    	printf("Wrong input");
	}
	else
	{
		if(f > 85&&f <= 100)
  { 
       printf("Final score is %d, the grade is exellent",f); 
  }
    else if(f >70&&f <= 85)
  {     
        printf("Final score is %d, the grade is good",f);
  }
    else if(f >60&&f <= 70)
  {     
        printf("Final score is %d, the grade is pass",f);
  }
  else
  //else if(f >0&&f <= 60)
  {     
        printf("Final score is %d, the grade is fail",f);
  }
	}

  return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5ls04RJ-1654157258514)(E:\Second_Degree\C\图片\image-20220421114631571.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vMoW58l-1654157258515)(E:\Second_Degree\C\图片\image-20220421115913060.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcz8DbpL-1654157258515)(E:\Second_Degree\C\图片\image-20220421115955330.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAq01uu0-1654157258515)(E:\Second_Degree\C\图片\image-20220421120026579.png)]

2计算满足不等式的最大数值

1. 从键盘输入一个整数 m,如果 m 小于 1,输出:输入错误! 
2. 如果 m 大于等于 1,则计算满足如下不等式的最大整数 n: 1 2 + 2 2 + 3 2 + ⋯ + 𝑛 2 ≤ m 
注意:不能调用除 stdio.h 之外的函数包。 
Write a program to input an integer m, if m<1, output “Wrong input!” If m≥1, find the maximum integer n satisfying the following inequality: 1 ^2 + 2^ 2 + 3^ 2 + ⋯ + 𝑛^ 2 ≤ m
#include <stdio.h>
int main()
{
    int m,n,j,i=1;
    int sum=0;
	scanf("%d",&m) ;
	if(m<1)
	{
		printf("Wrong input!");
	}
	else
	{
		do
		{
			i++;
			n=j++;
			sum+=i*i;
		}
		while(sum<=m);
		printf("The maximum integer satisfing the inequality is %d",n+1);
	}
    
  return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kncV1RHi-1654157258516)(E:\Second_Degree\C\图片\image-20220421104812864.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B7RDUUi8-1654157258516)(E:\Second_Degree\C\图片\image-20220421104847350.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8nguaw3j-1654157258522)(E:\Second_Degree\C\图片\image-20220421104909755.png)]

3查找数组元素出现的次数

给定数组 a[10]= {1, 5, 3, 1, 2, 3, 7, 6, 3, 9}。编写程序,从键盘输入 0~9 之间的任意一个数字,查找该数字在数组中 出现的次数、要求用指针方式实现对数组的操作(注:如果未用指针方式,最多得一半分数)。
#include <stdio.h> 
int find( int *p, int num);

int main()
{
	int a[10]= {1, 5, 3, 1, 2, 3, 7, 6, 3, 9};
	int num;
	printf("please input any number from 0 to 9:\n");
	scanf("%d",&num);
	find(a, num);
}

int find( int *p, int num)
{	
	int n = 0,i = 0;
	while(*p)
	{
		if(*p ==num)
		++n;
		++p;
	}
	if(num>=10)
	{
			printf("wrong input!");
	}
	else
	printf("%d appears %d times",num,n);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS07O93Y-1654157258523)(E:\Second_Degree\C\图片\image-20220421110926139.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXvKI4Sj-1654157258523)(E:\Second_Degree\C\图片\image-20220421111000443.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eh394ntz-1654157258523)(E:\Second_Degree\C\图片\image-20220421111456108.png)]

4求矩阵各行元素之和

编写程序,从键盘输入 2 个正整数 m 和 n (1<=m<=4, 1<=n<=4),然后输入矩阵 a(m 行 n 列)中的元素,将 矩阵的元素按 m 行 n 列方式写入到文件 matrix.txt 中,并分别求出各行元素之和,输出到屏幕上。
#include<stdio.h>
#include <stdlib.h>
int main ()
{
 int m,n,i,j,sum=0;
 scanf("%d %d",&m,&n);
 int a[4][4];

 for(i=0; i<m; i++)
 {
  for (j=0; j<n; j++)
  {
   scanf ("%d",&a[i][j]);
  }
 }
 //写入文件 
 	FILE *fpWrite=fopen("matrix.txt","w");
 	if(fpWrite==NULL)
 {
 	 return 0;
 }
 	for(i=0; i<m; i++)
 {
 	 for (j=0; j<n; j++)
  	{
  	 fprintf(fpWrite,"%d ",a[i][j]);
 	}
  fputc('\n',fpWrite);
 }
 fclose(fpWrite);
 
 //计算数组之和 
 for(i=0; i<m; i++)
 {
  for (j=0; j<n; j++)
 	{
  		 sum+=a[i][j];
  	}
  printf("sum of row %d is %d\n",i,sum);
  sum=0;
 }
 
 return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VONFlfJA-1654157258524)(E:\Second_Degree\C\图片\image-20220421112202220.png)]

5求最大和最小温差值

北京 2019 年 1~12 月的最高和最低气温如下 最高(℃) h={10,14,25,28,37,35,38,32,34,30,17,10} 最低(℃) l={-10,-8,-2,3,10,18,19,18,14,1,-6,-10} 编写程序,实现以下功能: 

(1)从键盘输入最高和最低温度,分别存入两个一维数组中; 

(2 分别求出 1~12 月中每个月的温差 h_l=|h-l|,存入一个一维数组中,并在屏幕上显示 

(3)求出温差最大和最小的月份(假设最大值和最小值均是唯一的) 并在屏幕上显示最大和最小温差,以及相 应的月份
#include <stdio.h>
int main()
{
    int h[12], l[12], h_l[12];
    int i;

    for (i = 0; i < 12; i++)
        scanf("%d", &h[i]);
    for (i = 0; i < 12; i++)
        scanf("%d", &l[i]);

    for (i = 0; i < 12; i++) 
	{
        int tmp = h[i] - l[i];
        if (tmp < 0)
        {
        	tmp = -tmp;
		}
        h_l[i] = tmp;
    }

    int min = 0;
    for (i = 0; i < 12; i++)
    {
    	if (h_l[i] < h_l[min])
        {
        	    min = i;
		}
	}
        

    int max = 0;
    for (i = 0; i < 12; i++)
    {
    	 if (h_l[i] > h_l[max])
            max = i;
	}      

    printf("high  low   diff\n");
    for (i = 0; i < 12; i++) 
	{
        printf("%-3d   %-3d   %-3d\n", h[i], l[i], h_l[i]);
    }

    printf("Max.diff:%d, Month:%d\n", h_l[max], max + 1);
    printf("Min.diff:%d, Month:%d", h_l[min], min + 1);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKZr9zYV-1654157258524)(E:\Second_Degree\C\图片\image-20220421121413655.png)]

6判断 Armstrong 数

从键盘输入一个 4 位的 10 进制非负整数,判定其是否为乘方和完全数(Armstrong)
主函数已从键盘读入一个整数,调用函数 checkingAmstrong 判定输入的整数是否为 Amstrong 数,然后输出结果。
编写函数 checking Armstrong,判定该整数是否为 Armstrong 数,若是,则返回 1,否则返回 0。
乘方和完全数的特征是:该数的位数作为乘方的幂次,每位数字的乘方之和等于该数。
a^4+b^4+c^4+d^4=abcd
#include <stdio.h>
#include <math.h>
/****************************************
num: a 4-digit integer number
dn: total number of digits
return value: if num is an Armstrong number, return 1, otherwise return 0
****************************************/
int checkingArmstrong(int num, int dn)
{
	 int a, b, c, d, number = num;
	 a = num / 1000;
	 num %= 1000;
	 b = num / 100;
	 num %= 100;
	 c = num / 10;
	 num %= 10;
	 d = num;
	 if (a*a*a*a + b*b*b*b + c*c*c*c + d*d*d*d == number)
	 return 1;
	 return 0;
}
int main() 
{
	 int num, result=0;
	 scanf("%d",&num);
	 if (checkingArmstrong(num, 4) == 1) 
	 printf("%d is an Armstrong number.", num);
	 else 
	 printf("%d is not an Armstrong number.", num);
	 return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldShiFkD-1654157258524)(E:\Second_Degree\C\图片\image-20220421115522742.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3xEFRLd-1654157258524)(E:\Second_Degree\C\图片\image-20220421115609874.png)]

C语言重点习题

week 1 C语言重点

1. 计算元音与辅音个数

【问题描述】Write a program to count the number of vowels and consonants in a string using a pointer.
【输入形式】
    输入为一个字符串
【输出形式】
    输出两行,第一行元音个数,第二行辅音个数
【样例输入1】
    string
【样例输出1】
    1
    5
【样例输入2】
    I love programming

代码块

#include <stdio.h>
int main(void)
{ 
    char s[1000];
   // printf("请输入一段字符:\n");
	gets(s);
    int a=0,b=0,i;
    for(i=0;s[i]!='\0';i++)
	{
        if(s[i]>='a'&&s[i]<='z')
		{
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
			a++;//元音个数 
            else b++;//辅音个数 
        }
        else if(s[i]>='A'&&s[i]<='Z')
		{
            if(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U')a++;
            else b++;
        }
    }
    printf("%d\n",a);//元音个数 
    printf("%d\n",b);//辅音个数 
    return 0;
}

2. 找出数组中所有不重复的所有数字

【问题描述】
    找出数组中所有不重复的所有数字,如果没有,则输出false
【输入形式】
    第一行为数组元素个数,第二行为数组元素(以空格分隔)
【输出形式】
    输出的数组元素
【样例输入14
    1 2 2 3
【样例输出11 3
【样例输入24
    1 2 4 3
【样例输出21 2 4 3
【样例输入32
    1 1
#include<stdio.h>
 int main(void)
 {
  int arr[32],n,i,j,flag,m=0;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
   scanf("%d",&arr[i]);
 }
 
  for(i=0;i<n;i++)
  {
   flag=0;
   for(j=0;j<n;j++)
     {
       if(i==j) 
    {
     continue;
    }
       if(arr[i]==arr[j])
       {
        flag=1;
        break;
   }
     }
     if(!flag)
     {
       m++;
       printf("%d ",arr[i]);
  }
 }
 if(m==0)
 {
  printf("false");
 }
 printf("\n");
 }

3. 字符串中的第一个唯一字符

【问题描述】    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
    约束条件:
    (1) 0<=S.length<=300000
    (2) 字符串中只包含小写字母
【输入形式】    输入一个字符串
【输出形式】    输出索引对应数字
【样例输入1】    leetcode
【样例输出10
#include<stdio.h>
#include<string.h>
int main()
{
	int d=0;
	char str[20];
	//char *p = str;
	gets(str);
	d=firstUniqChar(str) ;
	printf("%d",d);
} 
int firstUniqChar(char * s)
{
    int len = strlen(s);
    int i = 0;
    //特殊字符串处理 
    if(len == 0)
      return -1;
              
    int table[20] = {0};
    for( i = 0; i < len;i++)
        table[s[i] - 'a']++;
    
    for(i = 0; i < len;i++)
	{
        if(table[s[i] - 'a'] == 1)
            return i;
    }
    return -1;  
}


4. 将0元素前移

【问题描述】已知具有n个数组元素的一维数组A,请写一个算法,将该数组中所有值为0的元素都依次移到数组的前端,其他元素依次输出。
【输入形式】第一个数为输入数字的个数,其后为数组的数字
【输出形式】输出相应的数组
【样例输入】5 1 2 3 4 0
【样例输出】0 1 2 3 4
#include<stdio.h>
int main(){
	int a[100],b[100],n,i,j=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	} 
	for(i=0;i<n;i++){
		if(a[i]==0){
			b[j++]=0;
		}
	}
	for(i=0;i<n;i++){
		if(a[i]!=0){
			b[j++]=a[i];
		}
	}
	for(i=0;i<n;i++){
		printf("%d ",b[i]);
	}
} 

5. 课程信息系统

【问题描述】
    有N个学生,学生的信息包括姓名,学号,性别,三门课的成绩,要求从键盘输入n个学生的信息,设计程序,
    (1)     计算每个学生的三门课的总成绩,
    (2)     计算学生每门课的最高分和最低分
    (3)     计算学生总成绩的最高分和最低分
    (4)     按总成绩从高到低进行排序
    约束条件:
    1<N<50
    学生成绩在0100分之间
【输入形式】
    学生人数 N
    姓名 学号 性别 A成绩 B成绩 C成绩
    ……
【输出形式】
    学生1总成绩 学生2总成绩 ……
    学生1最高分 学生1最低分 学生2最高分 学生2最低分 ……
    总成绩最高分 总成绩最低分
    学生1 学生2 ……
【样例输入】
    2
    Alice 101 female 90 92 91
    Bob 102 male 95 92 91
【样例输出】   
    273 278
    92 90 95 91
    278 273
    Bob Alice
#include <stdio.h>
#include<stdlib.h>
typedef struct Student
{
 char num[10];
 char name[20];
 char gen[10];
 int score[3];
 int sum;
}STU;


 int main()
{
 int n;
 STU stu[50];
 int i,j,max=0,min=300;
 int sum[3]={0,0,0},m[50][2];
 scanf("%d\n",&n);
for(i=0;i<n;i++)
{
 scanf("%s %s %s %d %d %d",stu[i].name,stu[i].num,stu[i].gen,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

}
for(i=0;i<n;i++)
{
 stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
 printf("%d ",stu[i].sum);
}
printf("\n");
for(i=0;i<n;i++){
 m[i][0]=100;
 m[i][1]=0;
 for(j=0;j<3;j++){
  if(m[i][0]>stu[i].score[j]){
   m[i][0]=stu[i].score[j];
  }
  if(m[i][1]<stu[i].score[j]){
   m[i][1]=stu[i].score[j];
  }
 }
 printf("%d %d ",m[i][1],m[i][0]);
 
 
} 
printf("\n");
for(i=0;i<n;i++){
 if(max<stu[i].sum){
  max=stu[i].sum;
 }
 if(min>stu[i].sum){
  min=stu[i].sum;
 }
}
printf("%d %d\n",max,min);
int gao=0,flag;
for(j=0;j<n;j++){
 for(i=0;i<n;i++){
  if(gao<stu[i].sum){
   gao=stu[i].sum;
   flag=i;
  }
 }
 printf("%s ",stu[flag].name); 
 stu[flag].sum=0;
 gao=0;
}

return 0;
}

6. 山形数组

【问题描述】    判断一个数组是否为山形数组
山形数组:0 2 3 4 5 2 3
非山形数组:0 2 3 3 4  4 5 2
【输入形式】    第一行为数组长度    第二行为数组元素,以空格分隔
【输出形式】    true 或者 false
【样例输入1】    5
    1 2 3 2 1
【样例输出1】
    true
【样例输入2】
    5
    1 2 3 3 1
【样例输出2】
    false
#include<stdio.h>
int  fun(int arr[],int n)
{
    if(n<3) return 0;
    int i=0;
    while(i<n-1&&arr[i]<arr[i+1])i++;
    if(i==n-1||i==0) return 0;
    while(i<n-1&&arr[i]>arr[i+1])i++;
    return i==n-1;
}
int main()
{
 int n,i;
 scanf("%d",&n);
 int arr[n];
 for(i=0;i<n;i++)
 {
  scanf("%d",&arr[i]);
 }
 int a=fun(arr,n);
 if(a) printf("true\n");
 else printf("false\n");
}

7. 自定义字典序

【问题描述】
    某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。
【输入形式】    words的数目n
             n 个 words
    字母表顺序order
【输出形式】
    true 或者 false
【样例输入12
    hello
    leetcode
    hlabcdefgijkmnopqrstuvwxyz
【样例输出1】
    true
【样例说明1】
在该语言的字母表中,'h' 位于 'l' 之前,所以单词序列是按字典序排列的。
【样例输入23
    word
    world
    row
    worldabcefghijkmnpqstuvxyz
【样例输出2】
    false
【样例说明2】
    在该语言的字母表中,'d' 位于 'l' 之后,那么 words[0] > words[1],因此单词序列不是按字典序排列的。
【样例输入32
    apple
    app
    abcdefghijklmnopqrstuvwxyz
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dic[26];
int check(char words[],char words2[])
{
	int len1=strlen(words),len2=strlen(words2);
	int i,j;
	int t1,t2;
	for(i=0,j=0;i<len1&&j<len2;i++,j++)
	{
		t1=words[i]-'a';
		t2=words2[j]-'a';
		if(t1!=t2)
		{
			return dic[t1]-dic[t2];
		}
	}
	if(i<len1) return 1;
	if(j<len2)return -1;
	return 0;
}
int sort(char **words,int n,char order[])
{
	int i;
	for(i=0;i<26;i++)
	{
		dic[order[i]-'a']=i;
	}
	for(i=1;i<n;i++)
	{
		if(check(words[i-1],words[i])>0)
		return 0;
	}
	return 1;
}
int main()
{
	char **words=NULL;
	char order[26];
	int n,i;
	scanf("%d",&n);
	words=(char**)malloc(sizeof(char*)*n);
	for(i=0;i<n;i++)
	{
		*(words+i)=(char*)malloc(sizeof(char)*26);
		scanf("%s",words[i]);
	}
	scanf("%s",order);
	if(sort(words,n,order)) printf("true\n");
	else printf("false");
}


C语言期末复习

字母大小写转换

#include <stdio.h>
int main(void)
{
	 //ASCII码表中:
	// A-Z: 65-90
	 //a-z: 97-122
 
	char cLetter;
	char cDifference = 'a' - 'A';     // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
 
	printf("请输入要转换的字母: ");
	scanf(" %c", &cLetter);
 
	if (cLetter - 'Z' <= 0)            // 如果不是大写字母,则进行转换成小写字母
            cLetter += cDifference;	
	else                              // 如果是小写,则进行转换成大写字母
            cLetter -= cDifference;
 
	printf("%c", cLetter);
	printf("\n");
 
	return 0;
}
#include"stdio.h"
	int main()
	{
		float a,b,c;
		scanf("%f,%f,%f",&a,&b,&c);//输入以逗号分隔开
		printf("%.2f\n",(a+b+c)/3);//%f是小数点后6位精度
	}

删除字符串中的数字(P140)

#include"stdio.h"
int main()
{
	int i,n=0;
	char s[]="f65dhbs8bf*";
	for(i=0;s[i];i++)
	{
		if(s[i]<'0'||s[i]>'9')
		s[n++]=s[i];
	}
	s[n]='\0';//必须要加这个,不然就是 fdhbsbf*bf*
	for(i=0;s[i];i++)
	{
		printf("%c",s[i]); 
	}
}

数组赋值

char a[]="abcd",*p=a;
printf("%d",*(p+4));
//自动补0,编译成功

char str2[]={'I','a','m','','f','i','n','e'}
printf("%d",*(p+4));
//不会自动补0,数组越界,编译失败

字符串数组赋值

1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");

不允许
 1char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
#include <stdio.h> /* 函数声明 */ 
 
void func1(void); 
static int count=10; /* 全局变量 - static 是默认的 */ 
int main()
 {
 while (count--) 
{ 
func1(); 
} return 0; 
} 
void func1(void) 
{ /* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 * 每次调用函数 'func1' 'thingy' 值不会被重置。 */
 static int thingy=5; 
thingy++;
 printf(" thingy 为 %d , count 为 %d\n", thingy, count); 
}

取于符号

int main()
	{
		float c,a=4.5;
		c=(a/2.0);//c=0.500000
		printf("%.1f",c);
	}
a是float型,a=1,a/2

文件统计字符

#include <stdio.h>

int main()
{
    FILE *fp;
    char ch;
    long count = 0;
    long space=0;
    if ((fp = fopen("love.txt", "r")) == NULL) 
    {
        printf(" cannot open file\n");
        // exit(0);
    }
    while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
    {
    	count++;
       if(ch == 32)//空格的ASCII码
       {
           space++;
       } 
    }
    
    printf("The total number of charaecters is:%ld\n", count-space);
    fclose(fp);
    return 0;
}
//

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fpr;
    char name[100] = {0};//存储路径名
    int ch;
    int number = 0;
    int character = 0;
    int space = 0;
    int total = 0;

    scanf("%s",name);

    if((fpr = fopen(name,"r")) == NULL)
    {
        printf("Can't open %s\n",name);
        exit(1);
    }
    while((ch = fgetc(fpr)) != EOF)
    {
       if(ch>=48 &&ch<=57)//数字的ASCII码
       {
            number++;
       }
       if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
       {
           character++;
       }
       if(ch == 32)//空格的ASCII码
       {
           space++;
       }
       total++;
    }
    printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
    return 0;
}

字符数组的输入

#include<stdio.h>
int main()
{
    char s[10];
    scanf("%s",s);
    printf("%s",s);
    return 0;
}


字符串的统计

#include <stdio.h>


int main()
{
    char a; 
    int i = 0;
    int number = 0; //数字个数
    int space = 0;  //空格个数
    int letters = 0; //字母个数
    int other = 0;  //其他个数


   while((a=getchar())&&a!='\n')
    {
        if(a >= '0' && a <= '9')
        {
            number++;
        }else if(a == ' ')
        {
            space ++;
        }else if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
        {
            letters ++;
        }else
        {
            other++;
        }
    }

    printf("英文字母个数为:%d\n", letters );
    printf("数字个数为:%d\n", number);
    printf("空格个数为:%d\n", space );
    printf("其他个数为:%d\n", other);
    return 0;
}

check(char words[],char words2[])
{
int len1=strlen(words),len2=strlen(words2);
int i,j;
int t1,t2;
for(i=0,j=0;i<len1&&j<len2;i++,j++)
{
t1=words[i]-‘a’;
t2=words2[j]-‘a’;
if(t1!=t2)
{
return dic[t1]-dic[t2];
}
}
if(i<len1) return 1;
if(j<len2)return -1;
return 0;
}
int sort(char *words,int n,char order[])
{
int i;
for(i=0;i<26;i++)
{
dic[order[i]-‘a’]=i;
}
for(i=1;i<n;i++)
{
if(check(words[i-1],words[i])>0)
return 0;
}
return 1;
}
int main()
{
char words=NULL;
char order[26];
int n,i;
scanf(“%d”,&n);
words=(char
)malloc(sizeof(char
)*n);
for(i=0;i<n;i++)
{
(words+i)=(char)malloc(sizeof(char)*26);
scanf(“%s”,words[i]);
}
scanf(“%s”,order);
if(sort(words,n,order)) printf(“true\n”);
else printf(“false”);
}




## C语言期末复习

### 字母大小写转换

~~~c
#include <stdio.h>
int main(void)
{
	 //ASCII码表中:
	// A-Z: 65-90
	 //a-z: 97-122
 
	char cLetter;
	char cDifference = 'a' - 'A';     // 计算出大写字母与小写字母的ASCII值的差,97-65等于32
 
	printf("请输入要转换的字母: ");
	scanf(" %c", &cLetter);
 
	if (cLetter - 'Z' <= 0)            // 如果不是大写字母,则进行转换成小写字母
            cLetter += cDifference;	
	else                              // 如果是小写,则进行转换成大写字母
            cLetter -= cDifference;
 
	printf("%c", cLetter);
	printf("\n");
 
	return 0;
}
#include"stdio.h"
	int main()
	{
		float a,b,c;
		scanf("%f,%f,%f",&a,&b,&c);//输入以逗号分隔开
		printf("%.2f\n",(a+b+c)/3);//%f是小数点后6位精度
	}

删除字符串中的数字(P140)

#include"stdio.h"
int main()
{
	int i,n=0;
	char s[]="f65dhbs8bf*";
	for(i=0;s[i];i++)
	{
		if(s[i]<'0'||s[i]>'9')
		s[n++]=s[i];
	}
	s[n]='\0';//必须要加这个,不然就是 fdhbsbf*bf*
	for(i=0;s[i];i++)
	{
		printf("%c",s[i]); 
	}
}

数组赋值

char a[]="abcd",*p=a;
printf("%d",*(p+4));
//自动补0,编译成功

char str2[]={'I','a','m','','f','i','n','e'}
printf("%d",*(p+4));
//不会自动补0,数组越界,编译失败

字符串数组赋值

1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");

不允许
 1char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
2char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
#include <stdio.h> /* 函数声明 */ 
 
void func1(void); 
static int count=10; /* 全局变量 - static 是默认的 */ 
int main()
 {
 while (count--) 
{ 
func1(); 
} return 0; 
} 
void func1(void) 
{ /* 'thingy' 是 'func1' 的局部变量 - 只初始化一次 * 每次调用函数 'func1' 'thingy' 值不会被重置。 */
 static int thingy=5; 
thingy++;
 printf(" thingy 为 %d , count 为 %d\n", thingy, count); 
}

取于符号

int main()
	{
		float c,a=4.5;
		c=(a/2.0);//c=0.500000
		printf("%.1f",c);
	}
a是float型,a=1,a/2

文件统计字符

#include <stdio.h>

int main()
{
    FILE *fp;
    char ch;
    long count = 0;
    long space=0;
    if ((fp = fopen("love.txt", "r")) == NULL) 
    {
        printf(" cannot open file\n");
        // exit(0);
    }
    while((ch = fgetc(fp)) != EOF)//!feof(fp)测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
    {
    	count++;
       if(ch == 32)//空格的ASCII码
       {
           space++;
       } 
    }
    
    printf("The total number of charaecters is:%ld\n", count-space);
    fclose(fp);
    return 0;
}
//

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fpr;
    char name[100] = {0};//存储路径名
    int ch;
    int number = 0;
    int character = 0;
    int space = 0;
    int total = 0;

    scanf("%s",name);

    if((fpr = fopen(name,"r")) == NULL)
    {
        printf("Can't open %s\n",name);
        exit(1);
    }
    while((ch = fgetc(fpr)) != EOF)
    {
       if(ch>=48 &&ch<=57)//数字的ASCII码
       {
            number++;
       }
       if((ch>=65&&ch<=90) || (ch>=97&&ch<=122))//字母的ASCII码
       {
           character++;
       }
       if(ch == 32)//空格的ASCII码
       {
           space++;
       }
       total++;
    }
    printf("数字 = %d 字母 = %d 空格 = %d 字符数 = %d\n",number,character,space,total);
    return 0;
}

字符数组的输入

#include<stdio.h>
int main()
{
    char s[10];
    scanf("%s",s);
    printf("%s",s);
    return 0;
}


字符串的统计

#include <stdio.h>


int main()
{
    char a; 
    int i = 0;
    int number = 0; //数字个数
    int space = 0;  //空格个数
    int letters = 0; //字母个数
    int other = 0;  //其他个数


   while((a=getchar())&&a!='\n')
    {
        if(a >= '0' && a <= '9')
        {
            number++;
        }else if(a == ' ')
        {
            space ++;
        }else if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
        {
            letters ++;
        }else
        {
            other++;
        }
    }

    printf("英文字母个数为:%d\n", letters );
    printf("数字个数为:%d\n", number);
    printf("空格个数为:%d\n", space );
    printf("其他个数为:%d\n", other);
    return 0;
}