Linux C语言基础 day8

目录

思维导图:

学习目标:

学习内容:

[1. 字符数组](#1. 字符数组)

[1.1 二维字符数组](#1.1 二维字符数组)

[1.1.1 格式](#1.1.1 格式)

[1.1.2 初始化](#1.1.2 初始化)

[1.1.3 二维字符数组输入输出、求最值、排序](#1.1.3 二维字符数组输入输出、求最值、排序)

[2. 函数](#2. 函数)

[2.1 概念](#2.1 概念)

关于函数的相关概念

[2.2 函数的定义及调用](#2.2 函数的定义及调用)

[2.2.1 定义函数的格式](#2.2.1 定义函数的格式)

[2.3 函数的分类](#2.3 函数的分类)

[1. 无参无返回值函数](#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);

}

相关推荐
汉克老师3 分钟前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
爱吃生蚝的于勒42 分钟前
C语言最简单的扫雷实现(解析加原码)
c语言·开发语言·学习·计算机网络·算法·游戏程序·关卡设计
Ai 编码助手1 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm1 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
hummhumm1 小时前
第 8 章 - Go语言 数组与切片
java·开发语言·javascript·python·sql·golang·database
何曾参静谧1 小时前
「QT」文件类 之 QDir 目录类
开发语言·qt
何曾参静谧1 小时前
「QT」文件类 之 QTemporaryDir 临时目录类
开发语言·qt
杜杜的man1 小时前
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
开发语言·后端·golang
qq_308957471 小时前
Gin 框架入门(GO)-1
开发语言·golang·gin
杨荧2 小时前
【JAVA毕业设计】基于Vue和SpringBoot的宠物咖啡馆平台
java·开发语言·jvm·vue.js·spring boot·spring cloud·开源