Linux C语言基础 day9

news2024/9/28 9:27:28

目录

思维导图

学习目标:

学习内容:

1. 值传递与地址传递(非常重要)

1.1 值传递

1.2 地址传递

2. 递归函数

2.1 递归的概念

2.2 递归条件

2.3 递归思想

3. 指针

3.1 指针相关概念

3.2 指针变量的定义

3.2.1. 定义格式

3.2.2. 指针变量的初始化

3.3 指针变量的使用

课内练习:

课外作业:


思维导图


学习目标:

  • 一周掌握 C基础知识

学习内容:

1. 值传递与地址传递(非常重要)

1.1 值传递

说明:

        值传递过程中,形参与实参操作的是不同的内存空间

        当普通变量作为函数参数传递时,是单向的值传递,仅仅只是将实参的值,复制一份给形参使用,形参的改变不会影响到实参的值

例如:

#include<stdio.h>

//定义交换函数

void swap_1(int m, int n)

{

    //完成两个数的交换

    int temp = m;

    m = n;

    n = temp;

    printf("交换后,swap_1:: m = %d, n = %d\n", m, n);

}


 

/*********************主程序*********************/

int main(int argc, const char *argv[])

{

    //定义两个变量

    int num = 520;

    int key = 1314;

    //调用交换函数

    swap_1(num, key);

    printf("交换后,main:: num = %d, key = %d\n", num, key);


 

    return 0;

}

1.2 地址传递

说明:

        当实参传递的是数组名、指针或变量的地址(&num)时,可以理解成是地址传递

        地址传递过程中,形参与实参操作的是同一块内存空间

        形参对内存空间进行改变时,实参也跟着一起改变

例如:

#include<stdio.h>

//定义冒泡排序函数

void sort_up(int brr[], int n)

{

    printf("sizeof(brr) = %ld\n", sizeof(brr));   //

    //进行冒泡排序

    for(int i=1; i<n; i++)

    {

        for(int j=0; j<n-i; j++)

        {

            if(brr[j] > brr[j+1])

            {

                int temp = brr[j];

                brr[j] = brr[j+1];

                brr[j+1] = temp;

            }

        }

    }

    printf("排序结束\n");

}



 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    //定义一个一位数组并初始化

    int arr[5] = {2,8,1,6,7};

    printf("sizeof(arr) = %ld\n", sizeof(arr));    //20

    //调用冒泡排序函数,完成升序排序

    sort_up(arr, 5);

    //输出排序后的结果

    printf("排序后:");

    for(int i=0; i<5; i++)

    {

        printf("%d\t", arr[i]);

    }

    printf("\n");

    return 0;

}

2. 递归函数

2.1 递归的概念

        所谓递归,就是一个函数直接或间接的形式调用自身,这样的函数调用,我们称为递归调用

2.2 递归条件

1. 递归出口:用于终止递归进行进行的条件

2. 递归表达式:能够让递归继续进行的函数调用

2.3 递归思想

        当直接解决规模比较大的问题不能进行时,需要先解决规模较小的原理一致的问题后,大的问题得以解决时,可以考虑使用递归

        逐层分解,逐层合并

例如:

#include<stdio.h>


 

int jiecheng(int n)

{

    if(n==0){

        return 1;

    }else

        return n*jiecheng(n-1);

}


 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    int res = jiecheng(5);

    printf("%d",res);

    return 0;

}

3. 指针

3.1 指针相关概念

1. 引入目的:能够从地址的角度,找到内存中的数据,而不是以变量的角度去找,效率较高

2.  指针:就是内存地址编号

3.  指针变量:由于指针这个地址编号很难记忆,我们引入指针变量存储指针

存储地址的变量称为指针变量

4.  指针变量中,只能存储地址,作为一个特殊的数据类型,其大小是固定的 8 字节

3.2 指针变量的定义

3.2.1. 定义格式

        数据类型 * 指针名;

        例如:int * ptr;

