C&C++表达式语句实训(国防科大)

第1关:整型数据的运算:剩下的苹果哪去了

100

  • 任务要求
  • 参考答案
  • 评论206
  • 任务描述
  • 相关知识
    • 整型
    • 浮点型
  • 编程要求
  • 测试说明

任务描述

本关任务:程序输入苹果数 m 和人数 n,要求输出每个人平均可以分到多少个苹果,并将计算结果存入到变量 x 中。

相关知识

C 和 C++ 的程序中,每个数据对象都必须有确定的数据类型。这是为什么呢?我们知道,计算机内存中的数据都是0、1串,例如下面这16位0、1组成的串。

 
  
  1. 01000001 01000010

那么这个0、1串到底代表什么意思呢?

同样的这一段0、1串,如果是8位整数,则是两个整数65和66;如果是字符,则是‘A’和‘B’;如果是16位整数,则是16706。

同一串数据,赋予不同的类型就有不同的解释,就代表了不同的含义,所以数据对象都必须有确定的数据类型。C 和 C++ 有四种基本数据类型:整型、浮点型、字符型和布尔型。

本关我们首先来介绍整形和浮点型。

整型

C 和 C++ 的整型数据分为有符号和无符号两类,每类又包含几种类型。不同的 C 和 C++ 编译器对同一种数据类型的表示方式可能会有不同。

典型的 C 和 C++ 整型类型如下表:

类别 类型名 简写 名称 存储长度 表示范围
有符号 signed short int Short 有符号短整型 2 字节 -32768~32767
有符号 signed int Int 有符号整型 4 字节 -2147483648~2147483647
有符号 signed long int Long 有符号长整型 4 字节 -2147483648~2147483647
无符号 unsigned short int unsigned short 无符号短整型 2 字节 0~65535
无符号 unsigned int unsigned 无符号整型 4 字节 0~4294967295
无符号 unsigned long int unsigned long 无符号长整型 4 字节 0~4294967295

整型数据可以参与算术运算、关系运算、逻辑运算、位运算等。整数的加法、减法、乘法和数学中的算术运算一致,而除法略有不同。

例如:

 
  
  1. int a = 23, b = 8, c; // 声明整型变量 a、b、c,并对 a、b 进行初始化
  2. c = a / b; // 计算 a 除以 b 并将结果存入 c 中
  3. printf("%d\n",c); // 输出 c 的值

输出结果为:2

说明:23/8的结果为2,而不是2.875。这是因为两个整数相除,采用的是整数除法,结果也是整数。而且不是四舍五入的整数,而是直接截掉小数部分的整数。

浮点型

具有浮点型的数叫浮点数,也常常被称为双精度数或实数。如果要得到除法结果的小数部分,需要使用浮点数除法。只要除数和被除数其中有一个是浮点数,系统就会使用浮点数除法。

例如:

 
  
  1. float num = 123 / 23.0;
  2. printf("%f\n",num);

输出结果为:5.347826

说明:算式中23.0为浮点数,所以123/23.0采用浮点数除法,结果也是浮点数(存入到浮点变量 num 中)。使用 printf 输出时,采用的转换说明符也是相应的%f

编程要求

在右侧编辑器中的Begin-End之间补充代码,要求计算每个人平均分得的苹果数。具体要求如下:

  1. 程序输入苹果总数 m 和总人数 n(数据将由平台提供,m 和 n 之间用一个空格隔开,需要你获取即可使用);

  2. 以“人均苹果数为:num”的格式输出,其中 num 即每个人平均分得的苹果数。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:23 5 预期输出:人均苹果数为:4

测试输入:100 34 预期输出:人均苹果数为:2

思考:想一想,34 人分 100 个苹果,每人才 2 个,剩下的苹果哪儿去了?


开始你的任务吧,祝你成功!

// 包含标准输入输出函数库
#include 

