为了账号安全,请及时绑定邮箱和手机立即绑定
C 语言中的多维数组

C 语言中的多维数组与我们在数学中学习到的多维数组是一致的。如果你还不知道什么是多维数组也没有关系。多维数组可以看成是之前学习过的数组的扩展。它能让你完成一些仅仅依靠一维数组没有办法完成的事情。让很多事情完成的更为简单。

C 语言字符串练习

在 C 语言中字符串的应用比较多,所以在这里我们实现一个函数,函数功能是将一串给定的字符串中的大写字符全部转换为小写字符。

C 语言中的位运算符

在 C 语言中,相同的数字可以用不同的数制来表示。也就是十进制的数字可以等价的表示为二进制或者十六进制。那么对于二进制来说,可以进行逐个数字之间,也就是每一个数字位的运算。这种运算也广泛的存在我们日程使用的数字电路中。其实计算机的运算原理最底层就是位运算,也就是 0 和 1 的运算。

C 语言中的 main() 函数参数

作为 C 语言程序的入口 mian 函数很多时候会在启动的时候从外界传入一些参数到程序内部。

C 语言中的运算符

运算符是用来对于变量或者常量施加运算的符号。这一节是一个介绍性章节,会将 C 语言中出现的常用的操作符列举在这里。在后面的章节中,会对于重点的运算符有详细的介绍。运算符可以分为以下几种:算数运算符;关系运算符(又可以叫做比较运算符);逻辑运算符;位运算符;复合赋值运算符;指针运算符;其它运算符(除上面类型外的类型)。

C 语言中的变量

在讲解变量之前,我们先来看一段代码:int x;int y=0;char z='A';x=6;在上面这段代码中出现的 x、y、z 都是一个 C 变量。变量是编程语言中不可或缺的组成部分。它承载这存贮数据以及计算结果等等功能,顾名思义变量就是可以再计算执行过程中变化的量。这节课我们来学习下到底什么是变量。

3. 通过 C 程序测试字节序

通过 C 语言程序来测试字节序非常简单,大致思路如下:定义一个整形变量,然后将 0xAABBCCDD 赋值给该变量。按照从低地址到高地址的顺序打印此变量的内容。将打印结果的顺序和 0xAABBCCDD 的顺序进行对比,观察二者的变化。代码片段如下: 1 #include <stdio.h> 2 3 void check_endian() 4 { 5 int n = 0xAABBCCDD; 6 7 unsigned char *ptr_n = (unsigned char*)&n; 8 9 for (int i=0; i < 4; ++i){ 10 printf("%X\n", *ptr_n++); 11 } 12 }代码中有两个需要注意的地方:Tips:需要将 int 型变量 n 的地址赋值给了 unsigned char 型指针变量,如果是赋值给 char 型变量,那么打印结果是:FFFFFFDDFFFFFFCCFFFFFFBBFFFFFFAA原因是 printf 在打印的时候会将 char 提升为 int,0xAA,0xBB 最高位是 1,所以会当做符号位扩展。如果是 unsigned char,会提升为 unsigned int,符号位扩展是 0。打印结果的时候用 %x 或者 %X 进行格式化输出。C 语言程序输出结果:DDCCBBAA从输出结果可以看出我的系统是以小端序来存储整数的。

6. 我们为什么要学习 C 语言

如果你想要从事下面的工作,那么 C 语言将是你非常好的一个选择:从事需要直接操作操作硬件的编程的嵌入式设备开发,不需要操作系统的支持。比如我们常见的冰箱,洗衣机等等的控制;嵌入式操作系统和实时操作环境下的开发;基于 Linux 操作系统下的一些应用程序。主要是中间层面应用的开发,直接可以与底层硬件交互,而本身又不直接与最终用户进行交互;音频和视频的解码器和编码器等;协议栈的开发。

C 语言中的分支结构

