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);

}

相关推荐
迷迭所归处1 分钟前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ30 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
leon62531 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
Navigator_Z1 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
锦亦之22331 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏1 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2332 小时前
c++ static(详解)
开发语言·c++
菜菜想进步2 小时前
内存管理(C++版)
c语言·开发语言·c++
2301_789985942 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
知星小度S2 小时前
C语言——自定义类型
c语言·开发语言