IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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语言学习记录(蓝桥)————三

基本的算数运算符

常用的算术运算符表:

  • x + y:将 x 与 y 相加
  • x - y:将 x 与 y 相减
  • x * y:将 x 与 y 相乘
  • x / y:x 除以 y
  • x % y:求 x 除以 y 的余数

注意

  1. x/y 中,两个实数相除的结果是双精度实数,两个整数相除的结果为整数。如 5/3 的结果为 1,舍去小数部分。
  2. % 运算符要求参加运算的对象为整数,结果也是整数。如 7%3,结果为 1,除了%以外的运算符的操作数都可以是任何算数类型。

下面我们举例说明上注意事项。

创建 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。如果一个运算符的两侧数据类型不同,则先进行类型的转换,使两者具有同一种类型,然后进行运算。因此整型、浮点型、字符型数据之间可以进行混合运算。 数据类型计算的时候究竟是如何转换类型的呢?大家先看下表:

?

  1. 如果 int 类型的数据和 float 或 double 型数据进行运算时,先把 int 型和 float 型数据转换为 double 型数据,然后进行运算,结果为 double 型。其他的大家可以按照上图来做。
  2. 字符 (char) 型数据和整型数据进行运算,就是把字符的 ASCII 代码与整型运算。如 4+'B',由于字符 'B' 的 ASCII 代码是 66,相当于 66+4=70。字符型数据可以直接和整型数据进行运算。如果字符型数据和浮点型数据运算,则将字符的 ASCII 码先转化为 double 型,然后再进行运算。

我们编写一个程序分析一下他们转换的编译过程,编写程序 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 的默认选项。

结果如下:

程序分析

  1. 在?scanf?函数中,格式声明为 "%lf",表示输入的是双精度型实数。从上面的运行结果来看输入 “1 3 2” 时,两个数字之间是用空格分开,如果用其他符号(如逗号)会出错。我们输入的 “1 3 2” 虽然是整数,但是由于指定了用?%lf?的格式输入,因此系统会先把这 3 个整数装换成为实数 1.0,3.0,2.0,然后赋值给变量 a,b,c。
  2. 在?printf?函数中,不是简单地用 "%f" 格式声明,而是在格式符 "f" 的前面加了 “7.2”。表示的意思是在输出 x1,x2 时,指定数据占 7 列,其中小数占 2 列。这样做有两个好处。
    • 可以根据实际需求来输出小数的位数,因为并不是任何时候都需要 6 位小数的。
    • 如果输出多个数据各占一行,用同一个格式输出,即使输出的数据整数部分不同,但输出时上下行必然按小数点对齐,使输出数据整齐美观。
  3. 因为我们假设了 a,b,c 的值满足 b^2-4ac>0。但是实际我们输入的 a,b,c 三个值并不一定满足要求,所以我们在程序中先判断 a,b,c 的值是否满足条件。只有满足,我们采用使用上述方法计算,判断我们将会在下一节课程中讲述。

printf??scanf?中的格式字符

前面我们已经介绍了,在输入输出时,对不同的数据要指定不同的格式声明,而格式声明最重要的就是格式字符,我们在此做下总结:

?

这个表不用死记,开始时会用比较简单的形式输入数据即可。在这里我们也不会详细的阐述,如果想要学习相关内容,可以买相关书籍。

小知识点:

  1. 在输入函数时,用 %c 格式声明输入字符时,空格字符和转义字符都是作为有效字符输入,例如:scanf("%c%c%c",&c1,&c2,&c3);?在执行这个程序时,需要我们连续输入 3 个字符,中间不要有空格,如下:?abc?下面插入空格的形式是错误的:?a b c
  • 这种形式第一个字符 'a' 送给 c1,第二个字符是空格字符' '送给了 c2,第三个字符 'b' 送给了 c3。
  1. 在使用 %d 输出时,我们可以指定输出的宽度。具体用法:
  • %d:按照整型数据的实际长度输出。
  • %md:以 m 为指定的最小字段宽度输出,右对齐。
  • %ld:输出长整型数据。
  • %mld:输出指定宽度的长整型数据。

我们编写 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?函数输入一个字符

  • 一般形式: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 语言程序,可以读入摄氏温度,输出华氏温度。

知识点

  • Linux 下 C 语言程序编写
  • C 语言基础
  • C 语言数据类型
  • scanf?和?printf?函数

计算公式如下:

华氏度(℉)=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;

}

目标

  • 在右边的实验楼环境 WebIDE 中新建一个文档,命名为?convert.c;
  • 将程序片段复制到文档?convert.c?中,并补充文档中的?TODO?部分;
  • convert.c?可以在环境中编译运行,编译后生成的可执行文件接受参数为摄氏温度,输出为华氏温度;
  • 例如编译后的可执行文件为?convert,则当参数为?28?时,输出为?82.4,结果如下:

$ convert 28

82.4

  • 摄氏温度作为命令行参数输入,不能够使用?scanf()?读取。

解答:

#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语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:30:34  更:2022-02-09 20:32:49 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码