3.2.2. 指针变量的初始化

        1、使用一个相同数据类型的变量的地址为其进行初始化

                int num = 520; int * ptr = &num //将num的地址赋值个指针变量 ptr //定义一个指针变量ptr,指向num

        2、使用一个已经初始化了的指针变量给一个新的指针变量进行初始化

                int * qtr = ptr; //此时表示两个指针变量同时存储了num的地址 int *qtr =&num

        3、使用地址的0 就是 NULL为其初始化

                int *wtr = NULL;

        4、注意:没有初始化的指针变量不能直接使用,因为该指针变量中存储了一个随机地址,如果对其进行更改,可能会导致系统瘫痪

        5、野指针:指向非法内存的指针称为野指针 产生情况:

                1)定义指针时,没有为其进行初始化

                2) 指向了一个内存空间,但是随着程序的进行,该内存空间被回收了,那么该指针也是野指针(悬空指针)

                3) 数组下标越界时,访问的地址也是野指针

3.3 指针变量的使用

        使用运算符 ‘ * ’来取得指针变量中的值,我们也称该运算为 取值运算

        &与*在指针的方面,互为逆运算

        int num = 520; int *ptr = &num;

                1) *&num ==> *(&num) ==> *(ptr) ==> num

                2) &*ptr ==> &(*ptr) ==> &(num) ==> ptr

                3) *&ptr ==>*(&ptr) ==> *(ptr的二级地址) ==> ptr

                4) &*num ==>报错


课内练习:

1.求n!结果

解析:

2.求斐波那契数列第n项的值

1 1 2 3 5 8 13 21 。。。

解析:


课外作业:

1.使用递归实现 求 n 的 k 次方

解析:

#include<stdio.h>

//函数

int jiecheng(int n,int k)

{

    if(k==0){

        return 1;

    }else

        return n*jiecheng(n,k-1); //返回n*n*......*n(k个n)

}


 

/****************主程序********************/

int main(int argc, const char *argv[])

{

    int k=0,n=0;

    printf("请输入底数n与指数k:");

    scanf("%d%d",&n,&k);

    int res = jiecheng(n,k);      //调用函数

    printf("值为:%d",res);

    return 0;

}

2.使用递归实现 strlen 的功能

解析:

#include<stdio.h>
int rec(char *str) {
    // 基本情况:如果字符串为空,则长度为0
    if (*str == '\0') {
        return 0;
    } else {
        // 递归步骤:当前字符加上剩余字符串的长度
        return 1 + rec(str + 1);
    }
}
int main(int argc, char const *argv[])
{
    char str[101]; // 假设输入的字符串长度不超过100
    printf("请输入一个字符串:");
    gets(str);              //获取字符串
    int len = rec(str);             //调用函数
    printf("字符串的长度是:%d\n", len);
    return 0;
}
 

3.使用递归实现汉诺塔问题

解析:

#include<stdio.h>
int  hanuo(int n) {
    if (n == 1) {
        return 1;
    } else {
        return hanuo(n-1)*2+1;
    }
}
int main(int argc, char const *argv[])
{
    int n=0;
    printf("请输入n的值:");
    scanf("%d",&n);
    int sum=hanuo(n);
    printf("次数为%d\n",sum);
    return 0;
}
 

4.定义一个函数将一个字符串从大到小排序

解析:

#include <stdio.h>
#include<string.h>
#define MAX 50
// 函数声明
int  change(char a[]);
int main() {
    char a[MAX];
    printf("请输入字符串:");
    scanf("%s",a);
    change(a);                          //调用函数
    printf("字符串从大到小排序为:%s\n",a);
    return 0;
}