C 语言与大多数计算机语言一样是按照语句的顺序逐条执行的。如同流水一样,从上到下顺序执行。这就如同我们每天的日常生活,对于上班族来说,就是起床,洗漱,吃早饭,上班,午饭。下班,晚饭,睡觉。感觉一切都平淡无奇。但是如果你想去购买一台电脑怎么办?这不是一件每天都发生的流水事件,而且你需要在有足够的钱的情况下才能购买。这个时候,你就要在满足有钱的条件下打破原有的生活顺序,去卖场购买一台电脑。这就是生活中的分支。在程序设计中同样存在这样的分支。

2. 使用 IDE 编译 C 语言

在集成环境中,编译 C 语言一般只需要在菜单中选择 运行 或者 调试运行 即可。也可以通过相关的快捷键来直接编译运行程序。要是只编译不运行,那么里面会有 编译 选项和与之对应的快捷键。这时程序只是编译,并不会运行。对于初学者来说建议大家不使用 IDE, 而是直接使用文本编辑器来编辑程序。大家不要担心,我不会推荐诸如 VIM,EMACS 这种上个世纪的产物,因为太小众了。这里建议大家使用微软的 Visual Studio Code, 简称 VSCode。这个文本编辑器,现代,多功能,多种操作系统下都可以使用,功能强大,可以根据自己的需要安装插件扩展功能。

4. 小结

本节课程我们主要学习了如何创建一个支持 C/C++ 的项目。本节课程的重点如下:掌握如何创建支持 C/C++ 的项目;掌握如何从 Java 中调用 C/C++ 函数。

3.5 pip3 uninstall package-name

命令 pip3 uninstall package-name 卸载名称为 package-name 的第三方模块。卸载 requests 模块,示例如下:C:\>pip3 uninstall requestsUninstalling requests-2.23.0: c:\python3\lib\site-packages\requests-2.23.0.dist-info\installer c:\python3\lib\site-packages\requests-2.23.0.dist-info\license c:\python3\lib\site-packages\requests-2.23.0.dist-info\metadata c:\python3\lib\site-packages\requests-2.23.0.dist-info\record c:\python3\lib\site-packages\requests-2.23.0.dist-info\top_level.txt c:\python3\lib\site-packages\requests-2.23.0.dist-info\wheel c:\python3\lib\site-packages\requests\__init__.py ...Proceed (y/n)? y Successfully uninstalled requests-2.23.0卸载 requests 模块时,首先列出该模块相关的文件,在删除这些文件前,程序要求用户输入 y 进行确认。用户输入 y 后,pip3 就会卸载该模块。

5.3 创建字典

>>> dict(){}创建一个空的字典>>> dict(a='A', b='B', c='C'){'a': 'A', 'b': 'B', 'c': 'C'}通过命名参数创建包含 3 个键值对的字典>>> pairs = [('a', 'A'), ('b', 'B'), ('c', 'C')]>>> dict(pairs){'a': 'A', 'b': 'B', 'c': 'C'}>>>定义列表 pairs由 3 个元组构成每个元组包含两项:键和值列表 pairs 包含了 3 个键值对创建一个包含 3 个键值对的字典

4.1 概述

Python 的模块是一个普通的 Python 文件,例如 os 模块对应的文件是 os.py。os 模块是 Python 自带的模块,如果 Python 安装到 C:\Python3 目录下,在 C:\Python3\Lib 目录下能找到 os.py,即 os.py 的完整路径是 C:\Python3\Lib\os.py。sys.path 是一个列表,列表保存了多个路径名:>>> import sys>>> sys.path['C:\\Python3\\DLLs', 'C:\\Python3\\lib', 'C:\\Python3\\lib\\plat-win', 'C:\\Python3\\lib\\lib-tk', 'C:\\Python3', 'C:\\Python3\\lib\\site-packages', 'C:\\Python3\\lib\\site-packages\\win32']Python 使用 ‘import os’ 引入 os 模块,注意:Python 使用模块名而不是模块的完整路径引入模块。Python 查找模块 os 的过程如下:在 sys.path[0] 指向的目录 C:\Python3\DLLs 下查找文件 os.py在 sys.path[1] 指向的目录 C:\Python3\lib 下查找文件 os.py…

5.1 概述

赋值运算符是为指定变量分配值的符号。下标列出了常用 Java 中常用的赋值运算符:运算符描述例子=简单的赋值运算符。将值从右侧操作数分配给左侧操作数。c = a + b将a + b的值赋给c+=加和赋值运算符。它将右操作数添加到左操作数,并将结果分配给左操作数。c + = a等于c = c + a-=减和赋值运算符。它从左侧操作数中减去右侧操作数,并将结果分配给左侧操作数。c -= a等效于c = c – a*=乘和赋值运算符。它将右操作数与左操作数相乘,并将结果分配给左操作数。c *= a等效于c = c * a/ =除和赋值运算符。它将左操作数除以右操作数,并将结果分配给左操作数。c /= a等于c = c / a

C 语言的常量

我们通常意义上的常量其实和英语中的常量这个单词不是一个意思,汉语中的常量对应的是 Literal(字面值),而不是 Constant(常量)。这里我们分别讲一下这两个内容,大家就会有自己的对于“常量”的相关的认识了。

C 语言中的 enum

我们有些时候需要使用一些固定的名称来代表固定的数值,比如在计算你的课程成绩的时候,有的课程会出现用英文字母 A-F 来打分,这个时候你需要换算为一个固定的分值来计算平均分。要实现这个功能,你可以选择在程序的开始定义一系列的常量,但是这样的定义会非常繁琐,而且不方便维护。这个时候就出现了一种变量的类型,枚举。

2. 示例程序

#include <stdio.h>int main(){ int *a, b = 100, *c; printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a); printf("b value = %d, b address = %p\n", b, &b); printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c); a = &b; printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a); c = a; printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c); printf("b value = %d, b address = %p\n", b, &b); return 0;}运行结果:示例中的运行结果中的十六进制所表示的地址每台机器都会不太一样,甚至每次运行都会发生变化。因为操作系统每次为系统分配的内存都不太一样。a value = 0x7fffaf0005a0, a address = 0x7fffd2942a28, a point value = -1991643855b value = 100, b address = 0x7fffd2942a24c value = 0x7fffd2942b20, c address = 0x7fffd2942a30, c point value = 1a value = 0x7fffd2942a24, a address = 0x7fffd2942a28, a point value = 100c value = 0x7fffd2942a24, c address = 0x7fffd2942a30, c point value = 100b value = 100, b address = 0x7fffd2942a24示例程序中声明了一个整数类型的指针 a ,同时还声明并初始化了一个整数类型的变量 b 。我们首先展示了此时此刻指针变量 a 中存储的值,也就是一个内存地址,这个地址为 0x7fffaf0005a0 ,同时 a 变量本身的地址为 0x7fffd2942a28 ,此时其存储的内存地址中所存储的值为 -1991643855 。这里需要说明的是, a 变量此时还没有初始化,没有赋值,里面存储的数值是随机的,所以其代表的值也是随机的,必须在赋值以后才能使用。这点和所有的变量的使用是一致的。变量 b 的存储的数值为 100 ,其内存的地址为 0x7fffd2942a24 。指针变量 c 中存储的数值是地址 0x7fffd2942b20 ,其本身的地址是 0x7fffd2942a30 ,里面存储的地址中存储的数值为 1 。然后我们进行了一次赋值的操作。这里的赋值操作,就是将变量 b 的地址赋给了变量 a。这个时候你会发现变量 a 中存储的数值变成了变量 b 的地址,而变量 a 自己的地址是没有发生变化的,而变量 a 中所存储的地址中的值也编程了变量 b 中所存储的值 100 。指针之间的赋值就比较直接,和普通变量的赋值是一样的,只要直接赋值就可以了。下面的表格展示了这一系列的变化初始状态变量名变量中数值地址指针地址中数值a0x7fffaf0005a00x7fffd2942a28-1991643855b1000x7fffd2942a24c0x7fffd2942b200x7fffd2942a301赋值后变量名变量中数值地址a0x7fffd2942a240x7fffd2942a28b1000x7fffd2942a24c0x7fffd2942a240x7fffd2942a30

2.3 在字典中增加键值对