// 定义main函数
int main()
{
    // 定义变量,m-苹果数,n-人数,x-人均苹果数
    int m, n, x;
    // 请在Begin-End之间添加代码,计算人均苹果数
    /********** Begin *********/
	scanf("%d %d",&m,&n);
    x=m/n;
    /********** End **********/
    // 输出人均苹果数
    printf("人均苹果数为:%d",x);
    return 0;
}

第2关:浮点型数据的运算:你的身材标准吗

100

  • 任务要求
  • 参考答案
  • 评论206
  • 任务描述
  • 相关知识
    • 浮点数类型
    • 浮点数运算
  • 编程要求
  • 测试说明

任务描述

本关任务:输入某人的身高(cm),请你计算 Ta 要保持标准身材体重的上限和下限(单位:kg),分别存入变量 up 和 low 中。

相关知识

为了计算的精确,有时候光保存计算结果的整数部分是不够的,这时候就需要使用浮点数了。

C 和 C++ 中有 3 种浮点类型:float 、double 和 long double,均为有符号浮点数。

浮点数类型

类型名 名称 存储长度 可表示的最小非 0 的绝对值 可表示的最大的绝对值
float 浮点型 4 字节 1.175494351E – 38 3.402823466E + 38
double 双精度型 8 字节 2.2250738585072014E – 308 1.7976931348623158E + 308
long double 长双精度型 8 字节 2.2250738585072014E – 308 1.7976931348623158E + 308

浮点数运算

浮点类型数据可以参与算术运算、关系运算、逻辑运算等。计算机有两套算术运算的单元:整型的和浮点类型的。如果两个操作数都是整型数据,则系统采用整型运算,运算结果也是整数。如果有一个操作数是浮点数,系统就会使用浮点运算,浮点运算的结果也是浮点数。

表达式中操作数的类型不同时,系统会自动进行隐式类型转换,使表达式中的数据类型一致。分为以下两种情景:

  1. 在算术表达式中隐式类型转换规则为:把不同类型的数据转换成精度最高、占用内存最多的那个数据的类型。

  2. 在赋值表达式中,会自动将赋值运算符右边表达式的值的类型转换成左边变量的类型,这种转换可能会丢失数据的精度。

如果两个操作数一个是整型数,一个是浮点数,系统会先对整型数进行类型转换,转换为等值的浮点数,然后再计算。

例如:

 
  
  1. float x = 2 + 3.4; // 隐式类型转换,系统会先把整数 2 转换成浮点数 2.0,然后再做加法运算

当然,对应的肯定有强制类型转换,也叫显式类型转换,它把表达式值的类型强制转换成指定的类型。

例如:

(double)3/2

先将3转换成 double 类型的3.0,然后计算3.0/2,由于2是整型,计算之前需要进行隐式类型转换,所以2也将转换成 double 类型的2.0。

编程要求

在右侧编辑器中的Begin-End之间补充代码,根据输入的身高(数据由平台提供,你需要获取后才能使用)来计算标准身材对应体重的上限和下限(单位:kg),分别存入变量 up 和 low 中,计算规则如下:

据说一个成年人的标准体重是其身高(单位:cm)减去100,然后再乘以 0.9所得到的公斤数。而一个人身材是否标准则是指 Ta 的真实体重是否在标准体重的加减10%之内。

提示:计算得到的标准身材体重的上下限的单位是 kg ,分别存入变量 up 和 low 中。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:176 预期输出:体重范围为:61.56 -- 75.24

测试输入:160 预期输出:体重范围为:48.60 -- 59.40


开始你的任务吧,祝你成功!

// 包含标准输入输出函数库
#include 

// 定义main函数
int main()
{
    float up, low;
    // 请在Begin-End之间添加代码,计算标准身材的体重上下限
    /********** Begin *********/
	float height;
    scanf("%f",&height);
    up=(height-100.0)*0.9+((height-100.0)*0.9)*0.1;
    low=(height-100.0)*0.9-((height-100.0)*0.9)*0.1;
    /********** End **********/
    // 输出标准身材的体重上下限
    printf("体重范围为:%.2f -- %.2f\n",low,up);
    return 0;
}

