1.作业:
完成学生管理系统
1> 使用菜单完成
2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入
3> 查看学生信息:输出所有学生姓名以及对应的分数
4> 求出学习最好的学生信息:求最大值
5> 按姓名将所有学生进行升序排序
6> 按成绩将所有学生进行升序排序
要求每个功能使用函数完成
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100
//定义全局变量
int num;
char name[N][20]={""};
int score[N]={0};
void caidan()//编辑菜单
{
printf("\t\t=====学生管理系统=====\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.查看信息\n");
printf("\t\t3.成绩最好的\n");
printf("\t\t4.按姓名将所有学生进行升序排序\n");
printf("\t\t5.按成绩将所有学生进行升序排序\n");
printf("\t\t0.退出\n");
}
void enter()//录入函数
{
printf("录入几个学生:");
scanf("%d",&num);
getchar();
for(int i=0;i<num;i++)
{
printf("他/她的姓名为:");
scanf("%s",name[i]);
printf("他/她的成绩为:");
scanf("%d",&score[i]);
}
}
void view()//输出函数
{
for(int i=0;i<num;i++)
{
printf("%s的成绩为:%d\n",name[i],score[i]);
}
}
void max()//求最大值函数
{
int maxi=score[0];
for(int i=0;i<num;i++)
{
if(maxi<score[i+1])
{
maxi=score[i+1];
}
}
printf("成绩最好的:%d",maxi);
}
void shengxu4()//按姓名升序
{
char temp[20] = "";
for(int i=1; i<num; i++)
{
for(int j=0; j<num-i; j++)
{
if(strcmp(name[j], name[j+1]) > 0)
{
strcpy(temp, name[j]);
strcpy(name[j], name[j+1]);
strcpy(name[j+1], temp);
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}
for(int i=0;i<num;i++)
{
printf("%s的成绩为:%d\n",name[i],score[i]);
}
}
void shengxu5()//按成绩升序
{
char temp2[20] = "";
for(int i=1; i<num; i++)
{
for(int j=0; j<num-i; j++)
{
if(score[j]>score[j+1])
{
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
strcpy(temp2, name[j]);
strcpy(name[j], name[j+1]);
strcpy(name[j+1], temp2);
}
}
}
for(int i=0;i<num;i++)
{
printf("%s的成绩为:%d\n",name[i],score[i]);
}
}
/******************主程序***************************/
int main(int argc, char const *argv[])
{
int menu=0;
while (1)
{
caidan();//调用菜单
printf("请输入:");
scanf("%d",&menu);
getchar();
switch (menu)
{
case 1:
{
enter();
}
break;
case 2:
{
view();
}
break;
case 3:
{
max();
}
break;
case 4:
{
shengxu4();
}
break;
case 5:
{
shengxu5();
}
break;
case 0:goto END;
default:printf("输入错误\n");
}
}
END:
return 0;
}
输出结果:
2.笔记
1.二维字符数组剩余部分
1.1引入目的:对于处理多个一维字符数组不方便时,可以引入二维字符数组
从该角度来看,二维字符数组其实就是一维字符串数组
1.2定义格式:char 数组名[常量1][常量2];
常量1:表示的是定义的字符串个数
常量2:表示的是每个字符串的最大长度+1
1.3初始化方式
1.单字符初始化:和二维整型一样
2.字符串初始化
1.4二维字符数组输入输出、求最值、排序
#include<myhead.h>
#define MAX 5 //定义字符串的个数
int main(int argc, const char *argv[])
{
//定义一个二维字符数组
char arr[MAX][20] = {""}; //定义了一个长度为MAX的字符串数组
//完成对字符串的输入输出
for(int i=0; i<MAX; i++)
{
printf("请输入第%d个字符串:", i+1);
scanf("%s", arr[i]);
}
//输出所有的字符串
printf("目前的字符串分别是:");
for(int i=0; i<MAX;i++)
{
printf("%s\t", arr[i]);
}
puts("");
//求最大字符串
char max[20] = ""; //用于存储最大字符串
//max = arr[0]; //字符串不能直接使用等号进行赋值
strcpy(max, arr[0]); //将第一个字符串当做最值
for(int i=0; i<MAX; i++)
{
//跟任意一个字符串进行比较
if(strcmp(max,arr[i]) < 0)
{
//更新最值
strcpy(max, arr[i]);
}
}
printf("最大字符串为:%s\n", max);
//将所有字符串进行排序
char temp[20] = ""; //交换变量
for(int i=1; i<MAX; i++) //外层控制趟数
{
for(int j=0; j<MAX-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<MAX;i++)
{
printf("%s\t", arr[i]);
}
puts("");
return 0;
}
2.函数概述
2.1引入目的
1. 系统会提供一些库函数供大家使用,但是,提供的函数毕竟有限,如果想要使用特别定制的函数,需要自己封装
2.对于一些重复调用的语句块而言,如果不加封装的话,会使得代码比较冗余
3. 为了提高编程效率,我们引入了函数,能够做到一处修改,处处修改
4.目前接触的函数:printf、scanf、putchar、getchar、puts、gets、strlen、strcmp、strcat、strcpy
2.2函数的定义
1.函数:执行特定功能的一段代码块
2.定义格式: 返回值类型 函数名(参数列表) { 函数体代码 }
2.3函数的分类
1. 对于函数定义格式而言,函数名和函数体代码是不可变的,但是,函数的返回值类型和函数的参数是可变的
2. 对于一个函数而言,返回值是可有可无的,参数也是可有可无的,根据此,函数分为四大类
3. 关于函数的相关概念
主调函数:调用别的函数的函数叫做主调函数
被调函数:被别的函数调用的那个函数称为被调函数
形式参数:也称形参,定义函数时,括号里面的参数称为形参
实际参数:也称实参,函数调用时,括号里面的参数称为实参
4. 函数调用格式:变量名 = 函数名(实参列表);
3.函数与变量的关系
1. 局部变量:定义在函数内部的变量称为局部变量
局部变量的表现形式:定义在函数体内的变量
函数的形式参数
定义在语句块内的变量
局部变量的作用域:从定义开始,到函数结束(语句块内的变量到语句结束)
注意:不同作用域下的局部变量可以同名
2..全局变量:也称全程变量和外部变量,就是定义在函数体外部的变量
作用域:从定义开始到整个程序结束为止,该变量定义后的任意一个函数都可以使用他
注意:局部变量可以跟全局变量同名,函数体内使用的默认是局部变量(就近访问原则,局部优先原则)
如果非要使用全局变量,也不是不可以,需要使用关键字 extern 来声明
3. 静态局部变量:在函数体内定义一个功能上类似于全局变量的局部变量
定义格式:static 数据类型 变量名;
作用域:只能在函数体内被使用,但是,生命周期随着整个程序的结束而结束
4.数组作为函数的参数传递
1.数组的要素:起始地址(数组名),数组的容量
2. 数组作为函数参数传递,属于地址传递,形参内容的改变,实参内容也会跟着改变
3. 定义形参接受数组时,接受数组名时,只需要定义一个变量标识数组即可
标签:20040710,定义,int,坐牢,strcpy,数组,printf,第七天,函数 From: https://blog.csdn.net/m0_62828714/article/details/140333783