计算机二级C语言-C程序设计题

计算机二级C语言-C程序设计题

原文链接https://blog.csdn.net/weixin_43323830/article/details/106317383

/*
Author:  Boohey
QQ:      3487267017
Date:    June 8,2020
Version: 
V1.0 初版
V1.1 部分答案格式的修改
*/

文章目录

1 取整与取模

1-1 两位数的正整数a、b合并成一个整数

在这里插入图片描述

#include <stdio.h>
void fun(int  a, int  b, long  *c)
{
	int qian, bai, shi, ge;
	qian = a % 10;
	bai = b % 10;
	shi = a / 10;
	ge = b / 10;
	*c = qian * 1000 + bai * 100 + shi * 10 + ge;
}
void main()
{  int  a,b; long  c;void NONO ();
   printf("Input a, b:");
   scanf("%d%d", &a, &b);
   fun(a, b, &c);
   printf("The result is: %ld\n", c);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *rf, *wf ;
  int i, a,b ; long c ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d,%d", &a, &b) ;
    fun(a, b, &c) ;
    fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

考察知识点:
/相除取整数部分,%是取模,即取除法的余数。

1-2 很奇怪的车牌号 1369

在这里插入图片描述
正儿八经

#include   <stdio.h>
#include   <stdlib.h>
#pragma warning (disable:4996)
struct BITS { int  m3, m2, m1, m0; };
struct BITS  fun(int  n)
{
   struct BITS  res;
/* 在这里将函数代码补充完整 */
   res.m0 = n % 10;
   res.m1 = n / 10 %10;
   res.m2 = n /100% 10;
   res.m3 = n / 1000;
   return res;
}
main( )
{	struct  BITS  a;
	void NONO();	
	int  i=0, n=0;
	for (i=32; i<100; i++)
	{	n = i * i;
		a= fun(n);
		if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
		printf("No. is %d\n", n);
	}
	NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
	struct  BITS  a;
	FILE *fp ;
	int  i=0, n=0;

	fp = fopen("out.dat","w") ;
	for (i=32; i<100; i++)
	{	n = i * i;
		a= fun(n);
		if (a.m3 < a.m2 && a.m2 < a.m1 && a.m1 < a.m0)
			fprintf(fp, "No. is %d\n", n);
	}
	fclose(fp);
}

难度等级:☆☆☆☆☆
学点啥

1-3 统计各年龄段人数

在这里插入图片描述
考察知识点:
分段函数

#include <stdio.h>
# define N  50
# define M  11
void fun(int *a, int *b)
{
	int i, j = 0;
	/*对b中元素进行赋值,
	避免其初始值不可预测出现错误*/
	for (i = 0; i < M; i++)
	{
		b[i] = 0;
	}
	///*第一反应,稍繁琐*/
	//for (j = 0; j < N; j++)
	//{
	//	switch (a[j] / 10)
	//	{
	//	case 0: b[0]++; break;
	//	case 1: b[1]++; break;
	//	case 2: b[2]++; break;
	//	case 3: b[3]++; break;
	//	case 4: b[4]++; break;
	//	case 5: b[5]++; break;
	//	case 6: b[6]++; break;
	//	case 7: b[7]++; break;
	//	case 8: b[8]++; break;
	//	case 9: b[9]++; break;
	//	default:b[10]++;
	//	}
	//}
	/*对上述进行优化,简化写法*/
	for (j = 0; j < N; j++)
	{
		if (a[j] >= 100)
		{
			b[10]++;
		}
		else
		{
			b[a[j] / 10]++;
		}
	}	
}
double  rnd()
{
	static int t = 29, c = 217, m = 1024, r = 0;
	r = (r*t + c) % m;
	return((double)r / m);
}
void main()
{
	FILE *wf;
	int age[N], i, d[M];
	int b[N] = { 32,45,15,12,86,49,97,3,44,52,17,95,63 };
	for (i = 0; i < N; i++)
		age[i] = (int)(115 * rnd());     /*产生一个随机的年龄数组*/
	printf("The original data :\n");
	for (i = 0; i < N; i++)
		printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]);   /*每行输出10个数*/
	printf("\n\n");
	fun(age, d);
	for (i = 0; i < 10; i++)
		printf("%4d---%4d  :%4d\n", i * 10, i * 10 + 9, d[i]);
	printf("Over 100  :  %4d\n", d[10]);
	/******************************/
	wf = fopen("out.dat", "w");
	fun(b, d);
	for (i = 0; i < 10; i++)
		fprintf(wf, "%4d---%4d  :%4d\n", i * 10, i * 10 + 9, d[i]);
	fprintf(wf, "Over 100  :  %4d", d[10]);
	fclose(wf);
	/*****************************/
}

1-4 互不相同且无重复数字的三位数

在这里插入图片描述
正儿八经

#include <stdio.h>
#define max 100

int fun(int xxx[])
{
	/*思路:无重复数字min123~max432*/
	int i,k=0,ge,shi,bai;

	for(i = 0; i < max; i++)
		xxx[i] = 0;

	for (i = 123; i <= 432; i++)
	{
		ge = i % 10;
		shi = i / 10 % 10;
		bai = i / 100;
		/*数字均不相同,且由1-4组成*/
		if (ge != shi && ge != bai && shi != bai&&1<=ge&&ge <=4 && 1 <= shi&&shi <= 4 && 1 <= bai &&bai<= 4)
		{
			printf("%4d", i);
			xxx[k++] = i;
		}
	}
	return k;
}
int main()
{
	int xx[max],cnt;
	void NONO(int xx[], int cnt);
	
	cnt = fun(xx);
	printf("符合条件的个数=%d\n", cnt);
	NONO(xx, cnt);
	return 0;
}

void NONO(int xx[], int cnt)
{
	int i;
	FILE *fp;

	fp = fopen("out.dat", "w");
	fprintf(fp, "%d\n", cnt);
	for(i=0;i<cnt;i++)
		fprintf(fp, "%d\n", xx[i]);
	fclose(fp);
}

难度等级:☆☆☆☆☆
学点啥

1-5.四叶玫瑰树

在这里插入图片描述

#include<stdio.h>
#pragma warning (disable:4996)
int fun(int n, int result[])
{ 
	int i,j,k=0, ge, shi, bai,qian;
	for (i = 1000; i < n; i++)
	{
		ge = i % 10;
		shi = i / 10 % 10;
		bai = i / 100 % 10;
		qian = i / 1000;
		//for (j = 0; j < 4; j++)
		//{
		//	ge *= ge;
		//	shi *= shi;
		//	bai *= bai;
		//	qian *= qian;
		//}

		if (i == (ge*ge*ge*ge + shi* shi*shi*shi + bai* bai*bai*bai + qian* qian*qian*))
		{
			result[k++] = i;
		}
	}
	return k;
}
main( )
{
	int result[10], n, i;
	void NONO(int result[], int n);
	n = fun(9999, result);
	for(i=0; i<n; i++) printf("%d\n", result[i]);
	NONO(result, n);
}

void NONO(int result[], int n)
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
	FILE *fp ;
	int i;

	fp = fopen("out.dat","w") ;
	fprintf(fp, "%d\n", n);
	for(i=0; i<n; i++) fprintf(fp, "%d\n", result[i]);
	fclose(fp);
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

求某数的N次幂,用for循环做,非常巧妙

注意:如下解法有误

int fun(int n, int result[])
{ 
	int i,j,k=0, ge, shi, bai,qian;
	for (i = 1000; i < n; i++)
	{
		ge = i % 10;
		shi = i / 10 % 10;
		bai = i / 100 % 10;
		qian = i / 1000;
		for (j = 0; j < 4; j++)
		{
			ge *= ge;
			shi *= shi;
			bai *= bai;
			qian *= qian;
		}

		if (i == (ge + shi + bai + qian))
			result[k++] = i;
	}
	return k;
}

错误原因:ge*ge*ge*ge表达有误

五星数

int fun(int n, int result[])
{ 
	int i,j,k=0, ge, shi, bai,qian,wan;
	for (i = 10000; i < n; i++)
	{
		ge = i % 10;
		shi = i / 10 % 10;
		bai = i / 100 % 10;
		qian = i / 1000%10;
		wan = i / 10000;
		j = ge*ge*ge*ge*ge + shi*shi*shi*shi*shi + bai*bai*bai*bai*bai + qian*qian*qian*qian*qian;
		if (i == j)
		{
			result[k++] = i;
		}
	}
	return k;
}

在这里插入图片描述
三叶草数

int fun(int n, int result[])
{ 
	int i,j,k=0, ge, shi, bai,qian,wan;
	for (i = 100; i < n; i++)
	{
		ge = i % 10;
		shi = i / 10 % 10;
		bai = i / 100;
		
		j = ge*ge*ge +shi*shi*shi + bai*bai*bai;
		if (i == j)
			result[k++] = i;
	}
	return k;
}

在这里插入图片描述

1-6 能被e整除的元素个数 110

在这里插入图片描述
正儿八经

#include <stdio.h>
#pragma warning (disable:4996)
#define N 10
int fun(int x[], int e, int *sum)
{
	int i,k=0;
	*sum = 0;

	for (i = 0; i<N; i++)
	{
		if (x[i] % e == 0)
			k++;
		else
			(*sum) += x[i];
	}
	return k;
}
main()
{  
	void NONO();
	int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;
	n=fun(x, e, &sum);
	printf("n=%d,sum=%d\n", n, sum);
	NONO();
}

void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, x[10], n, e, sum;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<5; i++) {
        for(j=0; j<10; j++) fscanf(rf, "%d ", &x[j]);  fscanf(rf, "%d", &e);
        n = fun( x, e, &sum );
        fprintf(wf, "%d, %d\n", n, sum);
    }
   fclose(rf) ;
   fclose(wf) ;
}

难度等级:☆☆☆☆☆
学点啥

1-7 被e整除

在这里插入图片描述
正儿八经

#include <stdio.h>
#pragma warning(disable:4996)

int fun(int x[], int n, int e, int *num)
{

	int i, sum = 0.0;
	*num = 0;

	for (i = 0; i < n; i++)
	{
		if (x[i] % e == 0)
		{
			(*num)++;
			sum += x[i];
		}
	}
	return sum;
}

int main()
{  
  void NONO();
  int x[] = {1, 9, 8, 6, 12}, num=0, sum;
  sum = fun(x, 5, 3, &num);
  printf("sum=%d,num=%d\n", sum, num);
  NONO();
  return 0;
}

void NONO( )
{
	int x[100] = {1, 9, 8, 6, 12}, num, sum, i, j, count, e;
	FILE *rf, *wf;
	rf = fopen("in.dat","r");
	wf = fopen("out.dat","w");
	for(i=0;i<10;i++) {
		num = 0;
		sum = 0;
		fscanf(rf, "%d,", &count);
		for(j=0;j<count;j++)
			fscanf(rf,"%d,",&x[j]);
		fscanf(rf, "%d,", &e);
		sum = fun(x, count, e, &num);
		fprintf(wf, "sum=%d,num=%d\n", sum, num);
     }
     fclose(rf);
     fclose(wf);
}

1-8 判断形参n中的正整数是几位数

在这里插入图片描述
雕虫小技

正儿八经

#include  <stdio.h>
void NONO();
int  fun(int  n)
{
	int k=1;
	while (n / 10 > 0)
	{
		k++;
		n /= 10;
	}
	return k;
}
void main()
{  int  n, place ;
   do{
      printf("请输入一个4位以内的正整数:    ");
      scanf("%d", &n);
     }  while (n<0 || n>9999);
   place = fun(n);
   printf( "输入的数字是%d位\n", place );
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n, place ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<10; i++ )
  {
     fscanf(fp, "%d ", &n);
     place = fun(n);
     fprintf(wf, "%d\n", place);
  }
  fclose(fp) ;
  fclose(wf) ;
}

难度等级:☆☆☆☆☆
学点啥

1-9 保留两位小数,并对第三位进行四舍五入

在这里插入图片描述
雕虫小技*
在这里插入图片描述
正儿八经

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
float fun (float h )
{

	float y, result;
	int x,jc, bl, qy;
	y = h * 1000;//1234.56789
	x = (int) y;//强制转换1234567

	jc = x % 10;//四舍五入检测位 7
	bl = x / 10 % 10;//保留位6
	qy = x / 100;//其余12345

	if (jc > 4)
		bl++;
	result = (qy * 10 + bl) / 100.0;

	return result;
}
void main()
{
  FILE *wf;
  float a;
  system("CLS");
  printf("Enter a: ");
  scanf ("%f",&a);
  printf("The original data is :  ");
  printf("%f\n\n", a);
  printf("The  result : %f\n", fun(a));
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",fun(8.32533));
  fclose(wf);
/*****************************/
}

在这里插入图片描述

输出结果

在这里插入图片描述
为何错了?

在这里插入图片描述

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
float fun (float h )
{
	/*单精度*1000+5,相当于对lg1000也即第3位
	进行四舍五入,/10赋给长整型可截去第三位后小数点*/
	int tmp = (int)(h*1000+5)/10;
	/*/100,保留两位小数*/
	return (float)tmp / 100.0;
}
void main()
{
  FILE *wf;
  float a;
  system("CLS");
  printf("Enter a: ");
  scanf ("%f",&a);
  printf("The original data is :  ");
  printf("%f\n\n", a);
  printf("The  result : %f\n", fun(a));
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",fun(8.32533));
  fclose(wf);
/*****************************/
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

1-10 整数部分和小数部分

在这里插入图片描述
正儿八经

#include  <stdio.h>
#pragma warning (disable:4996)
void  fun(  double  aa, int  *x, double  *y )
{ 
	*x = (int)aa;
	*y = aa - *x;
}
main()
{ void NONO();
  double  aa, b;  int  a;
  printf("请输入一个双精度数:  ");scanf("%lf",&aa);
  fun( aa, &a, &b );
  printf( "%f的整数部分是: %d   小数部分是%f\n", aa,a,b );
  NONO();
}
void NONO()
{
  FILE *in, *out ;
  double  aa, b;  int  a;
  int i ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
	fscanf(in, "%lf", &aa) ;
    fun( aa, &a, &b );
    fprintf(out, "%f的整数部分是: %d   小数部分是%f\n", aa,a,b );
  }
  fclose(in) ;
  fclose(out) ;
}

难度等级:☆☆☆☆☆
学点啥
在这里插入图片描述

1-11. w是一个大于10的无符号整数

在这里插入图片描述
雕虫小技

在这里插入图片描述

在这里插入图片描述
正儿八经

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
unsigned fun(unsigned w)
{
	int i, n = 1, high = 1,t=w;

	while (t / 10 > 0)
	{
		t /= 10;
		n++;//确定n位数 例5923四位数
	}

	for (i = 0; i < n-1; i++)//10^(n-1)
		high *= 10;

	/*5923-5923/1000*1000*/
	return w%high;
}
void main()
{ 
  FILE *wf;
  unsigned x;
  system("CLS");
  printf("Enter a unsigned integer number: ");
  scanf ("%u",&x);
  printf("The original data is:%u\n",x);
  if(x<10) 
    printf("Data error! ");
  else 
    printf ("The result :%u\n", fun(x));
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%u",fun(5923));
  fclose(wf);
/*****************************/
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

2【素数】

2-1【素数】将大于整数m且紧靠m的k个素数存入

在这里插入图片描述
思路1:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m,int k,int xx[])
{
	int i,j,n;
	for (i = m + 1, n = 0; n < k; i++)//找出k个数字
	{
		for (j = 2; j < i; j++)//判断是否素数
		{
			if (i%j == 0)//非素数,跳出循环
				break;
		}
			if (j >= i)//素数,则存入
				xx[n++] = i;
	}	
}
void main()
{
  FILE *wf;
  int m,n,zz[1000];
  system("CLS");
  printf("\nPlease enter two integers: ");
  scanf("%d%d",&m,&n);
  fun(m, n, zz);
  for(m=0;m<n;m++)
     printf("%d ",zz[m]);
  printf("\n ");
/******************************/
  wf=fopen("out.dat","w");
  fun(17,5,zz);
  for(m=0;m<5;m++)
     fprintf(wf,"%d ",zz[m]);
  fclose(wf);
/*****************************/
}

输出结果:
在这里插入图片描述
思路2:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m, int k, int xx[])
{
	int i, j, n,temp;
	for (i = m + 1, n = 0; n < k; i++)//找出k个数字
	{
		temp = sqrt(i);
		for (j = 2; j < temp; j++)//判断是否素数
		{
			if (i%j == 0)//非素数,跳出循环
				break;
		}
		if (j >= i)//素数,则存入
			xx[n++] = i;
	}
}
void main()
{
	FILE *wf;
	int m, n, zz[1000];
	system("CLS");
	printf("\nPlease enter two integers: ");
	scanf("%d%d", &m, &n);
	fun(m, n, zz);
	for (m = 0; m < n; m++)
		printf("%d ", zz[m]);
	printf("\n ");
	/******************************/
	wf = fopen("out.dat", "w");
	fun(17, 5, zz);
	for (m = 0; m < 5; m++)
		fprintf(wf, "%d ", zz[m]);
	fclose(wf);
	/*****************************/
}

输出结果:
在这里插入图片描述

学点啥
如何判断素数?关键代码如下:

		for (j = 2; j < i; j++)//判断是否素数
		{
			if (i%j == 0)//非素数,跳出循环
				break;
		}
		/*遍历仍无除了2与本身的其他因子,则为素数,则存入*/
			if (j >= i)
				xx[n++] = i;
	

对代码具体分析如下:
判断i是否为素数,j自增,若i%j == 0也即中途跳出循环,j必然未增至i;若j遍历从2增至到i仍无因子j >= i,则i为素数,xx[n++] = i;将其存入。