第3关:字符型数据的运算:循环加密是怎么实现的

200

  • 任务要求
  • 参考答案
  • 评论206
  • 任务描述
  • 相关知识
    • 字符类型
    • 三目运算符
  • 编程要求
  • 测试说明

任务描述

本关任务:对 26 个大写英文字母进行循环加密,输入一个大写英文字母(明文)和一个整数秘钥,输出用秘钥对该大写英文字母加密后的结果(密文)。

相关知识

存储英文字母需要用到字符型变量。C 和 C++ 将字符类型看成是一种短整型,每个字符数据对应一个整数值。如 Microsoft C++ 中的字符类型的取值集合为 ASCII 字符集, ASCII 为每个合法的字符定义了一个整数,该整数就是该字符在字符类型中的数值表示。

C 和 C++ 中有3种字符类型:char 、signed char 和 unsigned char。

字符类型

类型名 名称 存储长度 表示范围
char 字符型 1 字节 -128 ~ 127
signed char 有符号字符型 1 字节 -128 ~ 127
unsigned char 无符号字符型 1 字节 0 ~ 255

由于 C 和 C++ 将字符类型作为小整数处理,所以可以通过修改一个字符变量中的整数值来修改其中的字符。

在 ASCII 码表中26个大写英文字母是连续顺序排列的,也就是说字符‘B’代表的整数比字符‘A’代表的整数值大1,…… ,字符‘Z’代表的整数值比字符‘Y’代表的整数值大1,所以可以有下面的程序:

 
  
  1. char ch = 'B'; // 定义字符变量 ch 并初始化为字符 B ,ch中存储的是 B 对应的整数
  2. ch = ch + 3; // 将 ch 中的整数加 3
  3. cout << ch << endl;

输出结果为:E

但是需要注意的是修改字符变量里面的值可能使它对应的字符不再是大写字母(可能是 ASCII 码表中排在大写字母后面的其它字符),这时候我们需要根据条件去完成不同的操作(例如使字符 Z 加1后变成字符 A 和使字符 A 加1后变成字符 B 需要执行不同的操作)。

三目运算符

C 和 C++ 有一个三目运算符? :,它的一般形式为:

 
  
  1. <表达式1> ? <表达式2> : <表达式3> ;

其含义是先计算<表达式1>的值,如果为 true(非0),则计算<表达式2>的值,并把该值作为整个表达式的值;如果为 false(为0),则计算<表达式3>的值,并把它作为整个表达式的值。更直观的表示如下:

 
  
  1. if(表达式1)
  2. 表达式2
  3. else
  4. 表达式3

例如,下面的表达式中,如果 ch 是大写字母,则把 ch 赋值给 x,否则把字符 A 赋值给 x:

 
  
  1. cin >> ch ;
  2. char x=(ch>='A' && ch<='Z') ? ch : 'A';

其计算过程为:先计算条件表达式ch>='A' && ch<='Z'的值(由于 ACSII 码表中大写字母都是连续排列的,如果满足该条件,则 ch 必然是某一个大写字母)。如果结果为真,则将 ch 的值作为右边表达式的值赋值给 x ;如果为假,则将字符 A 作为右边表达式的值赋值给 x。

编程要求

在右侧编辑器中的Begin-End之间补充代码,将输入的一个大写英文字母(明文)和一个整数秘钥(数据由平台提供,需要你获取后才能使用)加密为密文输出,加密规则如下:

将26个大写英文字母组成一个圆环(‘A’后面是‘B’,…… ,‘Z’后面是‘A’),将明文字母往前走秘钥设定的步数就得到了密文。例如:秘钥是2时,‘A’加密后得到‘C’,‘Z’加密后得到‘B’。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:S 5 预期输出:X

