| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 我的c语言学习记录(蓝桥)————运算符和数据转换 -> 正文阅读 |
|
[C++知识库]我的c语言学习记录(蓝桥)————运算符和数据转换 |
我的c语言学习记录(蓝桥)————三基本的算数运算符 常用的算术运算符表:
注意
下面我们举例说明上注意事项。 创建 5-1.c 文件并输入以下代码: # include<stdio.h> int main(){ ??? int a=22; ??? int b=3; ??? printf("%d\n",a/b); ??? return 0; } 输入以下命令编译并运行: gcc -o 5-1 5-1.c ./5-1 结果如下: ? 运行后之后,大家可以看到运行的结果是 7 而非 7.33333。 重新编写 5-1.c 作出以下修改: #include<stdio.h> int main(){ ??? float a = 22.5; ??? int b = 3; ??? printf("%d\n",a%b); ??? return 0; } 重新编译运行该程序,显示出以下结果: ? 编译出现 error 表示编译未成功(如果只出现 warning 表示警告,则其实编译已经成功生成了可执行文件),并提示了错误内容。 这也验证了我们在注意中提到的 % 运算符要求参加运算的对象为整数。 自增、自减运算符 作用是使变量的值加 1 或减 1,例如:++i,--i(在使用 i 之前,先使 i 加(减)1);i++,i--(在使用 i 之后,使 i 的值加(减)1)。 猛地一看,++i?和?i++?的作用相当于?i=i+1。但是?++i?和?i++?的不同之处在于?++i?是先执行?i=i+1?后,再使用 i 的值;而?i++?是先使用 i 的值之后,再执行?i=i+1。我们看下面的例子: 编写源程序 5-2.c: # include<stdio.h> int main(){ ??? int a = 5; ??? printf("%d\n",a++); ??? printf("%d\n",++a); ??? return 0; } 编译运行后的结果是: ? 大家千万不要以为结果应该是: 5 6 因为?a++?以后?a?的值已经成为了 6,而非是 5,经过?++a?后的值是 7。 这个程序虽然简单,大家还是需要认真思考一番。 注意: 自增运算符 (++) 和自减运算符 (--) 只能用于变量,而不能用于常量或表达式。如?5++?或者?(a+b)++?都是不合法的。因为 5 是常量,常量的值是不能改变的。(a+b)++?也是不可能实现,假如?a+b?的值是 5,自增后变为 6 放在什么地方呢?无变量可供存放。 现在大家可能还不能感受到自增和自减的用处,等我们学到循环语句和指针的时候,你将会在大量的程序中看到自增和自减。 不同数据之间的混合运算 在程序中经常会遇到不同类型的数据进行运算,比如 7*3.5。如果一个运算符的两侧数据类型不同,则先进行类型的转换,使两者具有同一种类型,然后进行运算。因此整型、浮点型、字符型数据之间可以进行混合运算。 数据类型计算的时候究竟是如何转换类型的呢?大家先看下表: ?
我们编写一个程序分析一下他们转换的编译过程,编写程序 5-3.c: # include<stdio.h> int main(){ ? int i = 3; ? float f = 4.3; ? double d = 7.5; ? double sum; ? sum = 10 + 'a' + i*f - d/3; ? printf("%lf\n",sum); ??? return 0; } 在?sum=10+'a'+i*f-d/3;?这条语句中,右边的表达式从左到右扫描,运算次序为: 10 + 'a' 的运算,'a' 的值是整数 97,运算结果为 107。 i*f 的运算。先将 i 与 f 都转换为 double 型,两者运算 12.9,double 型。 整数 107 与 i * f 的值相加,结果为 119.9,double 型。 d/3 的运算,现将 3 转换 double 类型,d/3 的结果为 2.5,double 型。 将 119.9 与 2.5 相减,117.4,double 型。 编译运行结果如下: ? 要求给定一个大写字母得到其小写字母输出,编写 5-4.c。 解题思路:我们前面已经介绍过,字符数据以 ASCII 码存储在内存中,形式与整数的存储形式相同,所以字符型数据和其他算数型数据之间可以相互赋值和运算。 通过 ASCII 码表我们可以找到同一个字母的大写形式和小写形式之间有什么内在的联系。那就是同一个字母,用小写表示的字符的 ASCII 码比用大写表示的 ASCII 码大 32。 代码如下: #include<stdio.h> int main(){ ??? char c1,c2; ??? printf("Please enter a capital letter:"); ??? scanf("%c",&c1); ??? c2 = c1 + 32; ??? printf("%c\n",c2); ??? return 0; } 程序运行结果如下: ? 强制类型转换 可以利用强制类型转换运算符将一个数据类型转换为所需的类型,例如: (double)a??????????? //将 a 转换成为 double 型 (int)(x + y)?????????? //将 x+y 的值转换成为 int 类型 其一般形式就是 (类型名)(表达式) 上述例子中如果写成?(int)x + y,则只将 x 转换成为整型再与 y 相加。 需要说明的是,在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。例如?a = (int)x。 如果已经定义了 x 为 float 型变量,a 为整型变量,进行强制类型运算 (int)x 后得到一个 int 类型的临时值,它的值等于 x 的整数部分,把它赋值给 a,注意 x 的值和类型都未变化,仍为 float 型,该临时值在赋值后就不再存在了。 数据的输入和输出 之前为了方便大家学习,我们粗略的讲述过?scanf()?和?printf()?函数。这一小节内容,我们系统的讲述数据的输入和输出。 举例说明 求 ax^2+bx+c=0 方程的根。a,b,c 由键盘输入,设 b^2-4ac>0。 我们知道: ? ? 创建 5-5.c,编写以下代码。 #include<stdio.h> #include<math.h>?????????????? //程序中要调用求平方根函数 sqrt int main(){ ??? double a,b,c,disc,x1,x2,p,q; ??? scanf("%lf%lf%lf",&a,&b,&c); ??? disc = b * b - 4 * a * c; ??? p = -b / (2.0 * a); ??? q = sqrt(disc) / (2.0 * a); ??? x1 = p + q,x2 = p - q; ??? printf("x1=%7.2f\nx2=%7.2f\n",x1,x2); ??? return 0; } 编译时需要注意,在 Linux 系统下,C 源文件若调用了 math 库里的函数,则编译时要加上 -lm (是字母 l ,不是数字 1),表示链接到 math 库。 gcc -o 5-5 5-5.c -lm 这里我们说明一下:因为数学函数位于 libm.so 库文件中(这些库文件通常位于?/lib?目录下),-lm?选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。而 printf 为什么不需要呢?这是因为它位于?libc.so?库文件中,使用?libc.so?中的库函数在编译时不需要加?-lc?选项,当然加了也不会错,因为这个选项是 gcc 的默认选项。 结果如下: 程序分析
printf?和?scanf?中的格式字符 前面我们已经介绍了,在输入输出时,对不同的数据要指定不同的格式声明,而格式声明最重要的就是格式字符,我们在此做下总结: ? 这个表不用死记,开始时会用比较简单的形式输入数据即可。在这里我们也不会详细的阐述,如果想要学习相关内容,可以买相关书籍。 小知识点:
我们编写 5-6.c 程序可以体验一下: #include<stdio.h> int main(){ ??? int a = 12,b = -3456; ??? long int c = 123456; ??? printf("%5d\n",a); ??? printf("%d\n",b); ??? printf("%ld\n",c); ??? printf("%6ld\n",c); ? return 0; } 会得到输出结果: ? 字符数据的输入输出 除了可以用?printf?函数和?scanf?函数输出和输入的字符外,C 语言的库函数还提供一些专门用于输入和输出的字符的函数。 用?putchar()?函数输出一个字符 一般形式:putchar(c);?功能:输出变量 c 所代表的一个字符; 说明:c 为字符型变量或整型变量。 我们建立 5-7.c 程序,输入以下内容: #include <stdio.h> void main(){ ??? char a,b,c; ??? a = 'O';b = 'K';c = '\n'; ??? putchar(a); ??? putchar(b); ??? putchar(c); } 输出结果为: ? 通过此例我们可以看到:用?putchar()?函数既可以输出能在显示器屏幕上显示的字符,也可以输出屏幕控制字符,如?\n?的作用就是输出一个换行符,使输出的当前位置移到下一行的开头。 用?getchar?函数输入一个字符
我们现在改写之前的一个练习,实现在键盘上输入一个大写字母,显示一个对应的小写字母。建立 5-8.c,输入一下程序: #include <stdio.h> int main(){ ??? char c; ??? printf("Input an uppercase letter:\n"); ??? c = getchar(); ??? putchar(c + 32); ??? return 0; } 注意:运行程序时,系统等待用户输入,注意回车也是一个合法字符。 输出结果: ? 作业习题一 请编写程序将?ShiYanLou?译成密码,用原来的字母后面第一个字母替代原来的字母。例如 A 后面的第二个字母是 B,因此?ShiYanLou?应该译成?TijZboMpv。请大家编写一个程序实现这个过程,并且分别用?putchar?函数和?printf?函数打印这些字符。 习题二 设一个圆柱底面圆的半径 r=2.5,圆柱的高 h=3,求底面圆周长、圆面积以及圆柱的体积。用?scanf?输入数据,输出计算结果,要求保留小数点后两位。 解: 习题一: #include<stdio.h> int?main() { ????char?str[9]={'s','h','i','y','a','n','l','o','u'}; ????for(int?i=0;i<9;i++) ????str[i]+=1; ????for(int?i=0;i<9;i++)???????????? ????????//for循环条件之间需用分号隔开 ????printf("%c",str[i]); ????printf("\n"); ????for(int?i=0;i<9;i++) ????putchar(str[i]); ????return?0; } ? 习题二: //半径=2.5,高=3,求底面圆周长,圆面积,圆柱体积 #include<stdio.h> int?main(){ ????float?r; ????double?L; ????double?S; ????double?V; ????int?high; ????float?pi?=?3.14; ????printf("请输入半径和高:"); ????scanf("%f",&r);???????????? //不要忘记地址符之前的逗号 ????scanf("%d",&high); ????L?=?2?*?pi?*?r; ????S?=?pi?*?r?*?r; ????V=?S?*?high; ????printf("周长为%f\n面积为%f\n体积为:%f\n",L,S,V); ????return?0; } ? 挑战摄氏转华氏温度 介绍 实现一个 C 语言程序,可以读入摄氏温度,输出华氏温度。 知识点
计算公式如下: 华氏度(℉)=32+摄氏度(℃)×1.8 注意输入的摄氏温度要做为编译后的可执行文件的参数传入,而不是?scanf()?读取,如果使用?scanf()?读取则会导致测试系统等待超时。 程序片段如下,需要在 TODO 部分补充代码: #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]){ ??? // 存储输入的摄氏温度 ??? int input = 0; ??? // 判断是否输入1个参数 ??? if( argc != 2) ??????? return 1; ??? // 注意 argv[0] 是执行的程序,argv[1] 是第1个参数 ??? input = atoi(argv[1]); ??? // TODO:将输入的 input(摄氏温度)值转为华氏温度并打印输出 ??? return 0; } 目标
$ convert 28 82.4
解答: #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]){ ??? // 存储输入的摄氏温度 ??? int input = 0; ??? // 判断是否输入1个参数 ??? if( argc != 2) ??????? return 1; ??? // 注意 argv[0] 是执行的程序,argv[1] 是第1个参数 ??? input = atoi(argv[1]); ??? // TODO:将输入的 input(摄氏温度)值转为华氏温度并打印输出 ??? double output = 0; ??? output = input * 1.8 + 32; ??? //保留一位小数 ??? printf("%0.1f\n",output); ??? return 0; } ? 命令行实现输入命令: gcc -o convert convert.c 回车 ./convert 28 回车 ?????//convert是你创建的程序文件名 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:39:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |