day08 1.函数

作业:

完成学生管理系统

1> 使用菜单完成

2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入

3> 查看学生信息:输出所有学生姓名以及对应的分数

4> 求出学习最好的学生信息:求最大值

5> 按姓名将所有学生进行升序排序

6> 按成绩将所有学生进行升序排序

要求每个功能使用函数完成

#include <stdio.h>
#include <string.h>
#define M 100	
char arr[M][20]={""};
int sum = 0;
int brr[M]={0};

void print_menu()//菜单函数
{
	printf("======学生管理系统=======\n");
	printf("=======1、信息录入=======\n");
	printf("=======2、信息查看=======\n");
	printf("=======3、成绩最好的学生=======\n");
	printf("=======4、姓名升序排列=======\n");
	printf("=======5、成绩升序排列=======\n");
	printf("=======0、退出=======\n");
}

void scan_stu()//学生信息录入函数
{
	printf("请输入学生的个数:");
	scanf("%d",&sum);

	for(int i=0;i<sum;i++)
	{
		printf("请输入第%d个学生的姓名:",i+1);
		scanf("%s",arr[i]);
	}

	for(int i=0;i<sum;i++)
	{
		printf("请输入%s的成绩:",arr[i]);
		scanf("%d",&brr[i]);
	}
}

void cat_stu()
{
	printf("学生的成绩分别为:\n");
	for(int i=0;i<sum;i++)
	{
		printf("%s:%d\n",arr[i],brr[i]);
	}
}
void scan_max()
{
	int maxi=0;
	for(int i=0;i<sum;i++)
	{
		if(brr[maxi]<brr[i])
		{
			maxi=i;
		}
	}
	printf("学习最好的学生信息:%s:%d\n",arr[maxi],brr[maxi]);
}


void up_name()
{
	char temp[20]="";
	for(int i=1;i<sum;i++)
	{
		for(int j=0;j<sum-i;j++)
		{
			if(strcmp(arr[j],arr[j+1])> 0)
			{
				strcpy(temp,arr[j]);
				strcpy(arr[j],arr[j+1]);
				strcpy(arr[j+1],temp);
			}
		}
	}
	printf("排序后的字符串为:");
	for(int i=0;i<sum;i++)
	{
		printf("%s\t",arr[i]);
	}
	puts("");
}

void up_score()
{
	int max=0;
	for(int i=1;i<sum;i++)
	{
		for(int j=0;j<sum-i;j++)
		{
			if(brr[j]>brr[j+1])
			{
				max = brr[j];
				brr[j] = brr[j+1];
				brr[j+1] = max;
			}
		}
	}
	printf("排序后成绩为:");
	for(int i=0;i<sum;i++)
	{
		printf("%d\t",brr[i]);
	}
	puts("");
}

int main(int argc, const char *argv[])
{
	int menu=0;
	while(1)
	{
		print_menu();      //调用菜单函数

		printf("请输入>>>");
		scanf("%d",&menu);
		getchar();
		//多分支选择
		switch(menu)
		{
		case 1:
			{	
				scan_stu();
			}
			break;
		case 2:
			{
				cat_stu();
			}
			break;
		case 3:
			{
				scan_max();
			}
			break;
		case 4:
			{
				up_name();
			}
			break;
		case 5:
			{
				up_score();
			}
			break;
		case 0:
			{
				printf("您输入的信息有误,请重新输入:\n");
			}
		}
	}
	return 0;
}

1.函数概述

1.1 引入目的

1> 系统会提供一些库函数供大家使用,但是,提供的函数毕竟有限,如果想要使用特别定制的函数,需要自己封装

2> 对于一些重复调用的语句块而言,如果不加封装的话,会使得代码比较冗余

3> 为了提高编程效率,我们引入了函数,能够做到一处修改,处处修改

4> 目前接触的函数:printf、scanf、putchar、getchar、puts、gets、strlen、strcmp、strcat、strcpy

1.2    函数的定义


1>    函数:执行特定功能的一段代码块
2>    定义格式: 返回值类型  函数名(参数列表) {  函数体代码  }

1、返回值类型:函数执行后,向外界返回的一个结果值,可以有结果(非void),也可以没有结果(void)
定义函数时:有返无返看主调,主调函数想要数据,就定义有返回值函数,主调函数要什么类型的结果,就定义什么数据类型。主调函数不要数据,就定义void类型
2、函数名:是一个标识符,要符合命名规则
3、():小括号是函数的标识,即使是没有参数的函数调用时也要将括号加上
4、参数列表:可以有,也可以没有,表示外界向该函数体提供的数据
定义函数时:有参无参看主调,主调函数给数据,就定义有参函数,主调函数给几个数据,就定义几个参数接收,主调函数给什么类型的数据,就定义什么类型的参数接收。主调函数不给数据,就不定义参数
5、{}:要封装的函数体代码,要用花括号包裹起来
6、函数体代码:要被封装的内容

1.3    函数的分类


1>    对于函数定义格式而言,函数名和函数体代码是不可变的,但是,函数的返回值类型和函数的参数是可变的
2>    对于一个函数而言,返回值是可有可无的,参数也是可有可无的,根据此,函数分为四大类

1、无参无返回值函数:该函数,仅仅只是单纯执行特定的代码,没有数据传入,也不需要返回结果,仅仅只是执行一个过程
        函数定义格式: void  函数名(void) {}
        例如:void print_menu(void);
 
2、有参无返回值函数:该函数,需要主调函数传入给定的数据后,才能进行执行该功能,但是,执行结束后,没有返回结果
        函数定义格式:void 函数名(形参列表) {}
        例如:void print_arr(int arr[], int n);
 
3、无参有返回值函数:该函数无需外界传入数据,直接执行内部语句,并且执行结束后,会向主调函数返回一个确定的数据
        函数定义格式:返回值类型 函数名(void){}
        例如:int getchar(void);
 
4、有参有返回值函数:该函数需要外界提供对应的参数,执行函数体代码后,并向主调函数返回一个确定的值
        函数定义格式:返回值类型 函数名(参数列表) {}
        例如:int strlen(char *src);
 

3> 关于函数的相关概念

主调函数:调用别的函数的函数叫做主调函数

被调函数:被别的函数调用的那个函数称为被调函数

形式参数:也称形参,定义函数时,括号里面的参数称为形参

实际参数:也称实参,函数调用时,括号里面的参数称为实参

4>    函数调用格式:变量名 =  函数名(实参列表);

#include<myhead.h>
 
//定义菜单函数
void print_menu()
{
		printf("\t\t======1、无参无返回值函数======\n");
		printf("\t\t======2、有参无返回值函数======\n");
		printf("\t\t======3、无参有返回值函数======\n");
		printf("\t\t======4、有参有返回值函数======\n");
		printf("\t\t======0、退出======\n");
}
 
 
 
//定义无参无返回值函数
void sum_1(void)
{
	int num,key;
	printf("请输入两个数:");
	scanf("%d%d", &num, &key);
	int sum = num + key;          //求两数的和
	printf("sum = %d\n", sum);
}
 
//定义有参无返回值函数
void sum_2(int m, int n)
{
	int sum = m+n;        //将传入的两个数据求和
 
	printf("sum = %d\n", sum);        //输出结果
 
}
 
//定义无参无返回值函数
int sum_3()
{
	int num,key;
	printf("请输入两个数:");
	scanf("%d%d", &num, &key);
	int sum = num + key;          //求两数的和
 
	//将求出的和值,返回值给主调函数使用
	return sum;
}
 
//定义有参有返回值函数
int sum_4(int m, int n)
{
	int sum = m+n;
 
	return sum;
}
 
 
 
 
 
/************************主程序****************************/
int main(int argc, const char *argv[])
{
	//做个菜单
	int menu = 0;
	while(1)
	{
		print_menu();           //调用菜单函数
 
		printf("请输入>>>");
		scanf("%d", &menu);
		getchar();
 
		//多分支选择
		switch(menu)
		{
		case 1:
			{
				sum_1();      //调用无参无返回值函数
			}
			break;
 
		case 2:
			{
				int num,key;         //这两个数据是主调函数中的
				printf("请输入两个数:");
				scanf("%d%d", &num, &key);    
 
				sum_2(num, key);        //调用有参无返回值函数
 
			}
			break;
		case 3:
			{
				//要求调用一个函数,不传递任何数据
				//并且要得到该函数的结果,由主调函数输出
				int sum = sum_3();      //无参有返回值函数调用
 
				printf("sum = %d\n", sum);
			}
			break;
		case 4:
			{
				int num,key;         //这两个数据是主调函数中的
				printf("请输入两个数:");
				scanf("%d%d", &num, &key);    
				
				int sum = sum_4(num, key);          //调用有参有返回值函数
				
				printf("sum = %d\n", sum);
 
			}
			break;
		case 0: goto END;
		default:printf("您输入的功能有误,请重新输入\n");
		}
	}
 
END:
	return 0;
}

1.4    函数与变量的关系
1>    局部变量:定义在函数内部的变量称为局部变量
                局部变量的表现形式:定义在函数体内的变量
                                         函数的形式参数
                                         定义在语句块内的变量
        局部变量的作用域:从定义开始,到函数结束(语句块内的变量到语句结束)
        注意:不同作用域下的局部变量可以同名
2>    全局变量:也称全程变量和外部变量,就是定义在函数体外部的变量
        作用域:从定义开始到整个程序结束为止,该变量定义后的任意一个函数都可以使用他
        注意:局部变量可以跟全局变量同名,函数体内使用的默认是局部变量(就近访问原则,局部优先原则)
        如果非要使用全局变量,也不是不可以,需要使用关键字 extern 来声明

 3>    静态局部变量:在函数体内定义一个功能上类似于全局变量的局部变量
                定义格式:static 数据类型  变量名;
                作用域:只能在函数体内被使用,但是,生命周期随着整个程序的结束而结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值