测试输入:V 15 预期输出:K


开始你的任务吧,祝你成功!

做事情一定要事先设立道德底线,小偷也清楚有些东西是绝对不能偷的。所以说事情万万不可做绝,落井下石的事绝对不要干,给别人让出退路就等于自己前进了。

如果你发现了平台内容的错误,请在下面提交;如果没有,请在下面点赞。

// 包含两种I/O库,可以使用任一种输入输出方式
#include 
#include 
using namespace std;

int main()
{
    // c-存储输入的大写字母,d-存储加密后的大写字母
    char c, d;
    // step-秘钥,往前走的步数,大于等于 1,小于 26
    int step;
    // 请在Begin-End之间添加代码,计算密文存入 d 中
    /********** Begin *********/
	cin>>c>>step;
    d=(c+step>='Z')?'A'+(c+step)%'Z'-1:c+step;
    /********** End **********/
    // 输出密文
    cout << d;
    return 0;
}

第4关:二进制数据的位运算:字符是怎么存储的

200

  • 任务要求
  • 参考答案
  • 评论206
  • 任务描述
  • 相关知识
    • 位运算
      • 按位与
      • 按位或
      • 按位异或
      • 按位取反
      • 向左移位
      • 向右移位
    • 字符的二进制位的计算
  • 编程要求
  • 测试说明

任务描述

字符变量用来存储字符,一个字符占1个字节(8位),字符存储的其实是 ASCII 码表中所对应的整数,这些整数以 0-1 串来表示。那么每个字符对应的 0-1 串到底是什么呢?

本关任务:输入一个字符,输出该字符在内存中存储时对应的 0-1 串。

例如:‘A’的 ASCII 码是65,对应的8位二进制 0-1 串是 01000001。

相关知识

本关将介绍如何通过位运算来获得一个字符对应的字节值(即8个位对应的 0-1 值)。首先介绍一下位运算的基本知识。

位运算

位运算允许在二进制位级别上对数据进行操作。C 和 C++ 支持 6 种不同的位运算符。

运算符 名称 示例 说明
& 按位与 a & b a 和 b 的每一位作与运算
| 按位或 a | b a 和 b 的每一位作或运算
^ 按位异或 a ^ b a 和 b 的每一位作异或运算
~ 按位取反 ~ a 将 a 的每一位取反
<< 向左移位 a << b 将 a 的每一位向左移 b 位
>> 向右移位 a >> b 将 a 的每一位向右移 b 位

按位与

两个操作数的按位与(&)是将两个操作数二进制表示的对应位进行与运算,即如果两个操作数的对应位都为1,则结果的对应位也为1,否则为0。

例如,3 & 14 结果为2,计算方法为:

 
  
  1. 3 的二进制表示: 00000011 ;
  2. 14 的二进制表示: 00001110 ;
  3. 3 & 14 的二进制表示: 00000010 。

按位或

两个操作数的按位或(∣)是将两个操作数二进制表示的对应位进行或运算,即如果两个操作数的对应位都为0,则结果的对应位也为0,否则为1。

例如,3 | 14 结果为15,计算方法是:

 
  
  1. 3 的二进制表示: 00000011 ;
  2. 14 的二进制表示: 00001110 ;
  3. 3 | 14 的二进制表示: 00001111 。

按位异或

两个操作数的按位异或(^)是将两个操作数二进制表示的对应位进行异或运算,即如果两个操作数的对应位不相同,则结果的对应位为1,相同则为0。

例如,3 ^ 14 结果为13,计算方法是:

 
  
  1. 3 的二进制表示: 00000011 ;
  2. 14 的二进制表示: 00001110 ;
  3. 3 ^ 14 的二进制表示: 00001101 。

按位取反

按位取反(~)是将操作数二进制表示的对应位进行取反运算,即如果操作数的对应位为0,则结果的对应位为1,操作数为0,则结果对应位为0。

