第七章:用函数实现模块化程序设计

本文展示了C语言编程中多个函数的实现,包括求最大数、平均值、排序、汉诺塔、阶乘、求解方程、字符串操作等。还涉及到了递归、静态局部变量、数组操作和二元一次方程根的分类。内容涵盖了算法设计、数据处理和问题解决等多个方面。
摘要由CSDN通过智能技术生成

2:输出两个函数较大数

int max(int x, int y)
{
	int z;
	z = x > y ? x : y;
	return(z);
}
int main()
{
	int max(int x, int y);
	int a=0, b=0, c=0;
	//输入两个数字
	scanf_s("%d%d", &a, &b);
	c = max(a, b);
float max(float x, float y)
{
	float z;
	z = x > y ? x : y;
	return(z);
}

求和

float add(float x, float y)
{
	float z;
	z = x+y;
	return(z);
}

5:输入四个整数找出最大数

int max4(int a, int b, int c, int d)
{
	int max2(int a, int b);
	int m;
	m = max2(a, b);
	m = max2(m, c);
	m = max2(m, d);
	return m;
}
int max2(int a, int b)
{
	return (a > b ? a : b);
}

6:递归求年龄

int age(int n)
{
	int c;
	if (n == 1)
	{
		c = 10;
	}
	else
		c = age(n - 1) + 2;
	return c;
}

7:用递归求n!

int age(int n)
{
	int c=0;
	if (n < 0)
		printf("error\n");
	 else if (n == 1||n==0)
	{
		c = 1;
	}
	else
		c = n*age(n-1);
	return (c);
}

8:汉诺塔问题

void hanoi(int n, char one, char two, char three)
{
	void move(char x, char y);
	if (n == 1)
		move(one, three);
	else
	{
		hanoi(n - 1, one, three, two);
		move(one, three);
		hanoi(n - 1, two, one, three);
	}
}
void move(char x, char y)
{
	printf("%c-->%c\n", x, y);
}

9:输入十个数,输出最大值及其下标

m = a[0];
	for (i = 1; i < 10; i++)
	{
		if (m < a[i])
		{
			m = a[i];
			n = i;
		}
    }

10十个学生的平均成绩

float average(float array[10])
{
	int i;
	float aver,sum = array[0];
	for (i = 1; i < 10; i++)
	{
		sum += array[i];
	}
	aver = sum / 10;
	return (aver);
}

11:调用average函数输出两个班平均数

float average(float array[],int n)
{
	int i;
	float aver, sum = array[0];
	for (i = 1; i < n; i++)
	{
		sum += array[i];
	}
	aver = sum / n;
	return (aver);
}

12选择法对数组10个整数升序

void sort(int array[], int n)
{
	int i, j, k, t;
	for (i = 0; i < n; i++)
	{
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if (array[j] < array[k])
			{
				k = j;
				t = array[k];
				array[k] = array[i];
				array[i] = t;
			}
		}
	}
}

冒泡法

void sort(int array[], int n)
{
	int i, j, k, t;
	for (i = 0; i < n-1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (array[j] < array[i])
			{
				t = array[j];
				array[j] = array[i];
				array[i] = t;
			}
		}
	}
}

14求所有元素中最大值

int max_value(int array[][4])
{
	int i, j, max;
	 int row = 0, col = 0;
	max = array[0][0];
	for(i=0;i<3;i++)
		for (j = 0; j < 4; j++)
		{
			if (array[i][j] > max)
			{
				max = array[i][j];
				row = i;
				col = j;
			}
		}
	return (max);
}

15一个函数实现平均分最高分最低分

float average(float array[], int n)
{
	int i;
	float aver, sum = array[0];
	max = min = array[0];
	for (i = 1; i < n; i++)
	{
		if (array[i] > max)
			max = array[i];
		else if(array[i]<min)
		{
			min = array[i];
		}
		sum += array[i];
	}
	aver = sum / n;
	return(aver);
}
ave = average(score, 10);
	printf("最大数%6.2f\n最小数%6.2f\n平均数%6.2f\n",max,min,ave);//上一行相当//于已经重置了min与max

