C++ Primer 习题解答 第一章

自己动手做习题,加深理解。 这些都是自己做的,如果有不对或不妥的地方,请指出,谢谢。
 
习题 1.3 编一个程序,在标准输出上打印“Hello World”
解答:
#include <iostream>
 int main()
{
   std::cout << "Hello world" << std::endl;
    return 0;
}
 
习题 1.4 我们的程序利用内置的加法操作符“+”来产生两个数的和。编写程序,使用乘法操作符“*”产生两个数的积。
解答:
#include <iostream>
int main()
{
   std::cout << "Enter two numbers:" << std::endl;
   int v1,v2;
    std::cin >> v1 >> v2;
    std::cout << "The product of " << v1
        << " and " << v2
        << " is " << v1 * v2
        << std::endl;
   return 0;
}
 
 习题 1.5 我们的程序使用了一条较长的输出语句。重写程序,使用单独的语句打印每一个操作数。
解答:见习题1.4 程序。
 
习题 1.6 解释下面的程序段:
  std::cout << "The sum of " << v1;
      << " and " << v2;
      << " is " << v1 + v2
      << std::endl;
这段代码合法吗?如果合法,为什么?如果不合法,又为什么?
解答:这段代码是不合法的,由于第一行的结尾有一个分号; ,导致后面几行没有左操作数。去掉第一行和第二行的分号,代码就合法了。
 
习题 1.8 指出下列输出语句哪些(如果有)是合法的。
std::cout << " /* ";
std::cout << " */";
std::cout << /* " */ " */;
预测结果,然后编译包含上述三条语句的程序,检查你的答案。纠正所遇到的错误。
解答:第一和第二行的语句是合法的,因为/* 和 */ 都被包含在" "里,当作字符串处理。而第三行第一个"被注释掉,相当于std::cout << " */ ; 这条语句显然是不合法的。
 
习题 1.9 下列循环做什么?sum 的最终值是多少?
int sum = 0;
for ( int i = -100; i <= 100; ++i)
  sum += i;
解答:此程序的功能是求从-100100之间整数的和,结果是0;自己可编写此程序验证一下。
 
习题 1.10 用for 循环编程,求从 50 100 的所有自然数的和。然后用while 循环重写该程序。
解答:
for 循环实现代码:
#include <iostream>
int main()
{
 int sum = 0;
 for ( int i = 50; i <= 100; ++i)
  sum += i;
 std::cout << "The sum of  50 to 100 inclusive is " << sum << std::endl;
 return 0;
}
while 循环实现代码:
#include <iostream>
int main()
{
 int sum = 0;
 int i = 50;
 while ( i <= 100 ){
  sum += i;
  ++ i;
 }
 std::cout << "The sum of  50 to 100 inclusive is " << sum << std::endl;
return 0;
}
在以后的习题中将省略#include <iostream> main(){ return 0;}
 
习题 1.11 用 while 循环编程,输出 10 0 递减的自然数。然后用 for 循环重写该程序。
解答:
while 循环实现方法:
int i = 10;
while ( i >= 0 ){
 std::cout << i << std::endl;
 -- i;
}
for 循环实现方法:
for ( int i = 10; i >= 0; -- i ){
 std::cout << i << std::endl;
}
 
习题 1.12 对比前面两个习题中所写的循环。两种形式各有何优缺点?
解答:对于while 循环,初始化变量的定义要在循环的外部,循环结束之后仍可以对该变量进行访问;对于for 循环,变量的初始化定义在语句头(当然也可以在外部定义),在语句头定义的变量,只能在循环内部使用,循环结束之后不可访问。在大多数情况下,while 循环和 for 循环都可以使用,如果确定循环的次数,一般使用for 循环,代码相对简洁;而对于循环次数不确定的情况,应该考虑使用 while 循环,就像书中1.4.4节 读入未知数目的输入 示例。
 