例如,~14 结果为241,计算方法是:

 
  
  1. 14 的二进制表示: 00001110 ;
  2. ~ 14 的二进制表示: 11110001 。

向左移位

向左移位(<<)是将左操作数的二进制表示向左移位,移动的位数就是右操作数(右操作数必须是非负值)的值,右端移出的空位填充0,移位后的左操作数的值即为运算的结果。

例如,3 << 2 结果为12,计算方法是:

 
  
  1. 3 的二进制表示: 00000011 ;
  2. 3 << 2 的二进制表示: 00001100 ;

向右移位

向右移位(>>)是将左操作数的二进制表示向右移位,移动的位数就是右操作数的值,移位后的左操作数的值即为运算的结果。

左端移出的空位填充方式取决于左操作数的类型和具体的值:如果左操作数是无符号类型,或者是有符号类型但其值非负(最高位为0),那么高位填充0;如果左操作数是有符号类型,并且为负数(最高位为1),高位填充的值取决于所用的计算机系统,有的 C 和 C++ 系统实现填充0,有的填充1。

字符的二进制位的计算

有了上述位运算,我们就可以使用按位与运算判断一个字符的二进制表示(共8位)的某一位是1还是0。

例如下面的语句输出了字符变量 c 的二进制表示的第7位的值(c 的二进制表示有8位,从左到右分别为第 1 ~ 8 位):

 
  
  1. cout << (int)(bool)(c & 0x02);

该语句输出表达式(int)(bool)(c & 0x02)的值。该表达式有三个运算符:强制类型转换( int )、强制类型转换( bool )和按位与运算符 &。

因为括号的原因,表达式先计算c & 0x02。0x02 是十六进制的02,其二进制表示为 00000010 。将 c 和 0x02 进行按位与,除了第7位外,不需要管 c 的其它位是什么,因为 0x02 除了第7位,其它位都是0。那么就有,如果 c 的第7位如果是1,则按位与的结果就是 00000010,否则结果为 00000000。

然后再进行两个类型转换运算,优先级相同,右结合,所以先计算(bool)(c & 0x02),即将计算结果转换为 bool 类型。如果c & 0x02的值为 00000000,则结果为 false,否则结果为 true(即只要有一位不为0,则整个十六进制数转换后即为 true)。最后再把计算结果转换为 int 类型,即如果前面的计算结果是 true,转换结果就是1,否则是0。

所以整个表达式的运算效果是:如果 c 的第7位为0,就输出0,第7位数为1则输出1。以此类推,我们就可以计算出 c 对应的二进制8位 0-1 串了。

更多关于位运算符的使用参见:百度百科位运算 。

编程要求

在右侧编辑器中的Begin-End之间补充代码,实现输入一个字符(该字符由平台提供,你需要获取后使用),程序输出字符对应二进制 0-1 串。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:4 预期输出:00110100

测试输入:A 预期输出:01000001

说明:第一个测试用例的输入是字符 4,其 ASCII 码值为 52,所以二进制表示为 00110100。


开始你的任务吧,祝你成功!

// 包含两种I/O库,可以使用任一种输入输出方式
#include 
#include 
using namespace std;

int main()
{
    char c;     // c-存储输入的字符
    cin >> c;     // 输入字符
    // 请在Begin-End之间添加代码,输出 c 的 8 位二进制表示
    /********** Begin *********/
	cout<<(int)(bool)(c&128);
    cout<<(int)(bool)(c&64);
    cout<<(int)(bool)(c&32);
    cout<<(int)(bool)(c&16);
    cout<<(int)(bool)(c&8);
    cout<<(int)(bool)(c&4);
    cout<<(int)(bool)(c&2);
    cout<<(int)(bool)(c&1);//进行每个位的变一,总共有8位,2^0,2^1,2^2……2^8进行每个位的遍历,看是否为一,真就输出
    /********** End **********/
    return 0;
}

你可能感兴趣的:(c++,c语言,算法)