目录
思维导图:
学习目标:
学习内容:
1. 字符数组
1.1 二维字符数组
1.1.1 格式
1.1.2 初始化
1.1.3 二维字符数组输入输出、求最值、排序
2. 函数
2.1 概念
关于函数的相关概念
2.2 函数的定义及调用
2.2.1 定义函数的格式
2.3 函数的分类
1. 无参无返回值函数
2、有参无返回值函数
3、无参有返回值函数
4、有参有返回值函数
例如:
课堂练习:
课外作业:
思维导图:
学习目标:
例如:
- 一周掌握 C基础知识
学习内容:
1. 字符数组
1.1 二维字符数组
1.1.1 格式
char 数组名[常量1][常量2];
常量1:表示的是定义的字符串的个数
参数2:表示的是每个字符串的最大长度+1
1.1.2 初始化
1、单字符初始化:该方式跟二维整形数组一致
2、字符串初始化:
全部初始化:char arr[3][8] = {"apple", "banana", "orange"}; arr[0] arr[1] arr[2]
特殊初始化:char arr[ ][8] = {"apple", "banana", "orange"}; //此时省略的第一维,会根据初始化字符串的个数确定
部分初始化:char arr[5][8] = {"apple", "banana", "orange"}; //没有初始化的字符串 默认为空串
1.1.3 二维字符数组输入输出、求最值、排序
例如:
#include<stdio.h>
#include<string.h>
#define MAX 5
int main(int argc, const char *argv[])
{
char arr[MAX][20]={""};
char brr[MAX][20]={""};
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]={""};
stpcpy(max,arr[0]);
for(int i=0;i<MAX;i++){
if(strcmp(max,arr[i])){
strcpy(max,arr[i]);
}
}
printf("最大字符串为:%s\n", max);
//将所有字符串进行排序
char temp[20]={""};
for(int i=0;i<MAX;i++){
for ( int j= 0; j < MAX-i; j++)
{
if(strcmp(arr[j],arr[j+1]) > 0){
strcpy(temp,arr[i]);
strcpy(arr[i],arr[i+1]);
strcpy(arr[i+1],temp);
}
}
}
//输出排序后的结果
printf("目前的字符串分别是:");
for(int i=0; i<MAX;i++)
{
printf("%s\t", arr[i]);
}
puts("");
}
2. 函数
2.1 概念
将能实现某些功能的代码封装成代码块,然后通过通过代码块的名字就能调用到该部分的代码,这样,在多次相同操作的场景下,可以减少由于重复代码导致的劳动量,这个代码块,就是函数,代码块的名字,就是函数名。
例:strlen strcpy printf scanf atoi。
关于函数的相关概念
主调函数:调用别的函数的函数叫做主调函数
被调函数:被别的函数调用的那个函数称为被调函数
形式参数:也称形参,定义函数时,括号里面的参数称为形参
实际参数:也称实参,函数调用时,括号里面的参数称为实参
2.2 函数的定义及调用
2.2.1 定义函数的格式
返回值类型 函数名(函数的形参列表){ 函数体; }
2.3 函数的分类
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);
例如:
#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;
}
课堂练习:
#include<stdio.h>
void print_menu()
{
printf("\t\t======1、第一题======\n");
printf("\t\t======2、第二题======\n");
printf("\t\t======3、第三题======\n");
printf("\t\t======0、退出======\n");
}
void max1(int num,int key){
if(num > key){
printf("最大值为%d\n",num);
}else
{
printf("最大值为%d\n",key);
}
}
int max2(){
int a[5]={0};
for (int i = 0; i < 5; i++)
{
printf("请输入该数组的第%d个值",i+1);
scanf("%d",&a[i]);
}
printf("\n");
int max1=a[0];
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(max1 < a[j]){
max1=a[j];
}
}
}
return max1;
}
int con(int a,int b,int c){
if((a+b)<=c || (a+c)<=b || (c+b)<=a){
return -1;
}else if (a==b && b==c && c==a)
{
return 2;
}else if (a==b || b==c || c==a )
{
return 1;
}else
{
return 0;
}
}
int main(int argc, char const *argv[])
{
int menu=0;
while (1)
{
print_menu();
printf("请输入>>>");
scanf("%d", &menu);
getchar();
switch(menu)
{
case 1:{
int num,key;
printf("请输入两个数:");
scanf("%d%d", &num, &key);
max1(num,key);}
break;
case 2:
{
int max1=max2();
printf("最大值为%d\n",max1);
}
break;
case 3:
{
int x=0,y=0,z=0;
while (1)
{
printf("请输入三角形的三条边:");
scanf("%d%d%d",&x,&y,&z);
int a=con(x,y,z);
if(a==-1){
printf("不能构成三角形,请重新输入\n");
}else if (a==0)
{
printf("构成普通三角形\n");
break;
}else if (a==1)
{
printf("构成等腰三角形\n");
break;
}else if (a==2)
{
printf("构成等边三角形\n");
break;
}
}
}
break;
case 0: goto END;
default:printf("您输入的功能有误,请重新输入\n");
}
}
END:
return 0;
}
课外作业:
完成学生管理系统
1> 使用菜单完成
2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入
3> 查看学生信息:输出所有学生姓名以及对应的分数
4> 求出学习最好的学生信息:求最大值
5> 按姓名将所有学生进行升序排序
6> 按成绩将学生学生进行升序排序
要求每个功能使用函数完成
解析:
方法一:
#include<stdio.h>
#include<string.h>
#define MAX 50
char names[MAX][50];
int scores[MAX];
int count = 0;
void print_menu(); //菜单
void enterstu(); // 学生信息录入
void findstu(); // 查看所有学生信息
void findtopstu(); // 寻找学习成绩最好的学生
void sortnamestu(); // 按姓名将学生进行升序排序
void sortscorestu(); // 按成绩将学生进行升序排序
int main(int argc, char const *argv[])
{
//做个菜单
int menu = 0;
while(1)
{
print_menu(); //调用菜单函数printf("请输入>>>");
scanf("%d", &menu);
getchar();//多分支选择
switch (menu)
{
case 1:
enterstu();
break;
case 2:
findstu();
break;
case 3:
findtopstu();
break;
case 4:
sortnamestu();
break;
case 5:
sortscorestu();
break;
case 0: goto END;
default:printf("您输入的功能有误,请重新输入\n");
}
}
END:
return 0;
}//菜单
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======5、按成绩将所有学生就行升序排序======\n");
printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(){
printf("请输入学生个数:");
scanf("%d",&count);//输入学生个数
for(int i=0;i<count;i++){
printf("输入第%d个学生姓名:",i+1);
scanf("%s", names[i]);
if (strcmp(names[i], "\n") == 0) { //换行
return;
}
printf("输入学生分数:");
scanf("%d", &scores[i]);
}
}
// 查看所有学生信息
void findstu(){
for(int i=0;i<count;i++){
printf("学生姓名:%s成绩:%d\n",names[i],scores[i]); //输出学生姓名以及对应的成绩
}
printf("\n");
}
// 寻找学习成绩最好的学生
void findtopstu(){
int top = 0;
for (int i = 0; i < count; i++)
{
if(scores[top] < scores[i] ){
scores[top] = scores[i]; //寻找成绩最高的学生
}
}
printf("最好成绩学生姓名为:%s,成绩为%d。\n",names[top],scores[top]); //输出最好成绩的学生姓名和成绩
}
// 按姓名将学生进行升序排序
void sortnamestu(){
char temp[MAX];
int tempx=0;
for (int i = 1; i < count; i++)
{
for (int j = 0; j < count - i; j++)
{
if(strcmp(names[j],names[j+1]) > 0){ //进行交换三部曲
strcpy(temp,names[j]);
strcpy(names[j],names[j+1]);
strcpy(names[j+1],temp);
tempx = scores[j];
scores[j]=scores[j+1];
scores[j+1]=tempx;
}
}
}
findstu();
}
// 按成绩将学生进行升序排序
void sortscorestu(){
char temp[MAX];
int tempx=0;
for (int i = 1; i < count; i++)
{
for (int j = 0; j < count - i; j++)
{
if(scores[j] > scores[j+1]){ //进行交换三部曲
strcpy(temp,names[j]);
strcpy(names[j],names[j+1]);
strcpy(names[j+1],temp);
tempx = scores[j];
scores[j]=scores[j+1];
scores[j+1]=tempx;
}
}
}
findstu();
}
方法二:
#include <stdio.h>
#include <string.h>#define MAX 5
// 函数声明
void print_menu();
void enterstu(char students[][50],int scores[], int *count);
void findstu(char students[][50],int scores[], int count);
void findtopStu(char students[][50], int scores[], int count, int top);
void sortnamestu(char students[][50], int scores[], int count);
void sortscorestu(char students[][50], int scores[], int count);int main() {
char students[MAX][50];
int scores[MAX];
int count = 0;
int top=0;
int menu=0;while(1)
{
print_menu(); //调用菜单函数printf("请输入>>>");
scanf("%d", &menu);
getchar();//多分支选择
switch (menu)
{
case 1:
enterstu(students,scores, &count);break;
case 2:
findstu(students,scores, count);
break;
case 3:
findtopstu(students, scores, count, top);
break;
case 4:
sortnamestu(students, scores, count);
break;
case 5:
sortscorestu(students, scores, count);
break;
case 0: goto END;
default:printf("您输入的功能有误,请重新输入\n");
}
}
END:
return 0;
}
//菜单
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======5、按成绩将所有学生就行升序排序======\n");
printf("\t\t======0、退出======\n");
}
// 学生信息录入
void enterstu(char students[][50],int scores[], int *count) {
printf("输入学生个数:");
scanf("%d", count);
for (int i = 0; i < *count; i++) {
printf("输入学生 #%d 的姓名:", i + 1);
scanf("%s", students[i]);
printf("输入学生 #%d 的分数:", i + 1);
scanf("%d", &scores[i]);
}
}// 查看所有学生信息
void findstu(char students[][50], int scores[],int count) {
for (int i = 0; i < count; i++) {
printf("姓名:%s 分数:%d\n", students[i], scores[i]);
}
}// 寻找学习最好的学生
void findtopstu(char students[][50], int scores[], int count, int top) {
for (int i = 0; i < count; i++)
{
if(scores[top] < scores[i] ){
scores[top] = scores[i]; //寻找成绩最高的学生
}
}
printf("最好成绩学生姓名为:%s,成绩为%d。\n",students[top],scores[top]); //输出最好成绩的学生姓名和成绩
}// 按姓名将学生进行升序排序
void sortnamestu(char students[][50], int scores[], int count) {
char temp[MAX];
int tempx=0;
for (int i = 1; i < count; i++)
{
for (int j = 0; j < count - i; j++)
{
if(strcmp(students[j],students[j+1]) > 0){ //进行交换三部曲
strcpy(temp,students[j]);
strcpy(students[j],students[j+1]);
strcpy(students[j+1],temp);
tempx = scores[j];
scores[j]=scores[j+1];
scores[j+1]=tempx;
}
}
}
printf("按姓名排序后的学生信息:\n");
findstu(students, scores,count);
}// 按成绩将学生进行升序排序
void sortscorestu(char students[][50], int scores[], int count) {
char temp[MAX];
int tempx=0;
for (int i = 1; i < count; i++)
{
for (int j = 0; j < count - i; j++)
{
if(scores[j] > scores[j+1]){ //进行交换三部曲
strcpy(temp,students[j]);
strcpy(students[j],students[j+1]);
strcpy(students[j+1],temp);
tempx = scores[j];
scores[j]=scores[j+1];
scores[j+1]=tempx;
}
}
}
printf("按成绩排序后的学生信息:\n");
findstu(students, scores,count);
}