修改:将大于整数m且紧靠m的k个非素数存入

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void fun(int m,int k,int xx[],int yy[])
{
	int i,j,n;
	for (i = m + 1, n = 0; n < k; i++)//找出k个数字
	{
		for (j = 2; j < i; j++)//判断是否素数
		{
			if (i%j == 0)//非素数,则存入
			{
				xx[n++] = i;
				break;
			}
		}
			//if (j >= i)//素数
			//	yy[n++] = i;
	}	
}
void main()
{
  FILE *wf;
  int m,n,zz[1000];
  system("CLS");
  printf("\nPlease enter two integers: ");
  scanf("%d%d",&m,&n);
  fun(m, n, zz);
  for(m=0;m<n;m++)
     printf("%d ",zz[m]);
  printf("\n ");
/******************************/
  wf=fopen("out.dat","w");
  fun(17,5,zz);
  for(m=0;m<5;m++)
     fprintf(wf,"%d ",zz[m]);
  fclose(wf);
/*****************************/

}

C语言判断素数

2-2【素数】3~n之间所有素数的平方根之和

在这里插入图片描述

#include  <stdio.h>
#include  <math.h>
double fun(int n)  
{
	int i,j,k;
	double SumAve = 0.0;
	for (i = 3; i <= n; i++)
	{
		k = sqrt(i);
		for (j = 2; j <= k; j++)
			if (i%j == 0)
				break;
		if (j >= k+1)
			SumAve += sqrt(i);
	}
	return SumAve;
}
void main()
{int n;
 double sum;
 FILE *out;
 printf("Input  N=");
 scanf("%d",&n);
 sum=fun(n);
 printf("\n\nsum=%f\n\n",sum);
 /******************************/
 out=fopen("out.dat","w");
 fprintf(out,"%f\n",fun(180));
 fclose(out);
 /******************************/
}

在这里插入图片描述
学点啥
素数判断两种方法
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。

**思路1):**因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。

**思路2):**另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
**原因:**因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 ,另一个大于或等于 。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16,因此只需判定在 2~4 之间有无因子即可。

两种思路的代码请看解析。

思路1

#include <stdio.h>

int main(){
    int a=0;  // 素数的个数
    int num=0;  // 输入的整数

    printf("输入一个整数:");
    scanf("%d",&num);

    for(int i=2;i<num;i++){
        if(num%i==0){
            a++;  // 素数个数加1
        }
    }

    if(a==0){
        printf("%d是素数。\n", num);
    }else{
        printf("%d不是素数。\n", num);
    }

    return 0;
}

思路2

#include <stdio.h>
#include <math.h>
void main(){
    int m;  // 输入的整数 
    int i;  // 循环次数
    int k;  // m 的平方根 

    printf("输入一个整数:");
    scanf("%d",&m);

    // 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型 
    k=(int)sqrt( (double)m );
    for(i=2;i<=k;i++)
        if(m%i==0)
            break;

    // 如果完成所有循环,那么m为素数
    // 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k 
    if(i>k)
        printf("%d是素数。\n",m);
    else
        printf("%d不是素数。\n",m);

    return 0;
}

2-3【素数】求出小于或等于lim的所有素数

在这里插入图片描述
雕虫小技

直接F5运行,如下出现错误
原因 int fun(int lim, int aa[MAX]){ }函数中无返回值。

修改如下:

int fun(int lim, int aa[MAX])
{
	return 15;
}

在这里插入图片描述

在这里插入图片描述

正儿八经

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
int fun(int lim, int aa[MAX])
{
	int i, j, k = 0;//素数个数初始化并幅值
	for (i=2;i<=lim;i++)
	{
		for (j = 2; j < i; j++)
		{
			if (i%j == 0)
				break;
		}
		if (j >= i)
			aa[k++] = i;
	}
	return k;
}
void main()
{
  FILE *wf;
  int limit,i,sum;
  int aa[MAX];
  system("CLS");
  printf("输入一个整数:");
  scanf("%d",&limit);
  sum=fun(limit,aa);        
  for(i=0;i<sum;i++)
     {
      if(i%10==0&&i!=0)    /*每行输出10个数*/
         printf("\n ");
      printf("%5d ",aa[i]);
    }
/******************************/
  wf=fopen("out.dat","w");
  sum=fun(15,aa);        
  for(i=0;i<sum;i++)
     {
      if(i%10==0&&i!=0)    /*每行输出10个数*/
         fprintf(wf,"\n");
      fprintf(wf,"%5d ",aa[i]);
    }
  fclose(wf);
/*****************************/
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

2-4【素数】小于整数m的非素数存入xx所指数组中

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>

void fun( int m, int *k, int xx[] )
{
	int i, j,*k=0;

	for (i = 4; i < m; i++)
	{
		for (j = 2; j <= i; j++)
		{
			if (i%j == 0)
				break;
		}
		if(i<j)
			xx[(*k)++] = i;
	}
}

void main()
{
   int m, n, zz[100];
   void NONO (  );
   printf( "\nPlease enter an integer number between 10 and 100: " );
   scanf(  "%d", &n );
   fun( n, &m, zz );
   printf( "\n\nThere are %d non-prime numbers less than %d:", m, n );
   for( n = 0; n < m; n++ )
      printf( "\n  %4d", zz[n] );
   NONO();
}

void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   int m, n, zz[100];
   FILE *rf, *wf ;

   rf = fopen("in.dat","r") ;
   wf = fopen("out.dat","w") ;
   fscanf( rf, "%d", &n );
   fun( n, &m, zz );
   fprintf(wf, "%d\n%d\n", m, n );
   for( n = 0; n < m; n++ )
      fprintf(wf, "%d\n", zz[n] );
   fclose(rf) ;
   fclose(wf) ;
}

难度等级:★★★★★☆☆☆☆
学点啥

2-5 是否可以分解成两个素数相乘

在这里插入图片描述
正儿八经

#include<stdio.h>
#include<math.h>
int prime(int m)
{
	int k,flag=1;
	for(k=2;k<(int)sqrt((double)m);k++)
		if(m%k==0)
			flag=0;
	return flag;
}
int fun(int n,int *x,int *y)
{
	int k,flag=0;

	for (k = 2; k < n; k++)//	优化 for (k = 2; k <=sqrt(n); k++)
		if (n%k == 0)
		{
			*x = k;
			*y = n / k;
			if (prime(*x) && prime(*y))
			{
				flag = 1;
				break;
			}
		}
    return flag;
}
main()
{
	int a,b;FILE *out ;
	out = fopen("out.dat","w") ;
	if(fun(111,&a,&b)) {
		printf("111=%d*%d\n",a,b);
		fprintf(out, "111=%d*%d\n",a,b);
	}
	if(fun(11111,&a,&b)) {
		printf("11111=%d*%d\n",a,b);
		fprintf(out, "11111=%d*%d\n",a,b);
	}
	if(fun(1111111,&a,&b)) {
		printf("1111111=%d*%d\n",a,b);
		fprintf(out,"1111111=%d*%d\n",a,b);
	}
   fclose(out);
   getchar();

}

在这里插入图片描述
难度等级:☆☆☆☆☆
学点啥

判断是否素数代码

int prime(int m)
{
	int k,flag=1;
	for(k=2;k<(int)sqrt((double)m);k++)
		if(m%k==0)
			flag=0;
	return flag;
}

2-6 哥德巴赫猜想

在这里插入图片描述
正儿八经

#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)

int prime(int n)
{	int k,flag=1;
	for (k=2; k<=(int)sqrt((double)n); k++)
		if (n%k == 0)
			flag=0;
	return flag;
}
int fun(int m, int a[])
{ 
  int k, s, count, i=0;
   for(k=6; k<=m; k+=2)
   {   count = 0;
	   /* 请在此处填写代码 */
		for (s = 2; s <= k / 2; s++)
		{
			if (prime(s) == 1 && prime(k - s) == 1)
				count++;
		}
	   /* 代码结束 */

       if (count == 10) {
		   printf("%d\n", k);
		   a[i++] = k;
	   }
   }
   return i;
}
main( )
{	int count, a[100];
	void NONO(int count, int a[]);
	count = fun(999, a);
	NONO(count, a);
}

void NONO(int count, int a[])
{
	FILE *fp;
	int i;
	fp = fopen("out.dat","w") ;
	for(i=0; i<count; i++)
		fprintf(fp, "%d\n", a[i]);
	fclose(fp);
}

在这里插入图片描述
难度等级:☆☆☆☆☆
学点啥

2-6. 能整除x且不是偶数的各整数

在这里插入图片描述
雕虫小技

在这里插入图片描述
在这里插入图片描述
正儿八经

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

void fun (int x, int pp[], int *n)
{
	int i,k=0;
	for (i=1;i<x;i++) 
	{
		if (x%i == 0 && i%2 == 1)
		{
			pp[k++] = i;
		}
	}
	*n = k;
	return *n;
}

void main ()
{ 
  FILE *wf;
  int  x,aa[1000], n, i ;
  system("CLS");
  printf("\nPlease enter an integer number : \n ") ;
  scanf ("%d", &x) ;
  fun (x, aa, &n) ;
  for (i=0 ; i<n ; i++)
      printf ("%d ", aa [i]);
  printf ("\n ") ;
/******************************/
  wf=fopen("out.dat","w");
  fun (30, aa, &n) ;
  for (i=0 ; i<n ; i++)
      fprintf (wf,"%d ", aa [i]);
  fclose(wf);
/*****************************/
}

在这里插入图片描述

难度等级:★☆☆☆☆
优化

void fun (int x, int pp[], int *n)
{
	int i,k=0;
	for (i=1;i<x;i=i+2) 
	{
		if (x%i == 0)
			pp[k++] = i;
	}
	*n = k;
	return *n;
}

学点啥

3 【排列】

3-1 连续递增字母序列

在这里插入图片描述

#include   <stdio.h>
#include  <string.h>
void NONO();
int  fun( char  *t )
{
	/********1*******/
	//int flag = 1;
	//char old_ch = t[0];
	//char new_ch;
	//int len = strlen(t);
	//if (len < 2)
	//	return 0;
	//for (int i = 1; t[i] != '\0'; i++)
	//{
	//	new_ch = t[i];
	//	if (new_ch - old_ch!=1)
	//	{
	//		flag = 0; 
	//		break;
	//	}
	//	old_ch = new_ch;
	//}
	//return flag;
	/********2*******/
	int flag = 1;
	int len = strlen(t);
	if (len < 2)
		return 0;
	while (*(t + 1))
	{
		if ((*(t + 1) - *t) != 1)
		{
			flag = 0;
		}
		t++;
	}
	return flag;
}

void main()
{  char  s[26];
   printf("请输入一个字母组成的字符串 :  "); gets(s);
   if( fun(s) )  printf("%s 是由连续字母组成的字符串.\n", s );
   else   printf("%s 不是由连续字母组成的字符串!\n", s );
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;
  char s[26], *p;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s, 26, fp);
	p=strchr(s,'\n');
	if(p) *p=0;
    if (fun(s)) fprintf(wf, "%s\n", s+2);
	else  fprintf(wf, "%s\n", strrev(s));
  }
  fclose(fp) ;
  fclose(wf) ;
}

学点啥

3-2 【排列】【冒泡法】其余5个字符按ASCII码降序排列

在这里插入图片描述
雕虫小技

正儿八经

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

void fun(char *s,int num)
{
	int i,j;
	char temp;

	for (i = 1; i <= 5; i++)
	{
		for (j = i+1; j <=5; j++)
			if (*(s+i) < *(s + j))
			{
				temp = *(s + j);
				*(s + j) = *(s + i);
				*(s + i) = temp;
			}
	}
}

void main()
{
  void NONO( );
  char s[10];
  printf("输入7个字符的字符串:");
  gets(s);
  fun(s,7);
  printf("\n%s",s);
  NONO();
}
void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
   char s[10] ;
   FILE *rf, *wf ;
   int i = 0 ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
   while(i < 10) {
     fgets(s,10,rf) ;
     s[7] = 0 ;
     fun(s,7);
     fprintf(wf, "%s\n", s) ;
     i++ ;
   }
   fclose(rf) ;
   fclose(wf) ;
}

难度等级:★★☆☆☆
学点啥

4 因子

4-1.能被7或11整除

在这里插入图片描述
错误答案

#include <stdio.h>

void  fun (int *a, int *n)
{
	int i,j = 0;
	for (i = 1; i <= 1000; i++)
	{
		if ((i % 7 == 0) || (i % 11 == 0) && (i % 77 != 0))
			a[j++] = i;
	}
	return j;
}

void main( )
{  int aa[1000], n, k ;
   void NONO (  );

   fun ( aa, &n ) ;
   for ( k = 0 ; k < n ; k++ )
      if((k + 1) % 10 == 0) printf("\n") ;
      else printf("%5d", aa[k]) ;
   NONO( );
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  int aa[1000], n, k ;
  FILE *fp ;

  fp = fopen("out.dat","w") ;
  fun ( aa, &n ) ;
  for ( k = 0 ; k < n ; k++ )
    if((k + 1) % 10 == 0) fprintf(fp, "\n") ;
    else fprintf(fp, "%5d", aa[k]) ;
  fclose(fp) ;
}

原因分析
函数fun类型为void,无法返回值;而且并未利用给的n
正确答案

#include <stdio.h>

void  fun (int *a, int *n)
{
	int i,j = 0;
	for (i = 1; i <= 1000; i++)
	{
		if ((i % 7 == 0) || (i % 11 == 0) && (i % 77 != 0))
			a[j++] = i;
	}
	*n = j;
}

void main( )
{  int aa[1000], n, k ;
   void NONO (  );

   fun ( aa, &n ) ;
   for ( k = 0 ; k < n ; k++ )
      if((k + 1) % 10 == 0) printf("\n") ;
      else printf("%5d", aa[k]) ;
   NONO( );
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  int aa[1000], n, k ;
  FILE *fp ;

  fp = fopen("out.dat","w") ;
  fun ( aa, &n ) ;
  for ( k = 0 ; k < n ; k++ )
    if((k + 1) % 10 == 0) fprintf(fp, "\n") ;
    else fprintf(fp, "%5d", aa[k]) ;
  fclose(fp) ;
}

学点啥

4-2. 同时能被3与7整除的所有自然数之和

在这里插入图片描述

雕虫小技

正儿八经

#include <math.h>
#include <stdio.h>
double  fun( int  n)
{
	int i,sum=0;

	for (i = 0; i < n; i++)
	{
		if (i % 3 == 0 && i % 7 == 0)
			sum += i;
		
	}
	return sqrt(sum);

}

void main()   /* 主函数 */
{  void NONO ();
   printf("s =%f\n", fun ( 1000) );
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n ;
  double s;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述

4-3 能被5或9整除 0.583333

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
double fun(int n)
{
	int i;
	double sum = 0.0;
	for (i = 1; i <= n; i++)
	{
		if (i % 5 == 0 || i % 9 == 0)
			sum += 1.0 / i;
	}
	return sum;
}

void main()
{
	 int n;
	 double s;
	 FILE *out;
	 printf("\nInput n:");
	 scanf("%d",&n);
	 s=fun(n);
	 printf("\n\ns=%f\n",s);
	 /******************************/
	 out=fopen("out.dat","w");
	 fprintf(out,"%f\n",fun(30));
  	 fclose(out);
	 /******************************/
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

double a = 4/3
double b = 4.0/3.0

前一个是按照整型计算 所以a是1.0
后一个是按照浮点型计算 所以 b是 1.333333
在这里插入图片描述

double fun(int n)
{
	int i;
	double sum = 0.0;
	for (i = 1; i <= n; i++)
	{
		if (i % 5 == 0 || i % 9 == 0)
			sum += 1 / i;//此处修改
	}
	return sum;
}

在这里插入图片描述

4-4 给定整数n的所有因子

在这里插入图片描述
雕虫小技

正儿八经

#include  <stdio.h>
int fun(int n)
{
	int i,j,sum=0;
	for (i = 2; i < n; i++)
			if (n%i == 0)
				sum += i;
	return sum;
}
void main()
{ 
 int  n,sum; 
 FILE *out;
 printf("Input  n:"); 
 scanf("%d", &n);
 sum=fun(n);
 printf("sum=%d\n", sum);
 /******************************/
 out=fopen("out.dat","w");
 fprintf(out,"%d\n",fun(123));
 fprintf(out,"%d\n",fun(456));
 fprintf(out,"%d\n",fun(789));
 fprintf(out,"%d\n",fun(147));
 fprintf(out,"%d",fun(258));
 fclose(out);
 /******************************/
}

难度等级:★★☆☆☆
学点啥

5 【字符游戏】【对称】

5-1 把1~m个字符,平移到字符串的最后(循环移动) ABCDEFGHIJK

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 1; i <= m; i++)
	{
		temp = w[0];
		for (j = 1; w[j] != '\0'; j++)
		{
			w[j - 1] = w[j];
		}
		w[j - 1] = temp;	
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

学点啥
经典的循环左移算法,多层嵌套用于控制移动的字符个数,也即需要进行循环的次数;
内层循环将第2个字符(含)以后的每个字符向前移动一个位置,然后将第一各字符放置到最后一个字符中。
换一种写法

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 0; i < m; i++)
	{
		temp = w[0];
		for (j = 0; w[j] != '\0'; j++)
		{
			w[j] = w[j+1];
		}
		w[j] = temp;//代码错误行	,修改前
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

输出结果(有误 )
应为DEFGHIJKABC,但输出是为DEFGHIJK

在这里插入图片描述
错误原因

w[j] = temp;//代码错误行 ,修改前表示将temp置于w[5],且并未显示。
在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define   N    80
void fun (char  *w,int  m)
{
	int i, j;
	char temp;
	for (i = 0; i < m; i++)
	{
		temp = w[0];
		for (j = 0; w[j] != '\0'; j++)
		{
			w[j] = w[j+1];
		}
		w[j-1] = temp;	//代码错误行,修改后
	}
}
void main()
{
  FILE *wf;
  char  a[N]= "ABCDEFGHIJK",b[N]= "ABCDEFGHIJK";
  int  m;
  printf("The origina string :\n");
  puts(a);
  printf("\n\nEnter  m: ");
  scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving :\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fun(b,3);
  fprintf(wf,"%s",b);
  fclose(wf);
/*****************************/
}

运行结果
在这里插入图片描述

5-2 字符串中原有的字符串为"abcdefg",则调用该函数后,串中的内容"gfedCba"

@使用VC++201打开考生文件夹下progl中的解决方案◊此解决方案的顶目中包含一个源程序文件progl.c。在此程序中,例如,
字符串中原有的字符串为"abcdefg",则调用该函数后,串中的内容"gfedCba"
注意:部分源程序在文件pmgl.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数firn的花括号中填入你编写的若干语句。
在这里插入图片描述

#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
	char temp;
	int  m, n,i = 0;
	m = n = strlen(s) - 1;
	for (i=0;i < (n + 1) / 2;i++)
	{
		temp = s[i];
		s[i] = s[m];
		s[m] = temp;
		m--;
	}
}

void main()
{
	 char a[N];
	 FILE *out;
	 printf("Enter a string:");
	 gets(a);
	 printf("The  original string is:");
	 puts(a);
	 fun(a);
	 printf("\n");
	 printf("The string after modified:");
	 puts(a);
	 strcpy(a,"Hello World!");
	 fun(a);
	 /******************************/
	 out=fopen("out.dat","w");
	 fprintf(out,"%s",a);
	 fclose(out);
	 /******************************/
}

在这里插入图片描述
学点啥
字符串倒写,思路是将第一各与最后一个交换,第二个遇到书第二个交换,直至中间字符;长度为n的交换n/2次,如长度6或者7都是交换3次。

再学点啥
写了一个新程序void leftMove(char*s,int leftMove),功能如下:将字符串s左移n位,左移溢出的移至末尾。如输入s为abcdefg,n=2,输出cdefgab。

//V。0 新建
//V1.1 增加输入左移位数
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
	int i, j,temp,len;
	//len = strlen(s);
	//printf('%d',len);
	for (i=0;i<6;i++)
	{
		//if (s[i + 1] != '\0')
		temp = s[0];
		for (j=0;j<6;j++)
		{
			if(s[j+1]!='\0')
				s[j] = s[j + 1];
		}
		s[j] = temp;
	}
}
void leftMove(char*s,int leftMove)
{
	int i, j, temp, len;
	
	for (i = 0; i < leftMove; i++)
	{
		//if (s[i + 1] != '\0')
		temp = s[0];
		for (j = 0; j < leftMove; j++)
		{
			if (s[j + 1] != '\0')
				s[j] = s[j + 1];
		}
		s[j] = temp;
	}
}