17考察静态局部变量的值

#include<stdio.h>
int f(int a)
{
	auto b = 0;//自动局部变量
	static int c = 3;//静态局部变量
	b = b + 1;
	c++;
	return(a + b + c);
}
//第一次调用
//b = 1; c = 4;a+b+c=7
//b = 1; c = 5;a+b+c=8
//b = 1; c = 6;a+b+c=9
//c是静态局部变量,函数调用结束后,它并不释放,而是保留其值
int main()
{
	int f(int);
	int a = 2,i;
	for (i = 0; i < 3; i++)
	{
		printf("%d\n", f(a));
	}
	return 0;
}

18:输出1到5阶乘值

int f(int n)
{
	static int f = 1;//静态局部变量
	f *= n;
	return(f);
}
int main()
{
	int f(int f);
	int i;
	for (i = 1; i < 6; i++)
	{
		printf("%d的阶乘%d\n", i,f(i));
	}
	return 0;
}

19调用函数,求三个整数中的最大者

int max()
{
	int m;
	m = A > B ? A : B;
	if (C > m)m = C;
	return(m);
}

21:外部函数实现删除输入的字符

void enter_string(char str[80])
{
	gets_s(str);
}
 void delete_string(char str[], char ch)
{
	 int i, j;
	 for (i = j = 0; str[i] != '\0'; i++)
	 {
		 if (str[i] != ch)
			 str[j++] = str[i];
	 }
	 str[j] = '\0';
}
 void print_string(char str[])
 {
	 printf("%s", str);
}

22:两个函数分别求最大公约和最小公倍

int bei(int x, int y, int o)
{
	return(x * y / o);
}
int yue(int x, int y)
{
	int m, t;
	if (y > x)
	{
		t = y;
		y = x;
		x = t;
	}//确保x>y
	while (y != 0)
	{
		m = x % y;
		x = y;
		y = m;
	}
	return (x);

}

23:三个函数分类二元一次方程根

void greater_than_zero(float a, float b)
{
	float m = sqrt(disc);
	x1 = (-b + sqrt(disc)) / (2 * a);
	x2 = (-b - sqrt(disc)) / (2 * a);
}
void equal_than_zero(float a, float b)
{
	x1=x2 = (-b) / (2 * a);
}
void smaller_than_zero(float a, float b)
{
	p = (-b) / (2 * a);
	q = (sqrt(-disc)) / (2 * a);
}

24:判定素数的函数

int panduan(int n)
{
	int i, temp;
	temp = 1;
	for (i = 2; i < n / 2 && temp == 1; i++)
		if (n % i == 0)
			temp = 0;
	return(temp);
}
int main()

25转置3乘3矩阵的函数

void zhaunzhi(int a[3][3],int b[3][3])
{
	int i, j;
	printf("数组a\n");
    for (i = 0; i <= 2; i++)
	{
		for (j = 0; j <= 2; j++)
		{
			printf("%5d", a[i][j]);
			b[j][i] = a[i][j];
		}
		printf("\n");
	}
	/*也可以不建立b[][]
	即:
	for (i = 0; i <= 2; i++)
	{
		for (j = 0; j <= 2; j++)
		{
			printf("%5d", a[i][j]);
			t = a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=t;
		}
		printf("\n");
	}*/
	printf("数组b\n");
	for (i = 0; i <= 2; i++)
	{
		for(j=0;j<=2;j++)
			printf("%5d", b[i][j]);
	printf("\n");
	}
}

26逆序输出字符串函数