习题 1.14 如果输入值相等,本节展示的程序将产生什么问题?
解答:如果输入的两个值相等,即程序中lower == upper,循环体内的语句执行一次,sum值等于用户的输入值,而不是两个值的和。
 
习题 1.16 编写程序,输出用户输入的两个数中的较大者。
解答:
std::cout << "Please enter two numbers:" << std::endl;
int v1,v2;
std::cin >> v1 >> v2;
int upper;
if ( v1 >= v2 ){
 upper = v1;
}
else {
 upper = v2;
}
std::cout << "The greater of " << v1 << " and " << v2 << " is " << upper << std::endl;
 
 习题 1.17 编写程序,要求用户输入一组数。输出信息说明其中有多少个负数。
解答:
std::cout << "Please enter some numbers:" << std::endl;
     int negative = 0;
     int val;
     while ( std::cin.peek() != '/n' && std::cin >> val) {
         if ( val < 0 ) {
              ++ negative;
         }
     }
std::cout << "There are " << negative << " negative numbers." << std::endl;
 
习题 1.18 编写程序,提示用户输入两个数并将这两个数范围内的每个数写到标准输出。
解答:
std::cout << "Please enter two numbers:" << std::endl;
     int val1, val2;
     std::cin >> val1 >> val2;
     int lower, upper;
     if ( val1 >= val2 ) {
         upper = val1;
         lower = val2;
     }
     else {
         upper = val2;
         lower = val1;
     }
     std::cout << "There are the numbers between " << lower << " and " << upper << " :" << std::endl;
     for ( int i = lower; i <= upper; ++ i ) {
         std::cout << i << std::endl;
}
 
习题 1.19 如果上题给定数1000 和 2000,程序将产生什么结果?修改程序,使每一行输出不超过10个数。
解答:修改上题程序如下:
std::cout << "Please enter two numbers:" << std::endl;
     int val1, val2;
     std::cin >> val1 >> val2;
     int lower, upper;
     if ( val1 >= val2 ) {
         upper = val1;
         lower = val2;
     }
     else {
         upper = val2;
         lower = val1;
     }
     std::cout << "There are the numbers between " << lower << " and " << upper << " :" << std::endl;
         std::cout << i << " ";
         ++ j;
         if ( j == 10 ) {
              j = 0;
              std::cout << std::endl;
         }
}
 
习题 1.20 编写程序,求用户指定范围内的数的和,省略设置上界和下界的if测试。假定输入数是7和3,按照这个顺序,预测程序运行结果。然后按照给定的数是7和3运行程序,看结果是否与你预测的相符。如果不相符,反复研究关于for和while循环的讨论直到弄清楚其中的原因。
解答:如果省略设置上界和下界的if测试,按照7和3的顺序输入数值,那么for或者while循环体不会被执行,因为条件不成立。我们关心的是,如何不用if测试上界和下界,怎么完成这个功能?再扩展一下,考虑这样一个问题:不用if、switch等条件语句,怎么判断两个数的大小?计算机中保存数据是用二进制保存的,最高位为0代表正数,最高位为1表示负数。如果我们把这两个数用位运算分别向右位移一定的位数,都用最高位填充。那么,正数位移的结果就是0,负数位移的结果是-1。有了这个思路,代码就好写了:
     std::cout << "Please enter two numbers:" << std::endl;
     int val1, val2;
     std::cin >> val1 >> val2;
     int n[2] = { val1, val2 };
     int temp = ( val1 - val2) >> 16;
     int lower, upper;
     // 如果val1 >= val2,temp 就等于0, lower = n[1],upper = n[0]
     lower = n[temp + 1];
     upper = n[(temp + 2) % 2];
     std::cout << "There are the numbers between " << lower << " and " << upper << " :" << std::endl;
     for ( int i = lower, j = 0; i <= upper; ++ i ) {
         std::cout << i << " ";
         ++ j;
         if ( j == 10 ) {
              j = 0;
              std::cout << std::endl;
         }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值