void main()
{
	 char a[N];
	 FILE *out;
	 printf("Enter a string:");
	 gets(a);
	 printf("The  original string is:");
	 puts(a);
	 //fun(a);
	 leftMove(a, 1);
	 printf("\n");
	 printf("The string after modified:");
	 puts(a);
	 //strcpy(a,"Hello World!");
	 //fun(a);
	 /******************************/
	 out=fopen("out.dat","w");
	 fprintf(out,"%s",a);
	 fclose(out);
	 /******************************/
}

输出结果
在这里插入图片描述
a~f一共7个字母,输入大于等于7的数字会出错,如下:
在这里插入图片描述
在这里插入图片描述
期望:输入数字7k+i,i=0~6等同输入7,也即取模

//V。0 新建
//V1.1 新增输入左移位数输入
//V1.2 输入数字7k+i,i=0~6等同输入7,也即取模;
//     修复了之前版本显示数据有误的bug;
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define N 81
void fun(char*s)
{
	int i, j,temp,len;
	//len = strlen(s);
	//printf('%d',len);
	for (i=0;i<6;i++)
	{
		//if (s[i + 1] != '\0')
		temp = s[0];
		for (j=0;j<6;j++)
		{
			if(s[j+1]!='\0')
				s[j] = s[j + 1];
		}
		s[j] = temp;
	}
}
void leftMove(char*s,int leftMove)
{
	int i, j, temp, len,ModeLeftMove;
	ModeLeftMove = leftMove % 7;
	for (i = 0; i < ModeLeftMove; i++)
	{
		//if (s[i + 1] != '\0')
		temp = s[0];
		for (j = 0; j < 6/*len-1*/; j++)
		{
			if (s[j + 1] != '\0')
				s[j] = s[j + 1];
		}
		s[j] = temp;
	}
}

void main()
{
	 char a[N];
	 int M;
	 FILE *out;
	 printf("Enter a string:");
	 gets(a);
	 printf("LeftMove Number is:");
	 scanf("%d", &M);
	 printf("The  original string is:");
	 puts(a);
	 //fun(a);
	 leftMove(a, M);
	 printf("\n");
	 printf("The string after modified:");
	 puts(a);
	 //strcpy(a,"Hello World!");
	 //fun(a);
	 /******************************/
	 out=fopen("out.dat","w");
	 fprintf(out,"%s",a);
	 fclose(out);
	 /******************************/
}

在这里插入图片描述
在这里插入图片描述
更多,参见StringleftMove维护Github

5-3 前导*号全部移到字符串的尾部

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include <stdio.h>
void  fun( char *a )
{

}

void main()
{  char  s[81];  int  n=0; void NONO ();
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after moveing:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fun(s) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

编写:
思路1:首先统计前导*个数k,然后利用贪吃蛇模型左移k

void  fun( char *a )
{
	/*思路:循环左移,直到非*也即字母为止*/
	int i,j,k=0;
	char temp;

	for (i = 0; a[i] == '*'; i++)
		if (a[i] == '*')
			k++;// star个数

	for (i = 0; i < k; i++)
	{
		temp = a[0];
		for (j = 1; a[j] != '\0'; j++)
			a[j - 1] = a[j];
		a[j - 1] = temp;
	}
}

思路2:首先统计前导个数k,然后前导后的字符输出,再前导*输出

void  fun(char *a)
{
	int i=0, k = 0;
	char *p;
	p = a;

	while (*p == '*')
	{
		k++;// count star number
		p++;//pointer
	}
	/*前导*后的字符输出*/
	while (*p)
	{
		a[i] = *p;
		i++;
		p++;
	}
	/*前导*输出*/
	while (k > 0)
	{
		a[i] = '*';
		i++;
		k--;
	}
	/*结束符*/
	a[i] = '\0';
}

难度等级:★★☆☆☆
学点啥

5-4.回文

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#define N 80
int fun(char *str)
{
}

void main()
{
	 char s[N];
	 FILE *out;
         char *test[]={"1234321","123421","123321","abcdCBA"};
	 int i;
	 printf("Enter a string : ");
	 gets(s);
	 printf("\n\n");
	 puts(s);
	 if(fun(s))
		printf("YES\n");
	 else
		printf("NO\n"); 
	 /************************************/
	 out=fopen("out.dat","w");
	 for(i=0;i<4;i++)
	 	if(fun(test[i]))
			fprintf(out,"YES\n");
		else
			fprintf(out,"NO\n");
	 fclose(out);
	 /************************************/
}

在这里插入图片描述
思路1:

int fun(char *str)
{
	int i = 0, k=0,flag=1;
	char  *t;
	t = str;
	while (*t)
	{
		t++;
		k++;
	}

	for (i = 0; i < k / 2; i++)
	{
		if (str[i] == str[k - 1 - i])
			;
		else
		{
			flag = 0;
			break;
		}
	}
	return flag;
}

思路2:

int fun(char *str)
{
	char  *f, *t;

	f = str;
	t = str + strlen(str) - 1;
	while ((*f == *t) && (f < t)) {
		f++; t--;
	};

	if (f < t) return 0;
	else   return 1;
}

难度等级:★★★★★☆☆☆☆
学点啥

5-6. 数组元素平移到数组的最后

在这里插入图片描述
雕虫小技

在这里插入图片描述

正儿八经

#include <stdio.h>
#define    N    80
void  fun(int  *w, int  p, int  n)
{
	int i,j,temp;
	for (i = 0; i <= p; i++)
	{
		temp = w[0];
		for(j=1;j<n;j++)
			w[j-1] = w[j];
		w[n - 1] = temp;
	}
}
void main()
{  int  a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   int  i,p,n=15;void NONO ();
   printf("The original data:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\nEnter  p:  ");scanf("%d",&p);
   fun(a,p,n);
   printf("\nThe data after moving:\n");
   for(i=0; i<n; i++)printf("%3d",a[i]);
   printf("\n\n");
   NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf,*wf ; int a[N], i, j, p, n ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 5 ; i++) {
    fscanf(rf, "%d %d", &n, &p) ;
    for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
    fun(a, p, n) ;
    for(j = 0 ; j < n ; j++) fprintf(wf, "%3d", a[j]) ; fprintf(wf, "\n") ;
  }
  fclose(rf) ; fclose(wf) ;
}

难度等级:★★★★★☆☆☆☆
学点啥
在这里插入图片描述

6 奇数偶数

6-1 s所指字符串中下标为偶数同时ASCII值为奇数的字符删除

在这里插入图片描述

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

void  fun(char  *s, char  t[])
{
	int i,j=0;
	for (i=0;i<100;i++)
	{
		if (s[i] % 2 == 0)//even
		{
			t[j++] = s[i];
		}
	}
}

void main()
{
  char   s[100], t[100];void NONO ();
  printf("\nPlease enter string S:"); scanf("%s", s);
  fun(s, t);
  printf("\nThe result is: %s\n", t);
  NONO();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  char s[100], t[100] ;
  FILE *rf, *wf ;
  int i ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", s) ;
    fun(s, t) ;
    fprintf(wf, "%s\n", t) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

在这里插入图片描述
学点啥

6-2. ASCII码值为偶数的字符删除

在这里插入图片描述
雕虫小技

正儿八经

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
void fun(char  *s, char t[])
{
	int i,j=0;
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] % 2 != 0)
			t[j++] = s[i];
	}
	t[j] = 0;
}
void main()
{
  FILE *wf;
  char s[100],t[100];
  system("CLS");
  printf("\nPlease enter string S: ");  
  scanf("%s",s);
  fun(s,t);
  printf("\nThe result is :%s\n",t);
/******************************/
  wf=fopen("out.dat","w");
  fun("ABCDEFG12345",t);
  fprintf(wf,"%s",t);
  fclose(wf);
/*****************************/
}

难度等级:★★★★★☆☆☆☆
学点啥
写法2:

void fun(char  *s, char t[])
{
	int j=0;
	for (; *s != '\0'; s++)
	{
		if (*s % 2 != 0)
			t[j++] = *s;
	}
	t[j] = 0;//t[j] = '\0';
}

6-3 ss所指字符串中所有下标为奇数位置的字母转化为大写

在这里插入图片描述
雕虫小技

正儿八经

#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void fun(char *ss)
{
	int i;
	for (i = 0; ss[i]!='\0'; i++)
	{
		if (i % 2 == 1&&'a'<=ss[i]<='z')
			ss[i] = ss[i]-32;
	}
}
void main()
{
  FILE *wf;
  char tt[81],s[81]="abc4Efg";
  system("CLS");
  printf("\nPlease enter an string within 80 characters:\n");
  gets(tt);
  printf("\n\nAfter changing, the string\n  %s",tt);
  fun(tt);
  printf("\nbecomes\n %s\n",tt);
/******************************/
  wf=fopen("out.dat","w");
  fun(s);
  fprintf (wf,"%s",s);
  fclose(wf);
/*****************************/
}

6-4 统计出这些数的奇数、偶数个数

在这里插入图片描述

#include <stdio.h> 
#pragma warning (disable:4996)
#define N 11
double fun( int xx[], int *yy )
{
	int i, odd_count = 0, even_count = 0;
	double even_total = 0.0, odd_total = 0.0,ave;
	for (i=0;i<N;i++)
	{
		if (xx[i] % 2 == 0)
		{
			even_count++;
			even_total += xx[i];
		}
		else
		{
			odd_count++;
			odd_total += xx[i];
		}
		if (even_count > odd_count)
		{
			*yy = even_count;
			ave = even_total / even;
		}
		else
		{
			*yy = odd_count;
			ave = odd_total / odd;
		}
	}
	return ave;
}

main()
{
    int yy, xx[N]={1101,1202,1303,1404,1505,2611,2712,2813,2914,3202,4222};
    double pjz ;
    void NONO();

    pjz = fun( xx, &yy );
    printf("yy=%d, pjz=%.2lf\n", yy, pjz);
    NONO();
}

void NONO()
{
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
   输出数据,关闭文件。 */
    int i, j, xx[N], yy;
    double pjz;
    FILE *rf, *wf ;

    rf = fopen("in.dat","r") ;
    wf = fopen("out.dat","w") ;
    for(i=0; i<10; i++) {
        for(j=0; j<N; j++) fscanf(rf, "%d ", &xx[j]);
        pjz = fun( xx, &yy );
        fprintf(wf, "%d, %.2lf\n", yy, pjz);
    }
   fclose(rf) ;
   fclose(wf) ;
}

学点啥
对于函数fun而言,yy为指针变量,可以传递数值

//代码不全
double fun( int xx[], int *yy )
{
	//
	return ave;
}

且由输出可得,yy为个数,pjz为平均值

pjz = fun( xx, &yy );
printf("yy=%d, pjz=%.2lf\n", yy, pjz);

故而有

	//代码不全
	if (even_count > odd_count)
	{
		*yy = even_count;
		ave = even_total / even_count;
	}
	else
	{
		*yy = odd_count;
		ave = odd_total / odd_count;
	}
}
return ave;

yy传递地址, pjz = fun( xx, &yy );读取yy地址,即可得所求个数;
平均值由fun返回。

在这里插入图片描述
优化

double fun( int xx[], int *yy )
{
	int i, j, num_odd = 0, num_even = 0;
	double sum_odd = 0.0, sum_even = 0.0, sum = 0.0;
	for (i = 0; i<N; i++)
	{
		if (xx[i] % 2 == 0)//even
		{
			sum_even += xx[i];
			num_even++;
		}
		else //odd
		{
			sum_odd += xx[i];
			num_odd++;
		}
	}

	sum = sum_even > sum_odd ? sum_even : sum_odd;
	*yy = num_even > num_odd ? num_even : num_odd;

	return sum / (*yy);

	//if (sum_even > sum_odd)
	//{
	//	*yy = num_even;
	//	return sum_even / (*yy);
	//}
	//else
	//{
	//	*yy = num_odd;
	//	return sum_odd / (*yy);
	//}
}

难度等级:★★★★★☆☆☆☆
学点啥

6-5 数组中偶数的个数

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#pragma warning (disable:4996)
#define N 8
int fun(int x[],double *ave)
{
	int i, k = 0;
	double sum = 0.0;

	for (i=0;i<N;i++)
	{
		if (x[i] % 2 == 0)
		{
			k++;
			sum += x[i];
		}
	}
	*ave = sum / k;
	return k;

}

main()
{  int x[N]={ 12,5,9,8,23,4,7,21 }, n;
   double ave;
   void NONO();
   n=fun(x,&ave);
   printf("n=%d,ave=%lf\n",n,ave);
   NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i,j, x[N], n ;
  double ave;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j=0 ; j < N; j++) fscanf(in, "%d,", &x[j]) ;
	   n=fun(x,&ave);
	 fprintf(out, "n=%d,ave=%lf\n",n,ave);
  }
  fclose(in) ;
  fclose(out) ;
}

难度等级:★★★★★☆☆☆☆
学点啥

7【寻寻觅觅】

7-1 【寻寻觅觅】统计一行字符串中单词的个数

在这里插入图片描述

正儿八经

#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
  
}
void main()
{ 
  FILE *wf;
  char line[N]; 
  int num=0;
  printf("Enter a string:\n "); 
  gets(line);
  num=fun(line);
  printf("The number of word is:%d\n\n ",num);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%d",fun("a big car"));
  fclose(wf);
/*****************************/
}

函数编写

/*错误原因:以下函数实际计算的是空格数,+1即为单词数*/
//int fun(char *s)
//{
//	/*错误原因:以下函数实际计算的是空格数,+1即为单词数
//	输入a big car   2个空格判定单词数为3  正确
//	输入a  big car  3个空格误判单词数为4  错误
//	输入 a big car  3个空格误判单词数为4  错误
//	*/
//
//	int i, k=1;
//
//	for (i = 0; s[i] != '\0'; i++)
//	{
//		if (s[i] == ' ')
//			k++;
//	} 
//	return k;
//}

正解

int fun(char *s)
{
	int i, k=1;
	
	for (i = 0; s[i] != '\0'; i++)
	{
		/*当前为字母且下一个字符为空格或者结束符,判定为单词*/
		if (s[i] != ' '&&(s[i+] == ' '|| s[i + ] == '\0'))
			k++;
	} 
	return k;
}

难度等级:★★★★★☆☆☆☆
学点啥

int fun(char  *s)
{
	int  k = 0, flag = 0;
	while (*s != '\0')
	{
		if (*s != ' ' && flag == 0)
		{
			k++;  flag = 1;
		}
		if (*s == ' ')
			flag = 0;
		s++;
	}
	return  k;
}

单词非空格且flag为0(flag初始值为0)时断定发现新单词,计数+1,flag置1;直至遇到下一个空格,flag清0
在这里插入图片描述

7-2 【寻寻觅觅】二维数组中字母A和C的个数

在这里插入图片描述