int change(char a[]){
    int len=0;                          
    len= strlen(a);                 //定义数组长度
    int max=0;
    for (int i = 1; i < len; i++)             
    {
        for(int j=0;j <len-i;j++ ){
            if(a[j] > a[j+1]){                              //判断大小,进行交换三部曲
                 char temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}

5.实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)

解析:

#include <stdio.h>
#include<string.h>
#define MAX 50
int huiwen(char s[]){
    int left=0;                                  //定义最左边下标
    int right = strlen(s)-1;          //定义最右边下标
    while (left <= right)
    {
       if(s[left] == s[right]){         //判断是否相等
           return 1;
           left++;                                  //逐渐向右递增
           right--;                                 //逐渐向左递增
       }else
       {
           return 0;
       }   
    }
}
int main() {
    char a[MAX];
    printf("请输入字符串:");
    scanf("%s",a);
    if(huiwen(a)==1){
        printf("是回文字符串\n");
    }else
    {
       printf("不是回文字符串\n");
    }
    return 0;
}

6.使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储

解析:

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int a=0x12345678;
    char *p=&a;
    if(*p == 0x78){
        printf("为小端存储\n");
    }else if(*p ==0x12 ){
        printf("为大端存储\n");
    }
    return 0;
}
 

7.

解析:

#include<stdio.h>
#include<string.h>
#define MAX    50
int count(char a[MAX]){
    int sum=0;
    int inWord=0;
    gets(a);
        for (int i = 0; a[i] != '\0'; i++) {             
        if ((a[i] >= 'A' && a[i] <= 'Z') ||(a[i] >= 'a' && a[i] <= 'z')) {               // 检查当前字符是否为字母
            if (inWord==0) {                  // 如果之前不在单词中,现在是单词的开始
                sum++;                          // 增加单词计数
                inWord = 1; // 标记现在在单词中
            }
        } else {
            // 如果当前字符不是字母或数字,不在单词中
            inWord = 0;
        }
    }
    printf("单词数为%d个\n",sum);
}
int main(int argc, char const *argv[])
{
    char a[MAX];
    count(a);
    return 0;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识MVVM分层思想——05

1.MVVM是什么&#xff1f; M &#xff1a;model&#xff08;模型/数据&#xff09; V : view&#xff08;试图&#xff09; VM &#xff1a;ViewModel &#xff08;试图模型&#xff09; &#xff1a; VM 是MVVM 中的核心部分。&#xff08;它起到一个核心的非常重要的作用&…

mac下mysql无法登陆的问题

用如下命令登录出现错误。 sudo mysql.server start解决方案 使用如下命令登录 sudo /usr/local/MySQL/support-files/mysql.server start

【C++基础】初识C++(1)

目录 一、认识C 1.1 C 相关概念 1.2 C的发展 1.3 C的关键字 1.4 第一个程序 二、命名空间 2.1 namespace的定义 2.2 命名空间的使用 三、C输入和输出 四、缺省函数 五、函数重载 一、认识C 1.1 C 相关概念 1983年&#xff0c;Bjarne Stroustrup在C语⾔的基础上…

Python 视频的色彩转换

这篇教学会介绍使用OpenCV 的cvtcolor() 方法&#xff0c;将视频的色彩模型从RGB 转换为灰阶、HLS、HSV...等。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#x…

BMS电池管理系统 — 1 什么是BMS

目录 1 储能系统组成 1.1 储能电池结构 1.2 储能集装箱组成 2 BMS系统组成 3 BMS功能 3.1 SOC荷电状态估计 3.2 SOH估计 3.3 主动均衡与被动均衡 3.4 电池热管理 4 BMS架构 4.1 集中式BMS 4.2 分布式BMS 参考论文 1 储能系统组成 1.1 储能电池结构 电芯&#xf…

docker(六)--创建镜像

六、创建镜像 1.创建镜像两种方式 方式1&#xff1a; 更新镜像 docker commit 方式2&#xff1a;构建镜像 docker build 2.更新镜像 1&#xff09;用法 docker commit -m“描述信息” -a作者 容器id或者容器名 镜像名:tag 2&#xff09;步骤 ①根据镜像运行容器 ②进入容…

PHP将两张图片合成一张图片代码实例(源代码)

使用PHP将两张图片合成一张图片可以通过GD库来实现。下面是一个示例代码&#xff0c;展示如何将两张图片合成一张图片&#xff1a; 加载两张图片。获取每张图片的宽度和高度。创建一个新的空白图片&#xff0c;其宽度是两张图片宽度的和&#xff0c;高度是两张图片中较大的高度…

酒店民宿小程序:酒店民宿便利预订,提高收益!

在旅游业发展旺盛时期&#xff0c;酒店民宿也得到了快速发展。随着移动互联网的发展&#xff0c;人们逐渐在手机上预订酒店民宿&#xff0c;这给酒店民宿小程序的发展提供了用户基础&#xff0c;为大众出行带来了更多的便利。 酒店民宿小程序是一个基于微信平台的应用程序&…

PHP计件工资系统小程序源码

解锁高效管理新姿势&#xff01;全面了解计件工资系统 &#x1f525; 开篇&#xff1a;为什么计件工资系统成为企业新宠&#xff1f; 在这个效率至上的时代&#xff0c;企业如何精准激励员工&#xff0c;提升生产力成为了一大挑战。计件工资系统应运而生&#xff0c;它以其公…

Python大数据分析——K近邻模型(KNN)

Python大数据分析——K近邻模型 数学部分模型思想模型步骤距离度量指标欧氏距离曼哈顿距离余弦相似度 K值选择 代码部分函数示例1——知识掌握程度示例2——预测发电量 数学部分 模型思想 如图所示&#xff0c;模型的本质就是寻找k个最近样本&#xff0c;然后基于最近样本做“…

qml 实现一个带动画的switch 按钮

一.效果图 》 二.qml 代码 import QtQuick 2.12 import QtQuick.Controls 2.12Switch {id: controlimplicitWidth: 42implicitHeight: 20indicator: Rectangle {id: bkRectangleanchors.fill: parentx: control.leftPaddingy: parent.height / 2 - height / 2radius: height …

C语言有哪些特点?

C语言是一种结构化语言&#xff0c;它有着清晰的层次&#xff0c;可按照模块的方式对程序进行编写&#xff0c;十分有利于程序的调试&#xff0c;且c语言的处理和表现能力都非常的强大&#xff0c;依靠非常全面的运算符和多样的数据类型&#xff0c;可以轻易完成各种数据结构的…

Linux系统日志管理服务和配置

文章目录 Linux系统日志服务rsyslog日志分类rsyslog相关文件/var/log/message重启失败分析 /var/log/secure自定义日志输出路径1.修改sshd_config配置文件2.修改rsyslog.conf3.重启服务 常见日志文件日志管理工具journalctl选项说明journalctl用法示例 日志分析实战host无法解析…

qt creator中右边的的类和对象如何显示出来

qt creator中右边的的类和对象如何显示出来&#xff1f; 解决方法&#xff1a; 鼠标右键&#xff0c;重置为默认布局。

未来互联网的新篇章:深度解析Web3技术

随着技术的不断演进&#xff0c;Web3正逐渐成为引领未来互联网发展的关键驱动力。本文将深入探讨Web3技术的核心概念、关键特征以及其对未来互联网生态的深远影响&#xff0c;旨在帮助读者全面理解和把握这一新兴技术的发展方向和潜力。 1. Web3的基本概念和演进 Web3并非简单…

【AI大模型】通义灵码的部署与使用

【AI大模型】通义灵码的部署与使用 目前已支持&#xff1a; JetBrains IDEsIDE 版本&#xff1a;IntelliJ IDEA、PyCharm、GoLand、WebStorm、Android Studio 等 2020.3 及以上操作系统&#xff1a;Windows 7 及以上、macOS、LinuxVisual Studio CodeIDE 版本&#xff1a;1.68.…

minio在redhat7.9上面的单节点单驱动离线安装(docker)

问题 最近需要在红帽上面离线安装minio&#xff0c;并且还是要离线安装到服务器中的Docker里面去。 检查服务器磁盘 # lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs xxxxsx-xxx-xxx…

软链接node_modules

公司项目很多微应用的子项目公用同一套模板&#xff0c;也就会使用同一个node_modules 1.先创建3个同样的项目,并安装一个其中的一个node_modules给他丢到外边 2.win r -------> cmd --------> ctrlshift enter(已管理员身份打开cmd) 3.在窗口分别执行以下代码…

【手撸RPC框架】zookeeper入门(安装+常用命令)

&#x1f43c;作者简介&#xff1a;一名大三在校生&#x1f38b; 空有想法&#xff0c;没有实践&#xff0c;难成大事 专栏前言&#xff1a;探索RPC框架的奥秘 简介&#xff1a;在现代软件开发中&#xff0c;随着微服务架构的普及&#xff0c;远程过程调用&#xff08;RPC&…

Mybatis左连接的实现方式

在使用 MyBatis Plus 进行数据库操作时&#xff0c;我们有时需要从多个表中获取数据。这篇文章将介绍如何在 MyBatis Plus 中实现左连接查询。我们将以两个表格为例&#xff0c;一个是部门领导表 (system_dept_leader)&#xff0c;另一个是用户表 (system_user)&#xff0c;并演…