>>> x = {'a':'A', 'b':'B'}>>> x['c'] = 'C'>>> x{'a':'A', 'b':'B', 'c':'C'}在第 1 行,创建一个具有 2 个键值对的字典;在第 2 行,在字典中增加一个键值对:键为 ‘c’,值为 ‘C’;在第 3 行,显示新增后的字典;在第 4 行,新增后的自动包含 3 个键值对。

4. 参考文献

Command line arguments in C/C++10.2. Arguments to mainHow to write a good C main function

2.2 函数类型推导

表达式作为函数体,返回值的类型可以省略,可以利用 Kotlin 的类型推导功能,推测出函数返回值的类型。fun sum(a: Int, b: Int, c: Int): Int { return a + b + c}//可简写成以下形式fun sum(a: Int, b: Int, c: Int) = a + b + c

3.3 以 Python 源文件名作为参数调用 python 命令

创建完 test.py 后,进入 C 盘根目录,使用 dir 命令查看 C 盘根目录,确认在 C 盘目录下存在文件 test.py,如下图所示:使用 dir 命令查看 C 盘根目录 然后,以 Python 源文件名 test.py 作为参数调用 python 命令,如下图所示:以 Python 源文件名作为参数调用 python 命令 命令 python test.py 执行 Python 程序 test.py,输出结果为:helloworld

3.2 Kotlin 中接口的多继承