#include  <stdio.h>
#include  <stdlib.h>
#define  M  14
void NONO();
void  fun( char (*t)[M], int *a ,int *c)
{
	int i,j;
	*a = 0; *c = 0;
	for (i=0;i<M;i++)
	{
		for (j = 0; j < M; j++)
		{
			if (t[i][j]== 'A')
				(*a)++;
			if (t[i][j] == 'C')
				(*c)++;
		}
	}
}

void  get( char (*s)[M] )
{  int  i, j;
   for( i=0; i<M; i++ )
   {  for( j=0; j<M; j++)
      {  s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }
      printf("\n");
   }
}

void main()
{  char  a[M][M];
   int   x, y;
   get (a);
   fun ( a, &x,&y );
   printf("A = %d   C = %d\n",x,y);
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j, x, y ;
  char  a[M][M];

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<M; i++ )
  {  for( j=0; j<M; j++)
     {  fscanf(fp, "%c ", &a[i][j]); }
  }
  fun ( a, &x,&y );
  fprintf(wf, "A=%d\n", x) ;
  fprintf(wf, "C=%d\n", y) ;
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述
学点啥

7-3 查找x在s所指数组中下标的位置(数组)

在这里插入图片描述

#include  <stdio.h>
#include  <stdlib.h>
#define   N   15
void NONO();
int  fun( int *s, int x)
{
	int i;
	for (i=0;i<N;i++)
	{
		if (s[i] == x)
			return i;
	}
	return -1;
}
void main()
{  int a[N]={ 29,13,5,22,10,9,3,18,22,25,14,15,2,7,27},i,x,index;
   printf("a数组中的数据 :\n");
   for(i=0; i<N; i++) printf("%4d",a[i]);  printf("\n");
   printf("给x输入待查找的数 :  ");   scanf("%d",&x);
   index=fun( a, x );
   printf("index=%d\n",index);
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j, a[10], x, index;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j = 0 ; j < 10 ; j++) {
      fscanf(fp, "%d ", &a[j]);
    }
    fscanf(fp, "%d", &x);
    index = fun(a, x);
    fprintf(wf, "%d\n", index);
  }
  fclose(fp);
  fclose(wf);
}


学点啥

7-4 求出数组的最大元素在数组中的下标(数组)

在这里插入图片描述

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int fun(int *s,int t,int *k)
{
	int i,max;
	*k = 0;
	for (i = 0; i < t; i++)
	{
		if (s[*k] < s[i])
		{
			*k = i;
		}
	}
	return s[*k];
}
void main()
{
  FILE *wf;
  int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;
  system("CLS");
  fun(a, 10, &k);
  printf("%d, %d\n ", k, a[k]);
/******************************/
  wf=fopen("out.dat","w");
  fprintf (wf,"%d, %d", k, a[k]);
  fclose(wf);
/*****************************/
}

学点啥

8. 数组重拍列

8-1.二维数组中的数据,按照列的顺序依次放到一维数组中

在这里插入图片描述
程序维护2DArrayTo1DArray

#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
	int i, j, k=0;
	for (j = 0; j <nn ;j++)
	{
		for (i = 0; i <mm ;i++)
		{
			b[*n] = *(*(s+i)+j);
			(*n)++;
		}
	}
}
void main()
{
  int w[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}}, i, j;
  int a[100]={0},n=0 ;
  FILE *out;
  printf("The matrix:\n");
  for (i=0; i<3; i++)
    {for (j=0;j<4;j++)  
        printf("%3d",w[i][j]);
     printf("\n");
    }
  fun(w,a,&n,3,4);
  /******************************/
  out=fopen("out.dat","w");
  printf("The A array:\n");
  for(i=0; i<n; i++)  
  {     printf("%3d",a[i]); 
	fprintf(out,"%d ",a[i]);
  }
  printf("\n\n");
  fclose(out);
  /******************************/
}

在这里插入图片描述
学点啥

C语言二维数组指针(指向二维数组的指针)详解

C语言指针数组(数组每个元素都是指针)详解

**摘选**
int *(p1[5]);  //指针数组,可以去掉括号直接写作 int *p1[5];
int (*p2)[5];  //二维数组指针,不能去掉括号

指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。