void nixun(char a[100],int n)
{
	int i, temp;
	for (i = 0; i < n / 2; i++)
	{
		temp = a[i];
		a[i] = a[n - i - 1];
		a[n - i - 1] = temp;
	}
	printf("逆序后的字符串\n");
	for (i = 0; i < sizeof(a); i++)
		printf("%c", a[i]);
}
void lianjie(char s1[80],char s2[40],char s3[120])
{
	int i, j;
	for (i = 0; s1[i] != '\0'; i++)
	{
		s3[i] = s1[i];
	}
	for (j = 0; s2[j] != '\0'; j++)
	{
		s3[i + j] = s2[j];
	}
	s3[i + j] = '\0';
	puts(s3);
}
28复制元音字母到字符串并输出

```c
void yuanyin(char s1[100],char s2[50])
{
    int i, j = 0;
	for (i = 0; s1[i] != '\0'; i++)
	{
		if (s1[i] == 'a' || s1[i] == 'A' || s1[i] == 'e' || s1[i] == 'E' || s1[i] == 'i' || s1[i] == 'I' || s1[i] == 'o' || s1[i] == 'O' || s1[i] == 'u' || s1[i] == 'U')
		{

			s2[j] = s1[i];
			j++;
		}
	}
	s2[j] = '\0';
	for (j = 0; s2[j] != '\0'; j++)
		printf("%c", s2[j]);
}

29输出数字之间加一空格

char a[10] = { 0 };
	gets_s(a);
	int i;
	for (i = 0; a[i] != '\0'; i++)
	{
		printf("%c", a[i]);
		printf("%c", ' ');
	}

30统计字母,数字,空格,其他的个数

void tongji(char str[80])
{
	int i, j, bl, sl, num, space, others;
	bl = sl = num = space = others = 0;
	for (i = 0; i < 80; i++)
		{
			if (str[i] >= 'A' && str[i] <= 'Z')
				bl++;
			else if (str[i] >= 'a' && str[i] <= 'z')
				sl++;
			else if (str[i] >= '0' && str[i] <= '9')
				num++;
			else if (str[i] == ' ' || str[i] == '\t')
				space++;
			else
				others++;
	    }
	printf("大写数%d\n小写数%d\n数字数%d\n空格数%d\n其他字符数%d\n", bl, sl, num, space, others);
}

输出最长的单词,(问题)

void LongestWord(char str[], char word[])
{
	int max_len = 0;
	int len = 0;
	int i = 0;
	for (i; i < 100 && str[i] != 0; i++)
	{
		if (str[i] == ' ')
		{
			str[i] = '\0';
			len = strlen(str);
			if (len > max_len)
			{
				max_len = len;
				strcpy(word, str);
				str=str+len+1;
			}
		}
	}
}
void longrstword(char s[])
{
	char t[30], temp[30];//前者用来存储最长的单词,后者存储单词
	t[0] = '\0';//先让t变成最短的单词,在比较过程中边长
	int len = strlen(s), i, j = 0;
	for (i = 0; i < len; i++)//利用长度函数遍历字符串
	{
		j = 0;
		while (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z')
			temp[j++] = s[i++];//符合要求就复制单词到temp
		temp[j] = '\0';//最后一个字符变成\0
		if(strlen(t)<strlen(temp))
			strcpy(t,temp);
	}
	printf("最长的单词\n");
	puts(t);
}

33冒泡法函数升序

void maopao(char s[])
{
	int i, j;
	char temp;
	int len = strlen(s);
	for (i = 0; i < len - 1; i++)//-1是因为第二个循环有j+1和i=0,所有可以全部遍历到
	{
		for (j = 0; j < len - 1 - i; j++)
		{
			if (s[j] > s[j + 1])//比较的时候,自动转化成对应ASCII码的整数值
			{
				temp = s[j];//与整数相比较,变化的只有temp的数据类型
				s[j] = s[j + 1];
				s[j + 1] = temp;
			}
		}
	}
	puts(s);
}

34用牛顿迭代法求解三元依次函数

void niudun()
{
    double x0, x1, f, f1;
	x0 = N;
	while (1)
	{
		f = 1 * pow(x0, 3) + 2 * pow(x0, 2) + 3 * x0 + 4;
		f1 = 3 * pow(x0, 2) + 4 * x0 + 3;
		x1 = x0 - f / f1;
		if (fabs(x0 - x1) < 1e-5)
		{
			break;
		}
		x0 = x1;
	}
	printf("方程在【%f】附近的根是【%f】\n", N, x1);
}

35递归求n阶勒让德多项式

int lerang(int n,float x)
{
	if (n == 0)
		return(1);
	else if (n == 1)
		return(x);
	else
		return(((2 * n - 1) * x - lerang(n - 1, x) - (n - 1) * lerang(n - 2, x)) / n);
}

36分别用函数实现四个功能

void aver_stu(int t[][5])
{
	int i, j;
	float k, ave;
	for (j = 0; j < 10; j++)
	{
		for (i = 0, k = 0.0; i < 5; i++)
		{
			k += t[i][j];
		}
		ave = k / 5;
		printf("第%d个学生的平均分是%f\n", j + 1, ave);
	}
}
void aver_course(int t[][5])
{
	int i, j;
	float k, ave;
	for (j = 0; j < 5; j++)
	{
		for (i = 0, k = 0.0; i < 10; i++)
		{
			k += t[i][j];
		}
		ave = k / 10;
		printf("第%d门课的平均分是%f\n", j + 1, ave);
	}
}
void high(int t[][5])
{
	int i, j, h, stu, cour;
	for (i = 0, h = 0, stu = 0, cour = 0; i < 10; i++)
	{
		for (j = 0; j < 5; j++)
		{
			if (t[i][j] > h)
			{
				h = t[i][j];
				stu = i + 1;
				cour = j + 1;
			}
		}
	}
	printf("最高分是%d,来自第%d个学生第%d门科目\n", h, stu, cour);
}
void vari(int t[][5])
{
	int i, j, k, m;
	float temp[10], var, x1, x2;
	for (i = 0, m = 0; i < 10; i++,m++)
	{
		for (j = 0, k = 0; j < 5; j++)
		{
			k += t[i][j];
		}
		temp[m] = k / 5;
	}
	for (i = m = x1 = x2 = 0; i < 10; i++)
	{
		x1 += pow(temp[i], 2);
		x2 += temp[i];
	}
	var = x1 / 10 - pow(x2 / 10, 2);
	printf("方差是%f\n", var);
}
void input_stu()
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		printf("\n输入第%2d个学生的分数:\n", i + 1);
		for (j = 0; j < m; j++)
			scanf_s("%f", &score[i][j]);
	}
}
void aver_stu()
{
	int i,j;
	float s;
	for (i = 0; i < n; i++)
	{
		for (j = 0, s = 0; j < m; j++)
			s += score[i][j];
		a_stu[i] = s / m;
	}
}
void aver_cour(void)
{
	int i, j;
	float s;
	for (j = 0; j < m; j++)
	{
		s = 0;
		for (i = 0; i < n; i++)
			s += score[i][j];
		a_cour[j] = s / (float)n;
	}
}
float highest()
{
	float h;
	int i, j;
	float high = score[0][0];
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (high < score[i][j])
			{
				high = score[i][j];
				r = i+1;
				c = j + 1;
			}
		}
	}
	return (high);
}
float s_var(void)
{
	int i;
	float sumx=0.0, sumxn=0.0;
	for (i = 0; i < n; i++)
	{
		sumx += a_stu[i] * a_stu[i];
		sumxn += a_stu[i];
	}
	return(sumx / n - (sumxn / n) * (sumxn / n));
}
int main()
{
	int i, j;
	float h;
	void input_stu();
	void aver_stu();
	void aver_cour();
	float highest();
	float s_var(void);
	input_stu();
	aver_stu();
	aver_cour();
	printf("\n  NO.    cour1    cour2    cour3    cour4    cour5    aver\n");
	for (i = 0; i < n; i++)
	{
		printf("\n  NO.%2d", i + 1);
		for (j = 0; j < m; j++)
		{
			printf("%8.2f", score[i][j]);
		}
		printf("%8.2f\n", a_stu[i]);
	}
	printf("\naverage:");
	for (j = 0; j < m;j++)
	{
		printf("%8.2f", a_cour[j]);
	}
	printf("\n");
	h = highest();
	printf("highest:%8.2f    NO.  %2d    course  %2d\n", h, r, c);
	printf("variance %8.2f\n", s_var());
}

写三个函数

void input_num_name(double num[], char name[][16], int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		printf("请输入第%d位员工的工号和姓名:中间用空格隔开\n", i + 1);//同时输入实数和字符是可行的
		scanf_s("%lf", &num[i]);
		gets_s(name[i]);
	}
	printf("您所有员工的员工信息如下:\n");
	for (i = 0; i < n; i++)
	{
		printf("工号:%lf  姓名:%s\n", num[i], name[i]);
	}
}
void sort_num_name(double num[], char name[][16], int n)
{
	printf("工号升序排列如下:\n");
	int i, j;
	double temp_num;
	char temp_name[16];
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (num[j] > num[j + 1])
			{
				temp_num = num[j];
				num[j] = num[j + 1];
				num[j + 1] = temp_num;
				strcpy(temp_name, name[j]);
				strcpy(name[j], name[j+1]);
				strcpy(name[j + 1], temp_name);
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		printf("工号:%lf  姓名:%s\n", num[i], name[i]);
	}

}
void seek_num_name(double num[], char name[][16], int n, int seek_name)
{
	int low = 0;
	int high = n - 1;
	int mid;
	int i=1;
	while (low<high)
	{
		mid = (high + low) / 2;
		if (num[mid] == seek_name)
		{
			printf("您要找的员工信息如下:\n工号:%lf  姓名:%s", num[mid], name[mid]);
			i = 0;
			break;
		}
		else if (num[mid] > seek_name)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	if (i)
	{
		printf("公司无此员工");
	}
}

39十六进制转十进制函数

int h(char s[])
{
	int i, n = 0;
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] >= '0' && s[i] <= '0')
			n = n * 16 + s[i] + s[i] - '0';
		if (s[i] >= 'a' && s[i] <= 'f')
			n = n * 16 + s[i] + s[i] - 'a'+10;
		if (s[i] >= 'A' && s[i] <= 'F')
			n = n * 16 + s[i] + s[i] - 'A'+10;
	}
	return(n);
}
void convert(char a[])
{
    int n, i, num = 0;
    n = strlen(a);//读出字节长
    for (i = n - 1; i >= 0; i--)//递减遍历
    {
        if (a[i] >= '0' && a[i] <= '9')
            num += (a[i] - '0') * pow(16, n - 1 - i);
        else if (a[i] >= 'A' && a[i] <= 'F')
            num += (10 + (a[i] - 'A')) * pow(16, n - 1 - i);
        else if (a[i] >= 'a' && a[i] <= 'f')
            num += (10 + (a[i] - 'a')) * pow(16, n - 1 - i);

    }

41递归法将整数转换成字符串

void convert(int n) 
{
	int i;
	if ((i = n / 10) != 0)
		convert(i);
	putchar(n % 10 + '0');//递归的存在,会让第一个执行的函数是最深层的函数
	//即输出1,然后2,最后是3
}

42给出 年月日计算第几天

   if (year % 4 == 0) {
        if (year % 100 == 0) {
            if (year % 400 == 0)
                leap = 1;
            else
                leap = 0;
        }
        else
            leap = 1;
    }//判断是否闰年,是闰年则leap=1
    else
        leap = 0;
    if (leap)
        m[2] = 29;//是闰年则第二个月29天
    else
        m[2] = 28;
    for (i = 1, d = 0; i < month; i++)
        d += m[i];//d指代一年的第几天,d+=m指代把前面的月份都加起来
    d += day;//把这个月的第几天加起来
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值