在 Java 中接口多继承是支持的,Kotlin 依然也支持。那么一起来看下在 Kotlin 对于上述多继承问题是如何解决的呢?package com.imooc.testinterface A { fun invoke()}interface B : A { override fun invoke() { println("B invoke") }}interface C : A { override fun invoke() { println("C invoke") }}class D : B, C { //override fun invoke() = super<B>.invoke()//通过super中泛型类型指定继承B接口的方法,所以最后输出"B invoke" override fun invoke() = super<C>.invoke()//通过super中泛型类型指定继承C接口的方法,所以最后输出"C invoke"}fun main() { val d = D() d.invoke()}

5. 示例

#include <stdio.h>int main(){ char a[5]; char b[] = "abcde"; char c[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; a[0] = 'H'; a[1] = 'e'; a[2] = 'l'; a[3] = 'l'; a[4] = '\0'; printf("a = %s\n", a); for (int i = 0; i < 5; i++) { printf("a[%d] = %c\n", i, a[i]); } for (int i = 0; i < 6; i++) { printf("b[%d] = %c\n", i, b[i]); } printf("c = %s\n", c); return 0;}运行结果:a = Hella[0] = Ha[1] = ea[2] = la[3] = la[4] =b[0] = ab[1] = bb[2] = cb[3] = db[4] = eb[5] =c = abcde示例程序里展示了单独声明字符串 a ,并且在后面为其赋值,初始化变量 b 和 c。接着,我们通过屏幕打印语句查看了字符串的内容,并且通过循环语句,输出了字符数组中存储的字符串。字符串在 C 语言中是不安全存在的,请大家切记如果不是在初始化的时候用双引号的形式赋值,在使用数组赋值的时候,请大家一定不要忘记末尾的结束符号。如果缺少了这个符号,大家可以尝试看看,看看内存使用错误的奇妙。

3.1 键无序问题

Object 的键是无序的,当键可以隐式转换为数值时,在循环的时候就会被优先排序。这也是为什么要求最好不要使用 Number 类型作为对象的属性。var obj = { c: 'C', 3: 3, a: 'A', 1: 1,}for (let key in obj) { console.log(key, obj[key])}// 1 1// 3 3// c C// a AMap 会记录插入的顺序,存放的是键值对的组合,并且不会做类型转换。Map 可以用 forEach 循环。var map = new Map();map.set('c', 'C').set(3, 3).set('a', 'A').set(1, 1);map.forEach((item, key) => { console.log(key, item, typeof key)})// c C string// 3 3 "number"// a A string// 1 1 "number"从上面的代码中,使用 typeof 去检查 key 的数据类型,可以看出 Map 并不会对键做类型转换。

3.4 pip3 install --upgrade package-name

命令 pip3 install --upgrade package-name 升级名称为 package-name 的第三方模块。命令 从网站 pypi.org 下载指定名称的第三方模块的最新版本,然后自动安装升级。升级名为 requests 的第三方模块,示例如下:C:\>pip3 install --upgrade requestsRequirement already up-to-date: requests in c:\python3\lib\site-packagesRequirement already up-to-date: certifi>=2017.4.17 in c:\python3\lib\site-packages (from requests)Requirement already up-to-date: idna<3,>=2.5 in c:\python3\lib\site-packages(from requests)Requirement already up-to-date: chardet<4,>=3.0.2 in c:\python3\lib\site-packages (from requests)Requirement already up-to-date: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in d:\addon\py36\lib\site-packages (from requests)

2.3 三个参数时

有三个参数时,第三个参数是替换结束的位置,不包括结束的位置。['a', 'b', 'c'].fill(4, 1, 2); // ["a", 4, "c"]['a', 'b', 'c'].fill(4, -3, -2); // [4, "b", "c"]['a', 'b', 'c'].fill(4, -3, 1); // [4, "b", "c"]['a', 'b', 'c'].fill(4, -2, 1); // ["a", "b", "c"]上面的代码中,通过上面的示例我们可以总结一点就是,找到起始位置的元素和结束位置的元素,如果它们中间有值则把中间的值替换,起始位置的索引必须小于结束位置的索引,如果没有则不会被替换。如:第 2 行中 -3 的位置是 “a”,-2 的位置是 “b”,在数组中 “a” 和 “b” 直接没有值,但是包含起始的 “a” 所以 “a” 会被替换。第 4 行中第二个参数 -2 位置元素是 “b” 索引是 1,第三个参数 1 位置的元素是 “a” 索引是 0,起始位置的索引大于结束位置的索引,所以数组中没有符合替换的元素。

1. 字符串

在 C 语言中定义的字符串是一个由字符组成的数组,这个数组的最后一个元素是一个表示空的字符 \0 。字符串 abcde 在 C 语言中的存储方式如下char str[]="abcde";--------------------------| a | b | c | d | e | \0 |-------------------------- 0 1 2 3 4 5 索引

7.3 求集合的交、并、差

>>> db.sadd('set2', 'b')1>>> db.sadd('set2', 'c')1>>> db.sadd('set2', 'd')1创建集合 ‘set2’,向集合 ‘set2’ 中添加元素 ‘b’、‘c’、‘d’>>> db.smembers('set'){'a', 'b', 'c'}>>> db.smembers('set2'){'b', 'd', 'c'}显示集合 ‘set’ 与 集合 ‘set2’ 包含的成员>>> db.sinter('set', 'set2'){'b', 'c'}>>> db.sunion('set', 'set2'){'a', 'b', 'd', 'c'}db.sinter(‘set’, ‘set2’) 求取集合的交集db.sunion(‘set’, ‘set2’) 求取集合的并集>>> db.sdiff('set', 'set2'){'a'}>>> db.sdiff('set2', 'set'){'d'}db.sdiff(‘set’, ‘set2’) 求取集合的差集在 ‘set’ 中出现,在 ‘set2’ 中没有出现的元素构成的集合db.sdiff(‘set2’, ‘set’) 求取集合的差集在 ‘set2’ 中出现,在 ‘set’ 中没有出现的元素构成的集合

2.1 直接新增数据列

直接新增数据列,需要传入新增的列索引名,以及该列每行的数据项值:# 导入pandas包import pandas as pd# 指定导入的文件地址 默认是file,这里的路径中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"data = pd.read_excel(data_path)print(data)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 新增数据列操作data["new_colume"]=["a","b","c","d","e","f"]print(data)# --- 输出结果 --- 编程语言 推出时间 价格 主要创始人 new_colume0 java 1995年 45.6 James Gosling a1 python 1991年 67.0 Guido van Rossum b2 C 1972年 33.9 Dennis MacAlistair Ritchie c3 js 1995年 59.5 Brendan Eich d4 php 2012年 69.9 Rasmus Lerdorf e5 C++ 1983年 75.0 Bjarne Stroustrup f输出解析:我们通过操作新增 new_colume 列,并指定行值分别为a,b,c,d,e,f,通过输出结果可以看到,在数据集的最后一列新增了数据列内容。

直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号