3) *(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?

*(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针

  1. ((p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

举一反三 二维数组中的数据,按照行的顺序依次放到一维数组中。

#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
	int i, j;
	for (i = 0; i <mm ;i++)//行下标控制
	{
		for (j = 0; j <nn ;j++)//列下标控制
		{
			b[*n] = *(*(s+j)+i);
			(*n)++;//通过指针返回元素个数
		}
	}
}
void main()
{
  int w[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, i, j;
  int a[100]={0},n=0 ;
  FILE *out;
  printf("The matrix:\n");
  for (i=0; i<3; i++)
    {for (j=0;j<4;j++)  
        printf("%3d",w[i][j]);
     printf("\n");
    }
  fun(w,a,&n,3,4);
  /******************************/
  out=fopen("out.dat","w");
  printf("The A array:\n");
  for(i=0; i<n; i++)  
  {     printf("%3d",a[i]); 
	fprintf(out,"%d ",a[i]);
  }
  printf("\n\n\n\n");
  fclose(out);
  /******************************/
}

运行结果:有误
在这里插入图片描述
原因分析:

for (i = 0; i <mm/*mm=3;ROW*/ ;i++)//行下标控制
	{
		for (j = 0; j <nn /*nn=4;COLUMN*/;j++)//列下标控制
		{
			b[*n] = *(*(s+j)+i);
			(*n)++;//通过指针返回元素个数
		}
	}

在这里插入图片描述
在这里插入图片描述
由于第3行未赋值,默认为0

在这里插入图片描述
/***************************************/
时间线发散-关于数组赋值:
如果赋值了一项其余就是0,如果是int a[10]={1}其余各项就是0;如果只有int a[10]那么就是随机数。

#include <stdio.h>
void main()
{
	int s1[10] = { 1 }, s2[10];
	printf("s1[0]=%d,s1[1]=%d\n", s1[0], s1[1]);
	printf("s2[0]=%d,s2[1]=%d\n", s2[0], s2[1]);
}

输出结果
在这里插入图片描述
/***************************************/

修改后

#include <stdio.h>
void fun (int (*s)[10], int *b, int *n,int mm, int nn)
{
	int i, j;
	for (i = 0; i <mm ;i++)//行下标控制
	{
		for (j = 0; j <nn ;j++)//列下标控制
		{
			b[*n] = *(*(s+i)+j);
			(*n)++;//通过指针返回元素个数
		}
	}
}
void main()
{
  int w[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, i, j;
  int a[100]={0},n=0 ;
  FILE *out;
  printf("The matrix:\n");
  for (i=0; i<3; i++)
    {for (j=0;j<4;j++)  
        printf("%3d",w[i][j]);
     printf("\n");
    }
  fun(w,a,&n,3,4);
  /******************************/
  out=fopen("out.dat","w");
  printf("The A array:\n");
  for(i=0; i<n; i++)  
  {     printf("%3d",a[i]); 
	fprintf(out,"%d ",a[i]);
  }
  printf("\n\n\n\n");
  fclose(out);
  /******************************/
}

关键代码为:

for (i = 0; i <mm/*mm=ROW*/ ;i++)//行下标控制
{
	for (j = 0; j <nn/*nn=COLUMN*/ ;j++)//列下标控制
	{
		b[*n] = *(*(s+i)+j);
		(*n)++;//通过指针返回元素个数
	}

在这里插入图片描述
输出结果为:
在这里插入图片描述

8-2. 按顺序合并成一个新的字符串

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include <stdio.h>
#include <conio.h>
#define M 3
#define N 20
void fun(char a[M][N],char *b)
{
	int i, j,k=0;

	for(i=0;i<M;i++)
		for (j = 0; a[i][j]!='\0'; j++)
			b[k++] = a[i][j];

	b[k] = '\0';
}
void main()
{ 
  FILE *wf;
  char w[M][N]={"AAAA", "BBBBBBB", "CC"},i;
  char a[100]={ " ##############################"};
  printf("The string:\n ");
  for(i=0;i<M;i++) 
     puts(w[i]);
  printf("\n ");
  fun(w,a);
  printf("The A string:\n ");
  printf("%s ",a);
  printf("\n\n ");
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%s",a);
  fclose(wf);
/*****************************/
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

如下代码输出结果为:

void fun(char a[M][N],char *b)
{
	int i, j,k=0;

	for(i=0;i<M;i++)
		for (j = 0; j < N; j++)//区别
			b[k++] = a[i][j];

	b[k] = '\0';
}

在这里插入图片描述

为何会失误呢?

#define N 20
//
char w[M][N]={"AAAA", "BBBBBBB", "CC"},i;

故会遇到结束符’\0’

#include <stdio.h>
void fun(char p1[], char p2[])
{
int i, j,len1,len2;
for (i = 0; p1[i] != 0; i++)
;
for (j = 0; p2[j] != 0; j++)
p1[i++] = p2[j];
p1[i] = 0;
}

void main()
{ char s1[80], s2[40] ;void NONO ();

 printf("Enter s1 and s2:\n") ;
 scanf("%s%s", s1, s2) ;
 printf("s1=%s\n", s1) ;
 printf("s2=%s\n", s2) ;
 printf("Invoke fun(s1,s2):\n") ;
 fun(s1, s2) ;
 printf("After invoking:\n") ;
 printf("%s\n", s1) ;
 NONO() ;

}

void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int i ;
FILE *rf, *wf ;
char s1[80], s2[40] ;

rf = fopen(“in.dat”,“r”) ;
wf = fopen(“out.dat”,“w”) ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, “%s”, s1) ;
fscanf(rf, “%s”, s2) ;
fun(s1, s2) ;
fprintf(wf, “%s\n”, s1) ;
}
fclose(rf) ;
fclose(wf) ;
}

8-3. 按列的顺序依次放到一个字符串中

在这里插入图片描述

雕虫小技

正儿八经

#include<stdio.h>
#define  M  3
#define  N  4
void fun(char (*s)[N],char *b)
{
	int i, j, k=0;
	for (j = 0; j < N; j++)
		for (i = 0; i < M; i++)
			b[k++] = s[i][j];
	b[k] = '\0';
}
void main()
{ 
  FILE *wf;
  char a[100],w[M][N]={{ 'W', 'W', 'W', 'W'},{'S', 'S', 'S', 'S'},{'H', 'H', 'H', 'H'}};
  int i,j;
  printf("The matrix:\n");
  for(i=0;i<M;i++)
     { for(j=0;j<N;j++) 
          printf("%3c",w[i][j]);
       printf("\n");
     }
  fun(w,a);
  printf("The A string:\n");
  puts(a);
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%s",a);
  fclose(wf);
/*****************************/
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

8-4 实现两个字符串的连接

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
void fun(char p1[], char p2[])
{
	int i, j,len1,len2;
	for (i = 0; p1[i] != 0; i++)
		;
		for (j = 0; p2[j] != 0; j++)
			p1[i++] = p2[j];
		p1[i] = 0;
}

void main()
{    char s1[80], s2[40] ;void NONO ();

     printf("Enter s1 and s2:\n") ;
     scanf("%s%s", s1, s2) ;
     printf("s1=%s\n", s1) ;
     printf("s2=%s\n", s2) ;
     printf("Invoke fun(s1,s2):\n") ;
     fun(s1, s2) ;
     printf("After invoking:\n") ;
     printf("%s\n", s1) ;
     NONO() ;
}

void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  int i ;
  FILE *rf, *wf ;
  char s1[80], s2[40] ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", s1) ;
    fscanf(rf, "%s", s2) ;
    fun(s1, s2) ;
    fprintf(wf, "%s\n", s1) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

9【字符串处理】

9-1 将数字字符串转换成与其面值相同的长整型整数 2354210

在这里插入图片描述

#include   <stdio.h>
#include   <string.h>
void NONO();
long  fun( char  *s )
{
	int i,sum=0,len;
	len = strlen(s);
	for (i = 0; i < len; i++)
	{
		sum = sum * 10 + *s-48;
		s++;
	}
	return sum;


}
void main()
{  char  s[10];    long  r;
   printf("请输入一个长度不超过9个字符的数字字符串 :  ");  gets(s);
   r = fun( s );
   printf(" r = %ld\n" , r );
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;  long r;
  char s[10], *p;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s, 10, fp);
    p = strchr(s, '\n');
    if (p) *p = 0;
    r = fun(s);
    fprintf(wf, "%ld\n", r);
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述
学点啥
数字字符串转化为相应的数字,需要ASCII码-48,不知道这个数字也无所谓,可以输入一个数字如1,显示49试出来
在这里插入图片描述

9-2. 数字字符串转换为一个整数

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
#include <string.h>
long  fun ( char *p)
{
	int np=1;//判定正负数
	long rst=0;

	if (*p == '-')
	{
		np = -1;
		p++;
	}
	else if (*p == '+')
		p++;

	while (*p != '\0')
	{
		rst = rst * 10 + *p - '0';
		p++;
	}

	return rst*np;
}

void main()   /* 主函数 */
{ char s[6];void NONO ();
  long    n;
  printf("Enter a string:\n") ;
  gets(s);
  n = fun(s);
  printf("%ld\n",n);
  NONO (  );
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i ;
  char s[20] ;
  long n ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%s", s) ;
    n = fun(s);
    fprintf(wf, "%ld\n", n) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

9-3 比较字符串的长度

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
char  *fun ( char *s,  char *t)
{

}

void main ( )
{ char a[20],b[20];
  void NONO (  );
  printf("Input 1th string:");
  gets( a);
  printf("Input 2th string:");
  gets( b);
  printf("%s\n",fun (a, b));
  NONO ();
}

void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf;
  int i ;
  char a[20], b[20];

  fp = fopen("in.dat","r");
  wf = fopen("out.dat","w");
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%s %s", a, b);
    fprintf(wf, "%s\n", fun(a, b));
  }
  fclose(fp);
  fclose(wf);
}

解答
解答1:

char  *fun ( char *s,  char *t)
{
	return strlen(s) < strlen(t) ? t : s;
}

解答2:

char  *fun ( char *s,  char *t)
{
	int i, j;
	for (i = 0; s[i]; i++);
	for (j = 0; s[j]; j++);
	return i < j ? t : s;
}

难度等级:★★☆☆☆
学点啥

9-4 形参s所指字符串放入形参a所指的字符串中

在这里插入图片描述
难度等级:★★☆☆☆

#include  <stdio.h>
#define    N    20
void NONO();
void  fun( char  *a , char  *s)
{
	int i=0;
	while (*s != '\0')
	{
		*a = *s;
		a++;
		s++;
	}
	*a = '\0';

}

void main()
{  char  s1[N],  *s2="abcdefghijk";
   fun( s1,s2);
   printf("%s\n", s1);
   printf("%s\n", s2);
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i;
  char s1[256], s2[256];

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fgets(s2, 255, fp);
    fun(s1,s2);
    fprintf(wf, "%s", s1);
  }
  fclose(fp) ;
  fclose(wf) ;
}

学点啥
注意程序要求不能使用字符串函数,故应使用指针

10【删除】

10-1.【删除】除了尾部的*号之外,串中其他 号全部删除(删除中间、尾部号)

在这里插入图片描述

#include <stdio.h>
void  fun( char *a, char *p )
{
	int i = 0,j = 0;
	char *pt;
	pt = a;
	/* p之前删除* */
	while(pt<p)
	{
		if (*pt != '*')
		{
			*(a+i) = *pt;
			i++;
		}
		pt++;
	}
	/*p之后不变*/
	while (*(p+j))
	{
		*(a+i) = *(p+j);
		i++;
		p++;
	}
	/*增加结束符*/
	*(a+i) = '\0';

}

void main()
{  char  s[81],*t;
   void NONO (  );
   printf("Enter a string:\n");gets(s);
   t=s;
   while(*t)t++;
   t--;
   while(*t=='*')t--;
   fun( s , t );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81],*t ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    t=s;
    while(*t)t++;
    t--;
    while(*t=='*')t--;
    fun(s,t) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

难度等级:★★☆☆☆
学点啥

使用void fun( char *a)方式参见多种*删除方式

10-2.【删除】除了字符串前导的*号之外,串中其他 号全部删除(删除中间、尾部号)

在这里插入图片描述

#include <stdio.h>
void  fun( char *a )
{
	int i=0;
	/*定义临时指针P,初始指向原串首地址*/
	char *p = a;
	/*利用循环语句把字符串中字母前的*copy到原串*/
	while (*p&&(*p == '*'))
	{
		a[i] = *p;
		i++;
		p++;
	}
	/*继续移动指针
	把串中和串尾的非*号宇符拷贝到原串*/
	while (*p)
	{
		if (*p != '*')
		{
			a[i] = *p;
			i++;
		}
		p++;
	}
	/*修改后的宇符串赋结束宇符_\0_*/
	a[i] = '\0';
}

void main()
{  char  s[81];void NONO ();
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fun(s) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

输出结果
在这里插入图片描述
难度等级:★★★☆☆
学点啥
在这里插入图片描述
函数fun的功能:除了宇符串前导的号之外,将串中其他号全部 删 除 。 解 答 本 题 : ( 1 ) 定 义临 时 指 针P, 初始指向原串首地址 :( 2)利用循环语句把宇符串前导贝到原串(3)继续移动指针,把串中和串尾的非*号宇符拷贝到原串:⑷为修改后 的宇符串赋结束宇符_\0_。
[解题宝典]
要删除宇符串中的指定宇符,我们通常果用保留非指定宇符的 方法。可以将^指定宇符保留在原串,即搏需要保留的宇符从
原串的 起 始 位 置 重 新 赋值:也可以保留到新串,即新建符串,存放要保留的宇符。

10-3.【删除】除了字符串中间的*号之外,串中其他 号全部删除(删除头部、尾部号)

问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为ABCDEFG
思路:(1)按照删除尾部
号思路,在最后一个字母下一位放置结束符\0;(2)按照删除头部*号思路,寻找到第一位字母;(3)因新的结束符放好了,无需多言,完工。

#include <stdio.h>
void  fun( char *a )
{
	//新增
	char *t = a;
	/*遍历,指针a指向\0也即*/
	while (*t != '\0')//while(*t)
		t++;
	/*指针a指向最后一个字母*/
	t--;
	/*指针a指向为*时指针a--,
	直至遇到字母也即非*为止.
	指针t指向字符串中最后字符*/
	while (*t == '*')
		t--;
	/*字符串后移一位,加上结束标志符*/
	*(t + 1) = '\0';
	//
	int i = 0;
	/*定义临时指针P,初始指向原串首地址*/
	char *p = a;
	/*遍历,直至找到第一个字母.
	指针f指向字符串中第一个字符*/
	while (*p == '*')
		p++;
	/*继续移动指针,字符拷贝到原串
	直至遇到结束字符\0*/
	while (*p)
	{
		if (*p != '\0')
		{
			a[i] = *p;
			i++;
		}
		p++;
	}
}

void main()
{  char  s[81];void NONO ();
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fun(s) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}


在这里插入图片描述

10-4.【删除】将字符串头部的*号全部删除,保留其他

问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为ABCDEF*G********
在这里插入图片描述

#include <stdio.h>
void  fun( char *a )
{
	int i = 0;
	/*定义临时指针P,初始指向原串首地址*/
	char *p = a;
	/*遍历,直至找到第一个字母*/
	while (*p && (*p == '*'))
		p++;

	/*继续移动指针,字符拷贝到原串
	直至遇到结束字符\0*/
	while (*p)
	{
		if (*p != '\0')
		{
			a[i] = *p;
			i++;
		}
		p++;
	}
}

void main()
{  char  s[81];void NONO ();
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fun(s) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

输出结果
在这里插入图片描述
难度等级:★☆☆☆☆
学点啥
思路2:

void  fun(char *a)
{
	char *p = a;
	while (*p == '*')//p指向第一个字母
		p++;
	for (; *p != '\0'; p++.a++)//第一各字母后字符放入
		*a = *p;
	*a = '\0';
}

思路3:

void  fun(char *a)
{
	char *p = a;
	while (*p == '*')//p指向第一个字母
		p++;
	strcpy(a, p);
}
char a[10],b[]={"COPY"};
//定义字符数组a,b
strcpy(a,b);
//将b中的COPY复制到a中

10-5.【删除】将字符串尾部的*号全部删除,保留其他

问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为*ABCDEFG

#include <stdio.h>
void  fun( char *a )
{
	/*遍历,指针a指向\0也即*/
	while (*a != '\0')
		a++;
	/*指针a指向最后一个字母*/
	a--;
	/*指针a指向为*时指针a--,
	直至遇到字母也即非*为止*/
	while (*a == '*')
		a--;
	/*字符串后移一位,加上结束标志符*/
	*(a + 1) = '\0';

}

void main()
{  char  s[81];void NONO ();
   printf("Enter a string:\n");gets(s);
   fun( s );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fun(s) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}


输出结果
在这里插入图片描述
难度等级:★★★☆☆
学点啥
‘\0’ 是字符串的结束符,任何字符串之后都会自动加上’\0’。如果字符串末尾少了‘\0’转义字符,则其在输出时可能会出现乱码问题。
‘\0’转义字符在ASCII表中并不表示阿拉伯数字0,阿拉伯数字0的ASCII码为48,‘\0’转义字符的ASCII码值为0,它表示的是ASCII控制字符中空字符的含义。
**思路:**将字符串尾部*号删除,如下图,指针首先增加至\0(20),再往回走,遇到字母(17)后,将(18)放置\0即可。
在这里插入图片描述

void  fun( char *a )
{
	/*遍历,指针a指向\0也即*/
	while (*a != '\0')
		a++;
	/*指针a指向最后一个字母*/
	a--;
	/*指针a指向为*时指针a--,
	直至遇到字母也即非*为止*/
	while (*a == '*')
		a--;
	/*字符串后移一位,加上结束标志符*/
	*(a + 1) = '\0';

}

10-6.【删除】将字符串中的*号删除,保留其他

转载[https://blog.csdn.net/qq_36955347/article/details/73511589(https://blog.csdn.net/qq_36955347/article/details/73511589)
问题:假设输入的字符串为ABCDEFG****,删除串中的号后,字符串变为****ABDEFG********

设置两个指向字符的指针变量t和f。先使用循环语句让t指针指向字符串中最后一个字符,而f指针指向字符串中第一个字符;再判断t和f指向的字符是否为“”,如果为“”,则t指针自减,f指针自增,直到遇到第一个不是的字符为止。

再定义一个函数fun()用于删除字符串中的“”号,同时保留字符串前后的“”号。

#include <stdio.h>
int fun(char *a, char *h, char *p)
{
    int i, j;
    /*删除指针h与p之间的所有“*”*/
    for(i=0,j=0; &h[i]<p; i++)
        if(h[i]!='*')
            h[j++]=h[i];
    /*将指针p至字符串尾部的所有字符前移*/
    for(i=0; p[i]; i++,j++)
        h[j]=p[i];
    h[j]='\0';  /*在字符串尾部添加结束标志*/
    return 0;
}
int main( )
{
    char s[81], *t, *f;
    printf("Enter a string :\n");
    gets(s);  /*输入字符串*/
    t=f=s;  /*用字符指针t、f指向串s*/
   
    while(*t)
        t++;
    t--;  /*将指针t定位到字符串中最后一个字符*/
    while(*t == '*')  /*指针t指向字符串中最后一个字符*/
        t--;
    while (*f == '*')  /*指针f指向字符串中第一个字符*/
        f++;
    fun(s, f, t);
    printf("The string after deleted:\n");  /*输出结果*/
    puts(s);
    return 0;
}

输出结果
在这里插入图片描述
难度等级:★★★★☆

学点啥
参考上述,自写函数如下:

void StarDelM(char *a)   //010
{
	char *f, *t;
	f = t = a;
	while (*t)
		t++;
	t--;  /*将指针t定位到字符串中最后一个字符*/
	while (*t == '*')  /*指针t指向字符串中最后一个字符*/
		t--;
	while (*f == '*')  /*指针f指向字符串中第一个字符*/
		f++;

	int i, j;
		/*删除指针f与t之间的所有“*”*/
	for (i = 0,j = 0; f + i < t; i++)
		if (*(f + i) != '*')
		{
			*(f + j) = *(f + i);//
			j++;
		}
	/*将指针t至字符串尾部的所有字符前移*/
	for (i = 0; *(t + i); i++, j++)
		*(f + j) = *(t + i);
	*(f + j) = '\0';  /*在字符串尾部添加结束标志*/
}

10-7.【删除】使字符串中间部的*号不多于n个

在这里插入图片描述
思路
(1)指针t++,找到结束符\0,回溯并计个数k;
(2)比较
个数k与要求值n,若k大,则只保留n个*;否则无需操作

#include <stdio.h>
void  fun( char *a,int  n )
{
	int i = 0,k = 0;
	char *p,*t;
	p = t = a;
	while (*t)
		t++;
	t--;
	while (*t == '*')
	{
		t--;//指针-1
		k++;//计数+1
	}

	if (k > n)
	{
		while (/*p&&*/p < t + n + 1)
		{
			*(a+i) = *p;
			i++;
			p++;
		}
		*(a + i) = '\0';
	}

}

void main()
{  char  s[81];  int  n;
   void NONO (  );
   printf("Enter a string:\n");gets(s);
   printf("Enter n :  ");scanf("%d",&n);
   fun( s,n );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i, n ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fscanf(in, "%d", &n) ;
    fun(s,n) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

输出结果
在这里插入图片描述
难度等级:★★★☆☆
学点啥

10-8. 【删除】使字符串前导*号不多于n个

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
void  fun( char *a, int  n )
{
	int i = 0, k = 0;
	char *p, *f;
	p = f = a;
	/*统计前导*个数*/
	while (*f == '*')
	{
		k++;
		f++;
	}
	/*k大于n,则使p前导保留n个*
	例:*****ABC若n=2,p指向*(p+5-2)
	*/
	if (k > n)
	{
		for (; *p; i++, p++)
			a[i] = *(p + k - n);
	}
	a[i] = 0;
}

void main()
{  char  s[81];  int  n;void NONO ();
   printf("Enter a string:\n");gets(s);
   printf("Enter n :  ");scanf("%d",&n);
   fun( s,n );
   printf("The string after deleted:\n");puts(s);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i, n ; char s[81] ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(in, "%s", s) ;
    fscanf(in, "%d", &n) ;
    fun(s,n) ;
    fprintf(out, "%s\n", s) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

10-9.【删除】删除一维数组中所有相同的数

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#define N 80
int fun(int a[], int n)
{
	int i = 1, j = 1;

	for (i = 1; i < n; i++)
	{
		if (a[j-1] != a[i])
			a[j++] = a[i];
	}
	return j;
}
void main()
{ 
  FILE *wf;
  int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10}, i, n=20;
  printf("The original data :\n");
  for(i=0; i<n; i++)  
     printf("%3d",a[i]);
  n=fun(a,n);
  printf("\n\nThe data after deleted :\n");
  for(i=0; i<n; i++)  
     printf("%3d",a[i]);  
  printf("\n\n");
/******************************/
  wf=fopen("out.dat","w");
  for(i=0; i<n; i++)  
     fprintf(wf,"%3d",a[i]);
  fclose(wf);
/*****************************/
}

难度等级:★★★★★☆☆☆☆
学点啥
在这里插入图片描述

10-10.【删除】删除一个字符串中指定下标的字符

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define LEN 20

void fun (char a[], char b[], int n)
{
	int i = 0, j = 0;
	for(; *(a + i);i++)
		if (i != n)
			b[j++] = a[i];
	//*(b + j) = '\0';//结束标识 方法1
	//b[j] = '\0';//结束标识 方法2
	b[j] = 0;//结束标识 方法2
}

void main( )
{   char str1[LEN], str2[LEN] ;
    int n ;
    void NONO (  );

    printf("Enter the string:\n") ;
    gets(str1) ;
    printf("Enter the position of the string deleted:") ;
    scanf("%d", &n) ;
    fun(str1, str2, n) ;
    printf("The new string is: %s\n", str2) ;
    NONO() ;
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  char str1[LEN], str2[LEN] ;
  int i, n ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s %d", str1, &n) ;
    fun(str1, str2, n) ;
    fprintf(wf, "%s\n", str2) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

输出结果
难度等级:★★★★★☆☆☆☆
学点啥

10-11【删除】删除字符串中所有空格

在这里插入图片描述
雕虫小技
结合函数功能以及main函数,可得只需修改

  `char Msg[]="Input a string:";
  //
   fun(Msg);
  fprintf(out,"%s",Msg);

即可

void main()
{
  char str[81];
  char Msg[]="Input a string:";
  int n;
  FILE *out;
  printf(Msg);
  gets(str);
  puts(str);
  fun(str); 
  printf("*** str: %s\n",str); 
  /******************************/
  out=fopen("out.dat","w");
  fun(Msg);
  fprintf(out,"%s",Msg);
  fclose(out);
  /******************************/
}

输出结果
step1: 打开程序>直接运行(F5快捷键);
在这里插入图片描述
step2:随便输入,关闭之
在这里插入图片描述
step3:按照格式修改out.dat文件并保存;注意找main函数中最后一次调用函数对应的部分:
在这里插入图片描述

step4:
case 考场:本题做完了;break;
case 模拟;交卷体验下满分快感;break;
在这里插入图片描述
正儿八经

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
void fun (char *str)
{
	int i = 0;
	char *p = str;
	
	for (;*p;p++)
	{
		if (*p != ' ')
			str[i++] = *p;
	}
	*(str + i) = '\0';
}
void main()
{
  char str[81];
  char Msg[]="Input a string:";
  int n;
  FILE *out;
  printf(Msg);
  gets(str);
  puts(str);
  fun(str); 
  printf("*** str: %s\n",str); 
  /******************************/
  out=fopen("out.dat","w");
  fun(Msg);
  fprintf(out,"%s",Msg);
  fclose(out);
  /******************************/
}

输出结果
难度等级:★☆☆☆☆
学点啥
类似删除*号题目,不要错误认为不可以再用’\0’判定结尾
实际上空格与结束符的ASCII码不同,回车、换行、空格的ASCII码值—(附ASCII码表)
回车、换行、空格的ASCII码值
回车,ASCII码13
换行,ASCII码10
空格,ASCII码32

A,ASCII码65
a,ASCII码97
中间差一个空格 ASCII码32
结束符’\0’ASCII码0

而’\0’为结束符,其ASCII码表为0,也正因为此,输入结束符可以使用*(str + i) = '\0';//*(str + i) = 0;均可

10-12【删除】从字符串中删除指定的字符

在这里插入图片描述

#include <string.h>
#include <stdio.h>
void fun( char s[],int c)
{
  
}
void main()
{
  static char str[]="turbo c and borland c++";
  char ch;
  FILE *out;
  printf ("原始字符串:%s\n ",str);
  printf("输入一个字符串:\n");
  scanf("%c",&ch);
  fun(str,ch);
  printf("str[]=%s\n",str);
  strcpy(str,"turbo c and borland c++");
  fun(str,'a');
  /******************************/
  out=fopen("out.dat","w");
  fprintf(out,"%s",str);
  fclose(out);
  /******************************/
}

雕虫小技
注意到
在这里插入图片描述
以及 fun(str,‘a’);
可知 只需将out.dat文件中a消除即可
修改前
在这里插入图片描述
修改后
在这里插入图片描述
在这里插入图片描述

#include <string.h>
#include <stdio.h>
void fun( char s[],int c)
{
	int i = 0;
	char *p;
	p = s;

	while (*p)
	{
		if (*p != c) 
		{
			s[i++] = *p;//不同指向直接输出
		}
		p++;//相同指向下一个字符
	}
	s[i] = '\0';
}
void main()
{
  static char str[]="turbo c and borland c++";
  char ch;
  FILE *out;
  printf ("原始字符串:%s\n ",str);
  printf("输入一个字符串:\n");
  scanf("%c",&ch);
  fun(str,ch);
  printf("str[]=%s\n",str);
  strcpy(str,"turbo c and borland c++");
  fun(str,'a');
  /******************************/
  out=fopen("out.dat","w");
  fprintf(out,"%s",str);
  fclose(out);
  /******************************/
}

输出结果
在这里插入图片描述
在这里插入图片描述
难度等级:★☆☆☆☆
学点啥

11【胜者为王 吃肉 败者为寇 渣都没得】

11-1.数组中的最小值或最大值,并与其第1个元素交换

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{

}

void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}

尝试1:

void fun (int *dp,int n,int upordown)
{
	int i, j, temp;

	switch (upordown) 
	{
	case 0:
		for (i = 0; i < n; i++)
		{
			if (*dp < *(dp + i))
			{
				temp = *dp;
				*dp = *(dp + i);
				*(dp + i) = temp;
			}
		}
		break;
	case 1:
		for (i = 0; i < n; i++)
		{
			if (*dp < *(dp + i))
			{
				temp = *dp;
				*dp = *(dp + i);
				*(dp + i) = temp;
			}
		}
		break;
	}
}

错误原因:尝试使用冒泡法思路,错误理解题意。

**思路:**遍历数组,找到最值的下标(upordown==0时找最小值,upordown=1时找最大值);然后与下标为0的元素交换(与冒泡法相比,仅交换一次)

void fun (int *dp,int n,int upordown)
{
	int temp, index = 0, i;
	switch (upordown)
	{
	case 0:
		for (i = 0; i < n; i++)
		{
			if (dp[index] > dp[i])
				index = i;
		};
		break;
	case 1:
		for (i = 0; i < n; i++)
		{
			if (dp[index] < dp[i])
				index = i;
		};
		break;
	default: break;
	}
	
	temp = dp[index];
	dp[index] = dp[0];
	dp[0] = temp;
	
}

输出结果
在这里插入图片描述
优化
1、index初值为0,i大可不必从0开始,dp[0]>dp[0]必为false;从1 开始即可。
2、增设如下代码,若index为0,不必交换

if (index != 0)
{
	temp = dp[index];
	dp[index] = dp[0];
	dp[0] = temp;
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{
	int temp, index = 0, i;
	switch (upordown)
	{
	case 0:
		for (i = 1; i < n; i++)
		{
			if (dp[index] > dp[i])
				index = i;
		};
		break;
	case 1:
		for (i = 1; i < n; i++)
		{
			if (dp[index] < dp[i])
				index = i;
		};
		break;
	default: break;
	}

	if (index != 0)
	{
		temp = dp[index];
		dp[index] = dp[0];
		dp[0] = temp;
	}
}

void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}

在这里插入图片描述

11-2 整数中找出最大值和最小值

在这里插入图片描述
雕虫小技

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
     fun(&a,&b,&c,&d); 
     fprintf(wf, "a=%d,d=%d\n", a, d);
  }
  fclose(fp) ;
  fclose(wf) ;
}

F5运行、打开、手动out.dat
在这里插入图片描述
在这里插入图片描述

正儿八经

#include   <stdio.h>
void NONO();
void  fun(int  *a, int  *b, int  *c, int  *d)
{
	int max=*a, min=*a;

	if (max < *b)
		max = *b;
	if (min > *b)
		min = *b;

	if (max < *c)
		max = *c;
	if (min > *c)
		min = *c;

	if (max < *d)
		max = *d;
	if (min > *d)
		min = *d;

	*a = max;
	*d = min;
}
void main()
{  int  a, b, c, d;
   printf("请输入4个整数:    ");  scanf("%d%d%d%d", &a,&b,&c,&d);
   printf("原始顺序:    %d,%d,%d,%d\n", a, b, c, d);
   fun(&a,&b,&c,&d); 
   printf("处理后:      %d,%d,%d,%d\n", a, b, c, d);
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, a, b, c, d ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<5; i++ )
  {
     fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);
     fun(&a,&b,&c,&d); 
     fprintf(wf, "a=%d,d=%d\n", a, d);
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述

难度等级:★☆☆☆☆
学点啥
优化

void  fun(int  *a, int  *b, int  *c, int  *d)
{
	int max=*a, min=*a;

	max = *a > *b ? *a : *b;
	max = max > *c ? max : *c;
	max = max > *d ? max : *d;

	min = *a > *b ? *b : *a;
	min = min > *c ? *c : min;
	min = min > *d ? *d : min;

	*a = max;
	*d = min;
}

函数这么写能保证ad位置正确,但是bc数据有误
在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

11-3 找出最长的一个字符串

在这里插入图片描述
雕虫小技
在这里插入图片描述

正儿八经

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

char *fun(char (*a)[81], int num, char *max)
{

}
void main()
{
  FILE *wf;
  char ss[10][81],*ps=NULL;
  char s[3][81]={"abcd","deg","diegns"},*p=NULL;
  int  i=0,n;
  system("CLS");
  printf("输入若干个字符串:");
  gets(ss[i]);
  puts(ss[i]);
  while(!strcmp(ss[i], "****")==0)  /*用4个星号作为结束输入的标志*/
     {
      i++;
      gets(ss[i]);
      puts(ss[i]);
     }
  n=i;
  ps=fun(ss,n,ps);
  printf("\nmax=%s\n",ps);
/******************************/
  wf=fopen("out.dat","w");
  p=fun(s,3,p);
  fprintf(wf,"%s",p);
  fclose(wf);
/*****************************/
}

编写:

char *fun(char (*a)[81], int num, char *max)
{
	int i = 0;
	max = a[0];
	for (i = 0; i < num; i++)
	{
		if (strlen(max) < strlen(a[i]))
			max = a[i];
	}
	return max;
}

难度等级:★☆☆☆☆
学点啥

11-4 求出数组的最大元素在数组中的下标

在这里插入图片描述
雕虫小技

正儿八经

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int fun(int *s,int t,int *k)
{
	int i;
	*k = 0;

	for (i = 0; i < t; i++)
		if (s[*k] < s[i])
			*k=i;

	return s[*k];
}
void main()
{
  FILE *wf;
  int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;
  system("CLS");
  fun(a, 10, &k);
  printf("%d, %d\n ", k, a[k]);
/******************************/
  wf=fopen("out.dat","w");
  fprintf (wf,"%d, %d", k, a[k]);
  fclose(wf);
/*****************************/
}

难度等级:★★★★★☆☆☆☆
学点啥

11-5.最大的值及其所在的下标

在这里插入图片描述
雕虫小技
在这里插入图片描述

正儿八经

#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void fun(int a[],int n, int *max, int *d)
{
	int i;
	*max = a[0];

	for (i = 0; i < n; i++)
	{
		if (*max < a[i])
		{
			*max = a[i];
			*d = i;
		}
	}

}
void main()
{ 
  FILE *wf;
  int i, x[20], max,  index, n=10;
  int y[20]={4,2,6,8,11,5};
  srand((unsigned)time(NULL));
  for(i=0;i<n;i++)
    {
     x[i]=rand()%50; 
     printf("%4d",x[i]);    /*输出一个随机数组*/
    }
  printf("\n");
  fun(x,n,&max,&index);
  printf("Max=%5d,Index=%4d\n",max,index);
/******************************/
  wf=fopen("out.dat","w");
  fun(y,6,&max,&index);
  fprintf(wf,"Max=%5d,Index=%4d",max,index);
  fclose(wf);
/*****************************/
}

难度等级:★★★★★☆☆☆☆
学点啥

11-6. 找出dp所指数组中的最小或最大值

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{
	int i, temp, index=0;

	if (n == 0) return;

	for (i = 1; i < n; i++)
	{
		if ((upordown == 0 && dp[i]<dp[index]) || (upordown == 1 && dp[i] > dp[index]))
			/*if (upordown == 0 && dp[i] < dp[index] || upordown == 1 && dp[i] > dp[index])
			  C语言中逻辑运算符“与”“或”“非”优先级:非>与>或
			*/
			index = i;//index存储目标元素
	}
	if (index != 0)
	{
		temp = dp[index];
		dp[index] = dp[0];
		dp[0] = temp;
	}
}


void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}

在这里插入图片描述

难度等级:★★☆☆☆
学点啥
C语言中逻辑运算符“与”“或”“非”优先级是怎样的?非>与>或

单目运算符和双目运算符以及三目运算符

12 【教务处】

12-1 【教务处】高于等于平均分的学生数据

在这里插入图片描述
尝试1

double  fun( STREC  *a, STREC *b, int *n )
{
	double ave = 0.0;
	int i, j = 0, len;
	*n = 0;

	/*find average*/
	for (i=0;i<N;i++)
	{
		ave +=a[i].s/N;
	}
	/*store higher grade*/
	for (i = 0; i < N; i++)
	{
		if (a[i].s>ave)
		{
			b[j++] = a[i];
			(*n)++;
		}
	}
	return ave;
}

输出结果
在这里插入图片描述
优化

#include <stdio.h>
#define   N   12
typedef  struct
{  char  num[10];
   double  s;
} STREC;
double  fun( STREC  *a, STREC *b, int *n )
{
	double ave = 0.0;
	int i;
	*n = 0;

	/*find average*/
	for (i=0;i<N;i++)
	{
		ave +=a[i].s/N;
	}
	/*store higher grade*/
	for (i = 0; i < N; i++)
	{
		if (a[i].s>ave)
		{
			b[(*n)++] = a[i];
		}
	}
	return ave;
}

void main()
{  STREC  s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
		{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
		{"GA09",60},{"GA11",79},{"GA12",73},{"GA10",90}};
   STREC  h[N], t;FILE *out ;
   int  i,j,n;  double  ave;
   ave=fun( s,h,&n );
   printf("The %d student data which is higher than %7.3f:\n",n,ave);
   for(i=0;i<n; i++)
     printf("%s  %4.1f\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   fprintf(out, "%d\n%7.3f\n", n, ave);
   for(i=0;i<n-1;i++)
     for(j=i+1;j<n;j++)
       if(h[i].s<h[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;}
   for(i=0;i<n; i++)
     fprintf(out,"%4.1f\n",h[i].s);
   fclose(out);
}

输出结果
在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

12-2 【教务处】将低于平均分的人数作为函数值返回(数组)

在这里插入图片描述

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int score[],int m, int below[])
{
	float Ave = 0.0; 
	int i,j = 0;
	for (i=0;i<m;i++)
	{
		Ave += score[i]/m;
	}
	for (i = 0; i < m; i++)
	{
		if (score[i] < Ave)
		{
			below[j++] = score[i];
		}
	}
	return j;
}
void main()
{
  FILE *wf;
  int i, n, below[9];
  int score[9]={10,20,30,40,50,60,70,80,90};
  system("CLS");
  n=fun(score, 9, below);
  printf("\nBelow the average score are: ");
  for(i=0;i<n;i++)  
     printf("%d ",below[i]);
/******************************/
  wf=fopen("out.dat","w");
  for(i=0;i<n;i++)  
     fprintf(wf,"%d ",below[i]);
  fclose(wf);
/*****************************/
}

学点啥

12-3【教务处】【排序】【冒泡法】按分数降序排列

在这里插入图片描述

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
void  fun( STREC  a[] )
{
	int i,j,len;
	STREC temp;;
	for (i=0;i<N;i++)
	{
		for (j = 0; j < N-1; j++)
		{
			if (a[j].s < a[j + 1].s)
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j + 1] = temp;
			}		
		}
	}
}

void main()
{  STREC  s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
		{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};
   int  i;FILE *out ;
   fun( s );
   printf("The data after sorted :\n");
   for(i=0;i<N; i++)
   {  if( (i)%4==0 )printf("\n");
      printf("%s  %4d  ",s[i].num,s[i].s);
   }
   printf("\n");
   out = fopen("out.dat","w") ;
   for(i=0;i<N; i++)
   {  if( (i)%4==0 && i) fprintf(out, "\n");
      fprintf(out, "%4d  ",s[i].s);
   }
   fprintf(out,"\n");
   fclose(out) ;
}

输出结果
在这里插入图片描述

难度等级:★★★☆☆
学点啥
经典的冒泡法:双层循环+if判断,外层循环控制比较轮数,内层循环控制两两比较。

for (j = 0; j < N-1; j++)
{
	if (a[j].s < a[j + 1].s)
	{
		temp = a[j];
		a[j] = a[j+1];
		a[j + 1] = temp;
	}		
}

从头到尾比较:1轮结束后,最值在最后,2轮结束后,次最值(倒数第2最值)在倒数第2…i轮结束后,倒数第i最值在倒数第i,注意第i轮比较只需要比较到N-i-1即可。

if (a[j].s < a[j + 1].s)//冒泡后,最小值在最后
//if (a[j].s > a[j + 1].s)//冒泡后,最大值在最后

最大值在后,排序结果
在这里插入图片描述

在这里插入代码片

输出结果
难度等级:★★★★★☆☆☆☆
学点啥

12-4【教务处】 低于平均分的学生数据

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#define   N   8
typedef  struct
{  char  num[10];
   double  s;
} STREC;
double  fun( STREC  *a, STREC *b, int *n )
{
	int i;
	double ave = 0.0;
	*n = 0;

	for (i = 0; i < 8; i++)
		ave += a[i].s / 8;

	for (i = 0; i < 8; i++)
	{
		if (a[i].s <ave)
			b[(*n)++] = a[i];
	}

	return ave;
}

void main()
{  STREC  s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
                {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}};
   STREC  h[N],t;FILE *out ;
   int  i,j,n;  double  ave;
   ave=fun( s,h,&n );
   printf("The %d student data which is lower than %7.3f:\n",n,ave);
   for(i=0;i<n; i++)
     printf("%s  %4.1f\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   fprintf(out, "%d\n%7.3f\n", n, ave);
   for(i=0;i<n-1;i++)
     for(j=i+1;j<n;j++)
       if(h[i].s>h[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;}
   for(i=0;i<n; i++)
     fprintf(out,"%4.1f\n",h[i].s);
   fclose(out);
}


在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

12-5【教务处】找出成绩最低的学生记录,通过形参返回主函数

在这里插入图片描述

雕虫小技
在这里插入图片描述
在这里插入图片描述

正儿八经
题目:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss
{ char num[10]; 
  int s;
} STU;
void fun(STU a[], STU *s)
{
  
}
void main()
{ 
  FILE *wf;
  STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
  { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
  int i;
  system("CLS");
  printf("*****The original data*****\n");
  for(i=0;i<N;i++) 
    printf("No=%s Mark=%d\n", a[i].num,a[i].s);
  fun(a,&m);
  printf("*****THE RESULT*****\n");
  printf("The lowest :%s, %d\n",m.num,m.s);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%s, %d",m.num,m.s);
  fclose(wf);
/*****************************/
}

解答:

void fun(STU a[], STU *s)
{
	int i,k=0,min;
	*s = a[0];

	for (i = 0; i < N; i++)
	{
		if (a[i].s < s->s)
			*s = a[i];
	}
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

指向结构体成员运算符 : (->) 从外部看是包含了一个解指针(*)所以要对指针进行操作

例如:

typedef struct
{
	int data[];
	int length;
}Sqlist;

Sqlist *L;
L->lenth; //得到L中length的值

结构体成员运算符 : ( . )直接调用结构体中的某个成员

例如:

typedef struct

{
	int data[];
	int length;
}Sqlist;

Sqlist L;
L.length; //直接调用L中length的值
L.data[];

12-6 【教务处】函数返回分数最低的学生人数

在这里插入图片描述

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
int  fun( STREC  *a, STREC *b )
{
	int i, j = 0, min = a[0].s;
	for (i=0; i < N; i++)
	{
		if (min > a[i].s)
			min = a[i].s;
	}

	for (i = 0; i < N; i++)
	{
		if (min == a[i].s)
			b[j++] = a[i];
	}
	return j;
}

void main()
{  STREC  s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
		{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
   STREC  h[N];
   int  i,n;FILE *out ;
   n=fun( s,h );
   printf("The %d lowest score :\n",n);
   for(i=0;i<n; i++)
     printf("%s  %4d\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   fprintf(out, "%d\n",n);
   for(i=0;i<n; i++)
     fprintf(out, "%4d\n",h[i].s);
   fclose(out);
}


学点啥

第一次循环,遍历,求出最低分数;
第二次循环,遍历,求出最小分数人数并将其存入。

12-7 【教务处】去掉一个最高分和一个最低分,然后求平均值 8.6875

在这里插入图片描述
雕虫小技

正儿八经

#include  <stdio.h>
void NONO();
double fun(double  a[ ] , int  n)
{
	int i; 
	double max = a[0], min = a[0], sum = 0.0;
	for (i = 0; i < n; i++)//find sum
		sum += a[i];
	for (i = 1; i < n; i++)//find max,min
	{
		max = max > a[i] ? max : a[i];
		min = min < a[i] ? min : a[i];
	}
	return (double)(sum - max - min) / (n - 2);
	



}

void main()
{  double  b[10],  r;    int  i;
    printf("输入10个分数放入b数组中 :  ");
    for (i=0; i<10; i++)   scanf("%lf",&b[i]);
    printf("输入的10个分数是 :  ");
    for (i=0; i<10; i++)   printf("%4.1lf ",b[i]);    printf("\n");
    r = fun(b, 10);
    printf("去掉最高分和最低分后的平均分 :  %f\n", r );
    NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j ;
  double b[10], r ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j = 0 ; j < 10 ; j++) {
      fscanf(fp, "%lf ", &b[j]) ;
    }
    r = fun(b, 10) ;
    fprintf(wf, "%f\n", r) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


在这里插入图片描述
优化

double fun(double  a[ ] , int  n)
{
	int i; 
	double max = a[0], min = a[0], sum = 0.0;

	for (i = 0; i < n; i++)//find max,min
	{
		sum += a[i];
		max = max > a[i] ? max : a[i];
		min = min < a[i] ? min : a[i];
	}
	return (double)(sum - max - min) / (n - 2);
}

难度等级:★☆☆☆☆
学点啥

12-8【教务处】指定分数范围内

在这里插入图片描述
雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
int  fun( STREC  *a,STREC *b,int l, int h )
{
	int i,j=0;
	for(i=0;i<N;i++)
		if (l <= a[i].s <= h)
			b[j++] = a[i];
	return j;
}

void main()
{  STREC  s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
                {"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},
                {"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},
                {"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};
   STREC  h[N],tt;FILE *out ;
   int  i,j,n,low,heigh,t;
   printf("Enter 2 integer number low & heigh :  ");
   scanf("%d%d", &low,&heigh);
   if ( heigh< low ){ t=heigh;heigh=low;low=t; }
   n=fun( s,h,low,heigh );
   printf("The student's data between %d--%d :\n",low,heigh);
   for(i=0;i<n; i++)
     printf("%s  %4d\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   n=fun( s,h,80,98 );
   fprintf(out,"%d\n",n);
   for(i=0;i<n-1;i++)
     for(j=i+1;j<n;j++)
       if(h[i].s>h[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;}
   for(i=0;i<n; i++)
     fprintf(out,"%4d\n",h[i].s);
   fprintf(out,"\n");
   fclose(out);
}

难度等级:★☆☆☆☆
学点啥

12-9 【教务处】N名学生的成绩已在主函数中放入一个带头结点的链表结构中78.625

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define   N   8
struct  slist
{  double   s;
   struct slist  *next;
};
typedef  struct slist  STREC;
double  fun( STREC *h  )
{
	double ave = 0.0;
	STREC *p = h->next;
	while (p != NULL)
	{
		ave += p->s;
		p = p->next;
	}
	return ave / N;
}

STREC * creat( double *s)
{ STREC  *h,*p,*q;   int  i=0;
  h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
  while(i<N)
  { q=(STREC*)malloc(sizeof(STREC));
    q->s=s[i]; i++;  p->next=q; p=q;
  }
  p->next=0;
  return  h;
}
void outlist( STREC *h)
{ STREC  *p;
  p=h->next; printf("head");
  do
  { printf("->%4.1f",p->s);p=p->next;}
  while(p!=0);
  printf("\n\n");
}
void main()
{  double  s[N]={85,76,69,85,91,72,64,87},ave;
   void NONO (  );
   STREC  *h;
   h=creat( s );   outlist(h);
   ave=fun( h );
   printf("ave= %6.3f\n",ave);
   NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i,j ; double  s[N],ave;
  STREC *h ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
    h=creat( s );
    ave=fun( h );
    fprintf(out, "%6.3lf\n", ave) ;    
  }
  fclose(in) ;
  fclose(out) ;
}

学点啥
使用循环语句遍历链表,求出求各结点数据域中数值的和。遍历链表定义一个指向结点的指针p,“头结点”无数值,让p指向“头结点”的笑一个结点,使用语句STREC *p=h->next

12-10【教务处】找出成绩最高的学生记录

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss    /*定义结构体*/
{ char num[10]; 
  int s;
} STU;
void fun(STU a[], STU *s)
{
	int i;
	*s = a[0];

	for (i = 0; i < N; i++)
	{
		if (s->s < a[i].s)
			*s = a[i];
	}
}
void main()
{ 
  FILE *wf;
  STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
  { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
  int i;
  system("CLS");
  printf("*****The original data*****");
  for(i=0;i<N;i++) 
     printf("No=%s Mark=%d\n", a[i].num,a[i].s);
  fun(a,&m);
  printf("*****THE RESULT*****\n");
  printf("The top :%s, %d\n",m.num,m.s);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%s,%d",m.num,m.s);
  fclose(wf);
/*****************************/
}

难度等级:★★☆☆☆
学点啥

12-11【教务处】学生的平均分78.875

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#define   N   8
typedef  struct
{  char  num[10];
   double  s[N];
   double  ave;
} STREC;

void  fun(STREC *a)
{
	int i;
	a->ave = 0.0;

	for (i = 0; i < N; i++)
		a->ave += a->s[i];//(*a).ave += (*a).s[i];

	a->ave /= N;
}

void main()
{  STREC  s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
   int  i;
   void NONO (  );
   fun( &s );
   printf("The %s's student data:\n", s.num);
   for(i=0;i<N; i++)
     printf("%4.1f\n",s.s[i]);
   printf("\nave=%7.3f\n",s.ave);
   NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *out ;
  int i,j ; STREC s[10] = {
  {"GA005",85.5,76,69.5,85,91,72,64.5,87.5},
  {"GA001",82.5,66,76.5,76,89,76,46.5,78.5},
  {"GA002",72.5,56,66.5,66,79,68,46.5,58.5},
  {"GA003",92.5,76,86.5,86,99,86,56.5,88.5},
  {"GA004",82,66.5,46.5,56,76,75,76.5,63.5},
  {"GA006",75.5,74,71.5,85,81,79,64.5,71.5},
  {"GA007",92.5,61,72.5,84,79,75,66.5,72.5},
  {"GA008",72.5,86,73.5,80,69,63,76.5,53.5},
  {"GA009",66.5,71,74.5,70,61,82,86.5,58.5},
  {"GA010",76,66.5,75.5,60,76,71,96.5,93.5},
};
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fun(&s[i]) ;
    fprintf(out, "%7.3f\n", s[i].ave) ;
  }
  fclose(out) ;
}

难度等级:★★★★★☆☆☆☆
学点啥
C语言–“.”与“->”有什么区别?
(*a).b 等价于 a->b。

"."一般情况下读作"的”。

“->”一般读作"指向的结构体的"。

12-12 【教务处】n门课程的平均分71.08

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
float  fun ( float  *a ,  int  n )
{
	int i;
	double sum = 0.0;

	for (i = 0; i < n; i++)
		sum += a[i];

	return sum / n;
}

void main()
{ float score[30]={90.5, 72, 80, 61.5, 55}, aver;
  void NONO (  );
  aver = fun( score, 5 );
  printf( "\nAverage score  is: %5.2f\n", aver);
  NONO ( );
}

void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j ;
  float aver, score[5] ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j = 0 ; j < 5 ; j++) fscanf(fp,"%f,",&score[j]) ;
    aver = fun(score, 5) ;
    fprintf(wf, "%5.2f\n", aver) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


难度等级:★★★★★☆☆☆☆
学点啥

12-13【教务处】把分数最高的学生数据

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
int  fun( STREC  *a, STREC *b )
{
	int i, j = 0, max = a[0].s;
	//find min
	for (i = 0; i < N; i++)
	{
		if (max < a[i].s)
			max = a[i].s;
	}
	for (i = 0; i < N; i++)
	{
		if (a[i].s == max)
			b[j++] = a[i];
	}
	return j;

}

void main()
{  STREC  s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
		{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
   STREC  h[N];
   int  i,n;FILE *out ;
   n=fun( s,h );
   printf("The %d highest score :\n",n);
   for(i=0;i<n; i++)
     printf("%s  %4d\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   fprintf(out, "%d\n",n);
   for(i=0;i<n; i++)
     fprintf(out, "%4d\n",h[i].s);
   fclose(out);
}


难度等级:★★★★★☆☆☆☆
学点啥
C语言中的% 2dprintf()函数的输bai出格式du中的%a.bf
表示将数字按宽度为2,采用右对齐方式输zhi出,若数据位数不到2位,则左dao边补空格。

12-14 【教务处】分数最低的学生数据

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
int  fun( STREC  *a, STREC *b )
{
	int i,j=0,min=a[0].s;
	//find min
	for (i = 0; i < N; i++)
	{
		if (min > a[i].s)
			min = a[i].s;
	}
	for (i = 0; i < N; i++)
	{
		if (a[i].s == min)
			b[j++] = a[i];
	}
	return j;
}

void main()
{  STREC  s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
		{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
   STREC  h[N];
   int  i,n;FILE *out ;
   n=fun( s,h );
   printf("The %d lowest score :\n",n);
   for(i=0;i<n; i++)
     printf("%s  %4d\n",h[i].num,h[i].s);
   printf("\n");
   out = fopen("out.dat","w") ;
   fprintf(out, "%d\n",n);
   for(i=0;i<n; i++)
     fprintf(out, "%4d\n",h[i].s);
   fclose(out);
}

难度等级:★★☆☆☆
学点啥

12-15【教务处】链表结构 求出平均分

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define   N   8
struct  slist
{  double   s;
   struct slist  *next;
};
typedef  struct slist  STREC;
double  fun( STREC *h  )
{
	double ave = 0.0;
	/*定义一个指向结点的指针p。
	由于头结点中无数值,
	故直接让p指向“头结点”的下一个结点 
	*/
	STREC *p = h->next;
	while (p != NULL)
	{
		ave += p->s;
		p = p->next
	}
	return ave / N;
}

STREC * creat( double *s)
{ STREC  *h,*p,*q;   int  i=0;
  h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
  while(i<N)
  { q=(STREC*)malloc(sizeof(STREC));
    q->s=s[i]; i++;  p->next=q; p=q;
  }
  p->next=0;
  return  h;
}
void outlist( STREC *h)
{ STREC  *p;
  p=h->next; printf("head");
  do
  { printf("->%4.1f",p->s);p=p->next;}
  while(p!=0);
  printf("\n\n");
}
void main()
{  double  s[N]={85,76,69,85,91,72,64,87},ave;
   void NONO (  );
   STREC  *h;
   h=creat( s );   outlist(h);
   ave=fun( h );
   printf("ave= %6.3f\n",ave);
   NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i,j ; double  s[N],ave;
  STREC *h ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
    h=creat( s );
    ave=fun( h );
    fprintf(out, "%6.3lf\n", ave) ;    
  }
  fclose(in) ;
  fclose(out) ;
}


输出结果
难度等级:★★★★☆
学点啥
1、链表详解
2、单链表的几类操作介绍(头结点没有数据)

12-16 【教务处】链表结构 找出学生的最高分

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#include <stdlib.h>
#define   N   8
struct  slist
{  double   s;
   struct slist  *next;
};
typedef  struct slist  STREC;
double  fun( STREC *h  )
{
	double max=h->s;

	while (h != NULL)
	{
		if (max < h->s)
			max = h->s;
		h = h->next;
	}
	return max;
}

STREC * creat( double *s)
{ STREC  *h,*p,*q;   int  i=0;
  h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
  while(i<N)
  { q=(STREC*)malloc(sizeof(STREC));
    q->s=s[i]; i++; p->next=q; p=q;
  }
  p->next=0;
  return  h;
}
void outlist( STREC *h)
{ STREC  *p;
  p=h->next;   printf("head");
  do
  { printf("->%2.0f",p->s);p=p->next;}
  while(p!=0);
  printf("\n\n");
}
void main()
{  double  s[N]={85,76,69,85,91,72,64,87}, max;void NONO ();
   STREC  *h;
   h=creat( s );   outlist(h);
   max=fun( h );
   printf("max=%6.1f\n",max);
   NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  int i,j ; double  s[N],max;
  STREC *h ;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
    h=creat( s );
    max=fun( h );
    fprintf(out, "%6.1lf\n", max) ;
  }
  fclose(in) ;
  fclose(out) ;
}

在这里插入图片描述
难度等级:★★☆☆☆
学点啥

12-17 【教务处】返回该学号的学生数据

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include <stdio.h>
#include <string.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
STREC  fun( STREC  *a, char *b )
{
	int i;
	/*若无指定学号,学号置空,成绩-1*/
	STREC str={ "\0",-1 };
	for (i = 0; i < N; i++)
	{
		if (strcmp(a[i].num,b)==0)
			str=a[i];
	}
	return str;
}

void main()
{  STREC  s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
		{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
   STREC  h;
   char  m[10];
   int  i;FILE *out ;
   printf("The original data:\n");
   for(i=0; i<N; i++)
   {  if(i%4==0) printf("\n");
      printf("%s %3d  ",s[i].num,s[i].s);
   }
   printf("\n\nEnter the number:  ");gets(m);
   h=fun( s,m );
   printf("The data :  ");
   printf("\n%s  %4d\n",h.num,h.s);
   printf("\n");
   out = fopen("out.dat","w") ;
   h=fun(s,"GA013");
   fprintf(out,"%s  %4d\n",h.num,h.s);
   fclose(out);
}

难度等级:★★☆☆☆
学点啥
常见的字符串处理函数总结
在这里插入图片描述

14【计算】

14-1【计算】并输出如下多项式的值…n输入15,则输出为sn=1.718

在这里插入图片描述
雕虫小技
在这里插入图片描述

#include <stdio.h>
double fun(int n)
{
	int i,j;
	double deno = 1.0,sum = 0.0;
	/*1+...+1/(j-1)!+1/j!*/
	for (j = 1; j <= n; j++)
	{
		/*j!*/
		for (i = 1; i <= j; i++)
			deno *= i;
		sum +=1.0 / deno;
	}
	return sum;
}
void main()
{
  int n; 
  double s;
  FILE *out;
  printf("\nInput n: "); 
  scanf("%d",&n);
  s=fun(n);
  printf("s=%f\n",s);
  /******************************/
  out=fopen("out.dat","w");
  fprintf(out,"%f\n",fun(15));
  fclose(out);
  /******************************/
}

输出结果
难度等级:★★★★★☆☆☆☆
学点啥

14-2【计算】级数和 1.349859

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double fun(double x, int n)
{
	int i;
	double fenzi = 1.0, fenmu = 1.0,sum = 1.0;

	for (i = 1; i <= n; i++)
	{
		fenzi *= x;
		fenmu *= i;
		sum += (double) (fenzi / fenmu);
	}
	return sum;
}
void main()
{ 
  FILE *wf;
  system("CLS");
  printf("%f ",fun(0.3,10));
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",fun(0.3,10));
  fclose(wf);
/*****************************/
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-3【计算】log函数 6.506583

在这里插入图片描述
雕虫小技
失效拉
在这里插入图片描述

void NONO (  )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n ;
  double s ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

正儿八经

#include <math.h>
#include <stdio.h>
double   fun(  int  m )
{
	int i;
	double sum = 0.0;

	for (i=0;i<m;i++)
	{
		sum += log(i);
	}
	return sqrt(sum);
}

void main()
{
   void NONO (  );
   printf("%f\n", fun(20));
   NONO();
}

void NONO (  )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n ;
  double s ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}


输出结果
在这里插入图片描述

错误原因,初值出现了log0

double   fun(  int  m )
{
	int i;
	double sum = 0.0;

	for (i=1;i<=m;i++)
	{
		sum += log(i);
	}
	return sqrt(sum);
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-4【计算】1+1/(1+2) 1.83333

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>

float fun(int  n)
{
	int i,fenmu = 0;
	float sum=0.0;

	for (i = 1; i <= n; i++)
	{
		fenmu += i;
		sum += 1.0 / fenmu;
	}
	return sum;
}

void main()
{  int n; float s;
   void NONO (  );
   printf("\nPlease enter N:"); scanf("%d", &n);
   s = fun(n);
   printf("the result is: %f\n", s);
   NONO();
}

void NONO (  )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n ;
  float s;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

难度等级:★★★★★☆☆☆☆
学点啥

14-5【计算】 m=12,n=8时,运行结果是495.0000

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
float  fun(int m, int n)
{
	int i;
	float fenzi = 1, fenmu1 = 1, fenmu2 = 1;

	for (i = 1; i <= m; i++)
		fenzi *= i;
	for (i = 1; i <= n; i++)
		fenmu1 *= i;
	for (i = 1; i <= (m-n); i++)
		fenmu2 *= i;

	return  fenzi / (fenmu1*fenmu2);
}

void main()   /* 主函数 */
{  void NONO ();
   printf("P=%f\n", fun (12,8));
   NONO();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, m, n ;
  float s;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d,%d", &m, &n) ;
    s = fun(m, n) ;
    fprintf(wf, "%f\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-6【计算】 n个幂数之和 154.0000

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#pragma warning (disable:4996)
#define N 5
struct mpow
{
	double a;
	int t;
};
double fun(struct mpow *x,int n)
{
	int i, j;
	double sum = 0.0;

	for (i = 0; i < n; i++)
	{
		double power = 1.0;
		for(j = 0; j < x[i].t; j++)
			power *= x[i].a;
		sum += power;
	}
	return sum;
}
void main()
{
	void NONO();
	struct mpow x[N]={ 12,0,9,2,23,1,7,2 };
	double sum;
	sum=fun(x,4);
	printf("sum=%lf\n",sum);
	NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *in, *out ;
  struct mpow x[N];
  int i,j ;
  double sum;
  in = fopen("in.dat","r") ;
  out = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j=0 ; j < 4; j++) fscanf(in, "%lf,%d,", &x[j].a,&x[j].t) ;
	   sum=fun(x,4);
	 fprintf(out, "sum=%lf\n",sum);
  }
  fclose(in) ;
  fclose(out) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-7【计算】 当n=10时,函数值为0.909

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
double fun(int n)
{
	int i;
	double sum = 0.0;

	for (i = 1; i <= n; i++)
	{
		sum += 1.0 / (i*(i + 1));
	}
	return sum;
}
void main()
{ 
  FILE *wf;
  system("CLS");
  printf("%f\n",fun(10));
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",fun(10));
  fclose(wf);
/*****************************/
}

难度等级:★☆☆☆☆
学点啥

14-8【计算】Fibonacci数列

在这里插入图片描述
雕虫小技
失效
在这里插入图片描述

正儿八经

#include <math.h>
#include <stdio.h>
int  fun( int  t)
{
	int i, f0 = 0, f1 = 1, f = 0;

	while (f < t)
	{
		f = f0 + f1;
		f0 = f1;
		f1 = f;
	}
	return f;
}

void main()   /* 主函数 */
{  int  n;
   void NONO (  );
   n=1000;
   printf("n = %d, f = %d\n",n, fun(n));
   NONO();
}

void NONO (  )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, n, s ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%d\n", s) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-9 【计算】3.140578

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#include <math.h>
double  fun ( double  eps)
{
	int i=1;
	double sum=0.0,s1 = 1.0;
	for (; s1 >= eps; i++)
	{
		sum += s1;
		s1 = s1* i / (2 * i + 1);
	}

	return 2*sum;
}

void main( )
{ double  x;void NONO ();
  printf("Input eps:") ;
  scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
  NONO();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i ;
  double x ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%lf", &x) ;
    fprintf(wf, "%lf\n", fun(x)) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}

难度等级:★★★★★☆☆☆☆
学点啥

14-10【计算】534.188

在这里插入图片描述
雕虫小技

正儿八经

#include<math.h>
#include<stdio.h>
double fun(int n)
{
	int i;
	double s=0.0,sum = 0.0;

	for (i = 0; i <= n; i++)
	{
		s += sqrt(i);
		sum += s;
	}
	return sum;
}
void main()
{
  FILE *wf;
  int n; 
  double s;
  printf("\n\nInput n: ");
  scanf("%d",&n);
  s=fun(n);
  printf("\n\ns=%f\n\n",s);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",fun(20));
  fclose(wf);
/*****************************/
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

14-10 【计算】 1.718282

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
double fun(int n)
{
	int i,fenmu=1;
	double s=0.0, sum = 0.0;

	for (i = 1; i <= n; i++)
	{
		fenmu = fenmu * i;
		s = 1.0 / fenmu;
		sum += s;
	}
	return sum;
}
void main()
{
  int n; 
  double s;
  FILE *out;
  printf("\nInput n: "); 
  scanf("%d",&n);
  s=fun(n);
  printf("s=%f\n",s);
  /******************************/
  out=fopen("out.dat","w");
  fprintf(out,"%f\n",fun(15));
  fclose(out);
  /******************************/
}

在这里插入图片描述
难度等级:★★☆☆☆
学点啥

14-11 【计算】 1.10000

在这里插入图片描述
雕虫小技

正儿八经

#include  <math.h>
#include  <stdio.h>
double fun(double x)
{ 
	int i;
	double fenzi=1.0, fenmu = 1.0,s0=0.0,s1=1.0,sum=0.0;

	for (i = 1; fabs(s1-s0) >= 0.000001; i++)
	{
		s0 = s1;
		sum += s0;
		fenmu *= i;
		fenzi *= (0.5-i+1)*x;
		s1 = fenzi / fenmu;
	}
	return sum;
}
void main()
{ int i;
  double x,s;
  FILE *out;
  printf("Input x: ");
  scanf("%lf",&x);
  s=fun(x);
  printf("s=%f\n ",s);
  /******************************/				 /*这里包含输出文件程序*/
  out=fopen("out.dat","w");
  for(i=20;i<30;i++)
    	fprintf(out,"%f\n",fun(i/100.0));
  fclose(out);
  /******************************/
}

在这里插入图片描述
难度等级:★★☆☆☆
学点啥

14-12 【计算】 方差11.73

在这里插入图片描述
雕虫小技

正儿八经

#include<math.h>
#include<stdio.h>
double fun(double x[10])
{
	int i;
	double ave = 0.0,s=0.0;
	for (i = 0; i < 10; i++)
		ave += x[i] / 10;
	for (i = 0; i < 10; i++)
		s += pow((x[i] - ave), 2) / 10.0;

	return sqrt(s);
}
void main()
{ 
  FILE *wf;
  double s,x[10]={95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0};
  int i;
  printf("\nThe original data is:\n");
  for(i=0;i<10;i++) 
     printf("%6.1f ",x[i]);
  printf("\n\n ");
  s=fun(x);
  printf("s=%f\n\n ",s);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%f",s);
  fclose(wf);
/*****************************/
}

在这里插入图片描述
难度等级:★★☆☆☆
学点啥

14-13【计算】每相邻两个元素的平均值的平方根之和

在这里插入图片描述

#include  <stdio.h>
#include  <math.h>
double fun(double x[9])
{
	int i;
	double SqrtAve=0.0;
	for (i=0;i<8;i++)
	{
		SqrtAve += sqrt((x[i] + x[i + 1]) / 2);
	}
	return SqrtAve;
}

void main()
{double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
 int i;
 FILE *out;
 printf("\nThe original data is : ");
 for(i=0;i<9;i++)
	printf("%6.1f",a[i]);
 printf("\n\n"); 
 s=fun(a);
 printf("s=%f\n\n",s);
 /******************************/
 out=fopen("out.dat","w");
 fprintf(out,"%f",s);
 fclose(out);
 /******************************/
}

输出结果
在这里插入图片描述
学点啥

14-14 【计算】 0.6628

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
double fun(int  n)
{
	int i;
	double sum = 0.0;

	for (i = 1; i <= n; i++)
		sum += 1.0 / (2 * i - 1) - 1.0 / (2 * i);
	return sum;
}
void main()
{ int  n;    double  s;
  void NONO( );
  printf("\nInput n:  ");  scanf("%d",&n);
  s=fun(n);
  printf("\ns=%f\n",s);
  NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int n, i ; double s ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%lf\n", s) ;
  }
  fclose(rf) ; fclose(wf) ;
}

难度等级:★★☆☆☆
学点啥

14-15 【计算】 1.718282

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
double fun(int  n)
{
	int i;
	double sum = 0.0, fenmu = 1.0;

	for (i = 1; i <= n; i++)
	{
		fenmu = fenmu * i;
		sum += 1.0 / fenmu;
	}
	return sum;
}
void main()
{ int  n;    double  s;
  void NONO( );
  printf("\nInput n:  ");  scanf("%d",&n);
  s=fun(n);
  printf("\n\ns=%f\n\n",s);
  NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
  FILE *rf, *wf ; int n, i ; double s ;
  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%d", &n) ;
    s = fun(n) ;
    fprintf(wf, "%lf\n", s) ;
  }
  fclose(rf) ; fclose(wf) ;
}

难度等级:★★☆☆☆
学点啥

14-16 【计算】迭代方法

在这里插入图片描述
雕虫小技
在这里插入图片描述
正儿八经

#include <math.h>
#include <stdio.h>
double fun()
{
	double x0, x1=0.0;
	x0 = x1;
	do
	{
		x0 = x1;
		x1 = cos(x0);
	}while (fabs(x0 - x1) >= 1e-6);
	return x1;
}

void main()
{
   void NONO (  );
   printf("Root =%f\n",fun());

   NONO();
}

void NONO (  )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *wf ;
  wf = fopen("out.dat","w") ;
  fprintf(wf, "%f\n", fun()) ;
  fclose(wf) ;
}

难度等级:★★☆☆☆
学点啥

15 【人生能有几回搏】

15-1 长度为2的字符串在另一个字符串中出现的次数

在这里插入图片描述
雕虫小技

  wf=fopen("out.dat","w");
  n=fun("asd asasdfg asd as zx67 asd mklo","as");
  fprintf(wf,"%d",n);
  fclose(wf);

在这里插入图片描述
在这里插入图片描述
正儿八经

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(char *str, char *substr)
{

	int i,k=0;
	for (i = 0; str[i + 1]; i++)
	{
		//if (str[i] == substr[0] && str[i + 1] == substr[1])
		if (*(str+i) == *substr &&*(str+i+1) == *(substr+1))
			k++;
	}
	return k;
}
void main()
{ 
  FILE *wf;
  char str[81],substr[3];
  int n;
  system("CLS");
  printf("输入主字符串: ");
  gets(str);
  printf("输入子字符串: ");
  gets(substr);
  puts(str);
  puts(substr);
  n=fun(str,substr);
  printf("n=%d\n ",n);
/******************************/
  wf=fopen("out.dat","w");
  n=fun("asd asasdfg asd as zx67 asd mklo","as");
  fprintf(wf,"%d",n);
  fclose(wf);
/*****************************/
}

难度等级:★★☆☆☆
学点啥

15-2. 字符串中指定字符的个数

在这里插入图片描述
雕虫小技

正儿八经

#include <stdio.h>
#include <string.h>
#define  M 81

int fun(char *ss, char c)
{
	int i, k=0;
	for (i = 0; ss[i] != '\0'; i++)
	{
		if (ss[i] == c)
			k++;
	}
	return k;
}

void main()
{  char  a[M], ch;
   void NONO (  );
   printf("\nPlease enter a string:"); gets(a);
   printf("\nPlease enter a char:"); ch = getchar();
   printf("\nThe number of the char is: %d\n", fun(a, ch));
   NONO ( );
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  int i ;
  FILE *rf, *wf ;
  char a[M], b[M], ch ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", a) ;
    fscanf(rf, "%s", b) ;
    ch = *b ;
    fprintf(wf, "%c=%d\n", ch, fun(a, ch)) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★☆☆☆☆

int fun(char *ss, char c)
{

	int k;
	for (; *ss != '\0'; ss++)
		if (*ss == c)
			k++;
	return k;
}

学点啥

15-3 “ea”、 “ou” 、“iu” 出现的次数

在这里插入图片描述
正儿八经

#include <stdio.h> 
#include <string.h>
#pragma warning (disable:4996)
void fun(char*sp, int *ct)
{
	int i;
	for (i = 0; i < 3; i++)
		ct[i] = 0;
	for (i = 0; sp[i] != '\0'; i++)
	{
		if (sp[i] == 'e'&&sp[i+1] == 'a')
			ct[0]++;
		else if (sp[i] == 'o'&&sp[i+1] == 'u')
			ct[1]++;
		else if (sp[i] == 'i'&&sp[i+1] == 'u')
			ct[2]++;
	}
}
main()
{
	void NONO();
	char txt[200] = "abeaeafeeaoukgdoouuoiouifwieeotiu";
	int c[3];
	fun(txt, c);
	printf("%d,%d,%d\n", c[0], c[1], c[2]);
	NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
	FILE *rf, *wf;
	int i, c[3];
	char txt[200], *p;

	rf = fopen("in.dat", "r");
	wf = fopen("out.dat", "w");
	for (i = 0; i < 10; i++) {
		fgets(txt, 200, rf);
		p = strchr(txt, '\n');
		if (p != NULL) *p = 0;
		fun(txt, c);
		fprintf(wf, "%d,%d,%d\n", c[0], c[1], c[2]);
	}
	fclose(rf); fclose(wf);
}

难度等级:★★☆☆☆
学点啥

15-4 统计一行字符串中单词的个数

在这里插入图片描述

#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
	int i, num = 0;
	for (i = 0; s[i]!='\0'; i++)
	{
		if (s[i]!=' '&&(s[i+1] == ' '|| s[i + 1] == '\0'))
		/*字母的下一个字符为空格或者结束标志,则单词结束;计数++*/
			num++;
	}
	return num;
}
void main()
{ 
  FILE *wf;
  char line[N]; 
  int num=0;
  printf("Enter a string:\n "); 
  gets(line);
  num=fun(line);
  printf("The number of word is:%d\n\n ",num);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%d",fun("a big car"));
  fclose(wf);
/*****************************/
}

难度等级:★★☆☆☆
学点啥
关键在于如何识别单词

15-5 小写字母各自出现的次数

在这里插入图片描述
难度等级:★★★☆☆

在这里插入代码片

在这里插入图片描述
学点啥

16 数组寻寻觅觅

16-1 使数组右上半三角元素中的值乘以m

在这里插入图片描述
题目

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  N  5
void fun(int a[][N], int m)
{

}
void main()
{ 
  int a[N][N],m, i, j;
  FILE *out;
  printf("*****The array*****\n");
  for(i=0;i<N;i++)
        { for(j=0;j<N;j++)
        	{a[i][j]=rand()%20;
         	printf("%4d", a[i][j]);
        	}
        printf("\n");
    	}
  m=rand()%4;
  printf("m=%4d\n",m);
  fun(a,m);
  printf("THE RESULT\n"); 
  for(i=0;i<N;i++)
     { for(j=0;j<N;j++) 
          printf("%4d",a[i][j]);
       printf("\n");
     }
  /******************************/
  out=fopen("out.dat","w");
  for(i=0;i<N;i++)
    	for(j=0;j<N;j++)
		a[i][j]=i*j;
  fun(a,8);
  for(i=0;i<N;i++)
  { 	for(j=0;j<N;j++)
		fprintf(out,"%4d",a[i][j]);
	fprintf(out,"\n");
  }
  fclose(out);
  /******************************/
}

雕虫小技
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正儿八经
解答1:

void fun(int a[][N], int m)
{
	int i, j;
	for (i = 0; i < N; i++)//控制行坐标
	{
		for (j = i; j < N; j++)//控制列坐标
			a[i][j] *= m;
	}
}

思路:
在这里插入图片描述
解答2:

void fun(int a[][N], int m)
{
	int i, j;
	for (i = 0; i < N; i++)//控制列坐标
	{
		for (j = 0; j <= i; j++)//控制行坐标
			a[j][i] *= m;
	}
}

思路:

在这里插入图片描述

在这里插入图片描述

变形:下半三角*m

//下半三角*m  思路1
//void fun(int a[][N], int m)
//{
//	int i, j;
//	for (i = 0; i < N; i++)//控制列坐标
//	{
//		for (j = i; j < N; j++)//控制行坐标
//			a[j][i] *= m;
//	}
//}

//下半三角*m  思路2
void fun(int a[][N], int m)
{
	int i, j;
	for (i = 0; i < N; i++)//控制行坐标
	{
		for (j = 0; j <= i; j++)//控制列坐标
			a[i][j] *= m;
	}
}

在这里插入图片描述

难度等级:★★★★★☆☆☆☆
学点啥

16-2 左下半三角元素中的值全部置成0

在这里插入图片描述
雕虫小技

正儿八经

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
void fun (int a[][N])
{
	int i, j;

	for (i = 0; i < N; i++)
		for (j = 0; j <= i; j++)
			a[i][j] = 0;

}
void main()
{ 
  FILE *wf;
  int a[N][N],i,j;
  int b[N][N]={1,9,7,2,4,2,3,8,1,2,4,5,6,7,5,4,0,6,8,0,2,7,1,6,4};
  system("CLS");
  printf("*****The array*****\n");
  for(i=0;i<N;i++)              /*产生一个随机的5*5矩阵*/
     { for(j=0;j<N;j++)
          {a[i][j]=rand()%10; 
           printf("%4d", a[i][j]);
          }
       printf("\n");
     }
  fun(a);
  printf("THE RESULT\n");
  for(i=0;i<N;i++)
     { for(j=0;j<N;j++) 
          printf("%4d",a[i][j]);
       printf("\n");
     }
/******************************/
  wf=fopen("out.dat","w");
  fun(b);
  for(i=0;i<N;i++)
     { for(j=0;j<N;j++) 
          fprintf(wf,"%4d",b[i][j]);
       fprintf(wf,"\n");
     }
  fclose(wf);
/*****************************/
}

难度等级:★★★★★☆☆☆☆
学点啥

1-63 二维数组中每列中最大元素

在这里插入图片描述
雕虫小技

正儿八经

#include    <conio.h>
#include    <stdio.h>
#include	<stdlib.h>
#define  M  3
#define  N  4
void fun(int  tt[M][N],int  pp[N])
{
	int i, j, max;
	for (j = 0; j < N; j++)
	{
		max = tt[0][j];
		for (i = 0; i < M; i++)
			if (max < tt[i][j])
				max = tt[i][j];
		pp[j] = max;
	}
}


void main( )
{
   void NONO( );
	int t[M][N]={{68, 32, 54, 12},{14, 24, 88, 58},{42, 22, 44, 56}};
   int  p [ N ],  i,  j,  k;
   printf ( "The original data is : \n" );
   for( i=0; i<M; i++ ){
     for( j=0; j<N; j++ )
       printf ( "%6d", t[i][j] );
     printf("\n");
   }
   fun ( t, p );
   printf( "\nThe result  is:\n" );
   for ( k = 0; k < N; k++ ) printf ( " %4d ", p[ k ] );
   printf("\n");
   NONO( );
}

void NONO( )
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
    输出数据,关闭文件。 */
  int i, j, k, m, t[M][N], p[N] ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(m = 0 ; m < 10 ; m++) {
    for( i=0; i<M; i++ ){
      for( j=0; j<N; j++ )
	fscanf (rf, "%6d", &t[i][j] );
    }
    fun ( t, p ) ;
    for ( k = 0; k < N; k++ ) fprintf (wf, " %4d ", p[ k ] ) ;
    fprintf(wf, "\n") ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

16-4 二维数组中最大元素的值

在这里插入图片描述

雕虫小技
在这里插入图片描述

正儿八经

#include <stdio.h>
#define M 4
int fun (int a[][M])
{
	int max=a[0][0],i,j;

	for (i = 0; i < 2; i++)
		for (j = 0; j < M; j++)
			if (max < a[i][j])
				max = a[i][j];

	return max;
}

void main( )
{  int arr[2][M]={5,8,3,45,76,-4,12,82} ;void NONO ();
   printf("max =%d\n", fun(arr)) ;
   NONO( ) ;
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *wf ;
  int arr[][M]={5,8,3,90,76,-4,12,82} ;

  wf = fopen("out.dat","w") ;
  fprintf(wf, "max=%d\n", fun(arr)) ;
  fclose(wf) ;
}

难度等级:★★★★★☆☆☆☆
学点啥

16-5 主对角线元素分别乘以2

在这里插入图片描述
正儿八经

#include <stdio.h>
#define N  3
#pragma warning(disable:4996)
void NONO( );

void fun( int a[N][N],int *p)
{
	int i, j = 0;

	for (i = 0; i < N; i++)
		p[j++] = a[i][i] * 2;
	for (i = 0; i < N; i++)
		p[j++] = a[i][N - 1 - i] * 3;
}
main()
 {   int a[N][N]={ 1,5,7,2,6,8,3,4,9};
     int b[2*N],i;
     fun(a,b);
     for(i=0;i<2*N;i++)
            printf("%d,",b[i]);
     NONO();
}

void NONO( )
{   int a[N][N];
     int b[2*N],i,j,k;
     FILE *rf, *wf;

     rf = fopen("in.dat","r") ;
     wf = fopen("out.dat","w") ;
     for(k=0; k<9;k++) {
           for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                     fscanf(rf,"%d,",&a[i][j]);
         fun(a,b);
         for(i=0;i<2*N;i++)
              fprintf(wf, "%d,",b[i]);
         fprintf(wf, "\n");
     }
     fclose(rf);
     fclose(wf);
}

难度等级:☆☆☆☆☆
学点啥
在这里插入图片描述

16-6.转置

在这里插入图片描述
雕虫小技
在这里插入图片描述

在这里插入图片描述

正儿八经*

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

void fun (int array[3][3])
{
	int i, j, temp;
	for (i = 0; i < 3; i++)
	{
		for (j = i+1; j < 3; j++)
		{
			temp = array[i][j];
			array[i][j] = array[j][i];
			array[j][i] = temp;
		}
	}
}
void main()
{
  FILE *wf;
  int i,j;
  int array [3][3]={{100,200,300},{400,500,600},{700,800,900}};
  system("CLS");
  for (i=0;i<3;i++)
     {for (j=0;j<3;j++)
          printf("%7d ",array[i][j]);
      printf("\n ");
     }
  fun(array);
  printf("Converted array:\n ");
  for (i=0;i<3;i++)
     { for (j=0;j<3;j++)
          printf("%7d ",array[i][j]);
       printf("\n ");
     }   
/******************************/
  wf=fopen("out.dat","w");
  for (i=0;i<3;i++)
     { for (j=0;j<3;j++)
          fprintf(wf,"%7d ",array[i][j]);
       fprintf(wf,"\n");
     }   
  fclose(wf);
/*****************************/
}

输出结果
在这里插入图片描述
难度等级:★★☆☆☆
学点啥

16-7. 矩阵A加上A的转置

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>

void  fun ( int a[3][3], int b[3][3])
{
	int i,j;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			b[i][j] = a[i][j]+a[j][i];
		}
	}
}

void main( )   /* 主程序 */
{  int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, t[3][3] ;
   int i, j ;
   void NONO (  );

   fun(a, t) ;
   for (i = 0 ; i < 3 ; i++) {
      for (j = 0 ; j < 3 ; j++)
        printf("%7d", t[i][j]) ;
      printf("\n") ;
   }
   NONO () ;
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  int i, j, k, a[3][3], t[3][3] ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(k = 0 ; k < 5 ; k++) {
    for(i = 0 ; i < 3 ; i++)
      fscanf(rf, "%d %d %d", &a[i][0], &a[i][1], &a[i][2]) ;
    fun(a, t) ;
    for(i = 0 ; i < 3 ; i++) {
      for(j = 0 ; j < 3 ; j++) fprintf(wf, "%7d", t[i][j]) ;
      fprintf(wf, "\n") ;
    }
  }
  fclose(rf) ;
  fclose(wf) ;
}

在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥

  • 50
    点赞
  • 276
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值