C++Primer练习[第一章]

//1.1节练习
//1.1 查阅你使用的编译器的文档,确定它所使用的文件命名约定,编译并运行main程序。
int main()
{
return 0;

}

//1.2改写程序,让它返回-1,返回-1通常被当作程序错误的标识。重新编译运行你的程序,观察你的系统如何处理main返回的错误标识。
int main()
{
return -1;
}

//答 返回 - 1 和返回0 ,在单个函数中没看出有什么区别,系统也不会做什么处理

//1.2节练习
//1.3 编写程序,在标准输出上打印 hello,World。
#include <iostream>
int main()
{
std::cout << "hello,World";
return 0;

}



//1.4:我们程序使用加法运算符 + 来讲两个数相加,编写程序使用乘法运算 * ,来打印两个数的积。
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of " << v1 << " product " << v2 << " is " << v1 * v2 << std::endl;
return 0;

}



//1.5:我们将所有输出操作放在一条很长的语句中。重写程序将每个打印操作放在独立的语句中。
#include <iostream>
int main()
{
std::cout << "Enter two numbers:";
std::cout << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of ";
std::cout << v1;
std::cout << " product ";
std::cout << v2;
std::cout << " is ";
std::cout << v1 * v2;
std::cout << std::endl;
return 0;

}



//1.6解释下面程序片段是否合法,
//std::cout << "the sum of" << v1;
// << "and" << v2;
// << "is" << v1 * v2 << std::endl;
//如果程序合法,它输出什么?如果不合法,原因何在?应该如何修正?
//答 不合法,因为输出的时候需要用std::cout 在v1以后已经有;号代表这个语句完结,下一个语句<< "and" << v2;缺少了std::cout这个标准输出对象。
//修改方法有多种,可以去掉v1 v2后面的;号,也可以在 << "and" << v2; 和 << "is" << v1 * v2 << std::endl; 前面加上 std::cout 
std::cout << "the sum of" << v1
       << "and" << v2
       << "is" << v1 * v2 << std::endl;
std::cout << "the sum of" << v1;
std::cout << "and" << v2;

std::cout << "is" << v1 * v2 << std::endl;


//1.3节练习
//1.7编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
 int main()
 {
  /*
  /*
  */
  */
  return 0;
 }
//答 返回的错误信息为 
//e:\c++primer\1_1_1\1_1_1\main.cpp(74) : warning C4138 : 在注释外找到“ * / ”

//e:\c++primer\1_1_1\1_1_1\main.cpp(74): error C2059: 语法错误:“/”


//1.8指出下列输出语句那些是合法的(如果有的话)
//std::cout << "/*";
//std::cout << "*/";
//std::cout <</*"*/"*/;
//std::cout <</*"*"/*"*/"*/;
//预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将一条语句作为其主体)改正每个编译错误。 
//答 
//std::cout << "/*";合法
//std::cout << "*/";合法
//std::cout <</*"*/"*/;不合法 少了 " 导致编译器认为常量中有换行符
//std::cout <</*"*"/*"*/"*/;不合法 少了 " 导致编译器认为常量中有换行符
#include <iostream>
int main()
{
std::cout << "/*";
std::cout << "*/";
std::cout <</*"*/"*/";
std::cout <</*"*"/*"*/"*/";
return 0;

}


//1.4.1节练习
//1.9 编写程序,使用while循环将50到100的整数相加
int main()
{
int i = 50;
int sum = 0;
while (i <= 100)
{
sum = sum + i;
i++;
}
return 0;

}



//1.10除了++运算符将运算对象的值加1之外,还有一个递减运算符–实现将值减一,编写程序,使用递减运算符在循环中按递减顺序打印出10到0的整数。
#include <iostream>
int main()
{
int i = 10;
while(i >= 0)
{
std::cout << i << std::endl;
i--;
}
return 0;

}



//1.11 编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
#include <iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "请输入两个整数,用空格分开: " << std::endl;
std::cin >> v1 >> v2;
int i = v1;
int max = v2;
if (v1 > v2)
{
i = v2;
max = v1;
}
while(i <= max)
{
std::cout << i << std::endl;
i++;
}
return 0;

}



//1.4.2练习
//1.12 下面for循环完成了什么功能,sum的终值是多少?
//int sum = 0;
//for (int i = -100; i <= 100; i++)
// sum += i;

//答 下面for循环完成了统计从 -100 到 100 的累加 最终值为0(因为-100到0的累加和 0到100的累加的绝对值相等)


//1.13使用for循环重做1.4.1节的所有练习。
//1.4.1节练习
//1.9 编写程序,使用while循环将50到100的整数相加
//int main()
//{
// int sum = 0;
// for(int i = 50; i <= 100; i++)
// {
// sum = sum + i;
// }
// return 0;
//}

//1.10除了++运算符将运算对象的值加1之外,还有一个递减运算符–实现将值减一,编写程序,使用递减运算符在循环中按递减顺序打印出10到0的整数。
// #include <iostream>
// int main()
// {
// for(int i = 10;i >= 0;i--)
// {
// std::cout << i << std::endl;
// }
// return 0;
// }

//1.11 编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
// #include <iostream>
// int main()
// {
// int v1 = 0, v2 = 0;
// std::cout << "请输入两个整数,用空格分开: " << std::endl;
// std::cin >> v1 >> v2;
// int i = v1;
// int max = v2;
// if (v1 > v2)
// {
// i = v2;
// max = v1;
// }
// for( ; i <= max; i++)
// {
// std::cout << i << std::endl;
// }
// return 0;

// }


//1.14 对比for循环和while循环,两者的优缺点各是什么?
//答 for循环优点是更适用于知道固定次数的循环,而且形式比较简洁 缺点是比较不适用于未知次数的循环
// while循环的有点是更适用于只知道条件,不确定次数的循环,缺点是对退出条件不好把握

// 不过他们只是形式上有优缺点,功能是一致的


//1.15编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器错误信息 
// 语法错误
// 错误:main的参数列表漏掉了
// int main({
// // 错误: endl后使用了冒号而非分号
// std::cout << "Read each file." << std::endl:
// // 错误:字符串字面常量的两侧漏掉了引号
// std::cout << Update master. << std::endl;
// // 错误:漏掉了第二个输出运算符
// std::cout << "Write new master." std::endl;
// //错误: return 语句漏掉了分号
// return 0
// }
//修正:
// #include <iostream>
// int main()
// {
// std::cout << "Read each file." << std::endl;
// std::cout << "Update master." << std::endl;
// std::cout << "Write new master." << std::endl;
// return 0;
// }
//类型错误
// int main()
// {
// //error C2440 : “初始化”: 无法从“const char[6]”转换为“int”
// int i = "hello";
// return 0;
// }
//修正
// int main()
// {
// int i = 0;
// return 0;
// }
//声明错误
// #include <iostream>
// int main()
// {
// int v1 = 0, v2 = 0;
// //错误: error C2065: “v”: 未声明的标识符, 应该为v1
// std::cin >> v >> v2;
// //错误:error C2065: “cout”: 未声明的标识符,应该是std::cout 或者在前面using 
// cout << v1 + v2 << std::endl;
// return 0;
// }
//修正
// #include <iostream>
// int main()
// {
// int v1 = 0, v2 = 0;
// std::cin >> v1 >> v2;
// std::cout << v1 + v2 << std::endl;
// return 0;

// }


//1.4.3练习
//1.16 编写程序从cin读取一组数,输出其和。
#include <iostream>
int main()
{
int i = 0;
int sum = 0;
std::cout << "请输入一组数字,用空格或者回车分开,^z确认结束输入" << std::endl;
while (std::cin >> i)
{
sum += i;
}
std::cout << "总和为: " << sum << std::endl;
return 0;

}



//1.4.4练习
//1.17 如果输入的所有值都是相等的,本节程序输出什么,如果没有重复值,输出又会是怎样的? 
// #include <iostream>
// int main()
// {
// //currVal 是我们正在统计的数;我们将读入的新值存入val
// int currVal = 0, val = 0;
// //读取第一个数,并确保有数据可以处理
// if (std::cin >> currVal)
// {
// //保持我们正在处理的当前值的个数
// int cnt = 1;
// //读取剩余的数
// while (std::cin >> val)
// {
// //如果值相同
// if (val == currVal)
// //将cnt 加 1
// ++cnt;
// //否则打印前一个值的个数
// else
// {
// std::cout << currVal << " occurs "
//  << cnt << " times " << std::endl;
// //记住新值
// currVal = val;
// //重置计数器
// cnt = 1;
// }
// }//while 循环在这里结束
// //记住打印文件中最后一个值的个数
// std::cout << currVal << " occurs "
//  << cnt << " times " << std::endl;
// }//最外层的if语句在这里结束
// return 0;
// }
//答 如果所有值都是相等的 则输出 值 occurs 输入次数 times 

//如果所有值都是不相等的 则输出 分别为 各个值 occurs 1 times


//1.18编译并运行本节程序,给他输入全部相等的值,再次运行程序,输入没有重复的值。
#include <iostream>
int main()
{
//currVal 是我们正在统计的数;我们将读入的新值存入val
int currVal = 0, val = 0;
//读取第一个数,并确保有数据可以处理
if (std::cin >> currVal)
{
//保持我们正在处理的当前值的个数
int cnt = 1;
//读取剩余的数
while (std::cin >> val)
{
//如果值相同
if (val == currVal)
//将cnt 加 1
++cnt;
//否则打印前一个值的个数
else
{
std::cout << currVal << " occurs "
 << cnt << " times " << std::endl;
//记住新值
currVal = val;
//重置计数器
cnt = 1;
}
}//while 循环在这里结束
//记住打印文件中最后一个值的个数
std::cout << currVal << " occurs "
 << cnt << " times " << std::endl;
}//最外层的if语句在这里结束
return 0;

}




//1.19 修改你为1.4.1节练习1.11所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况
//答 本来写的时候就已有此功能。。
//1.11 编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
// #include <iostream>
// int main()
// {
// int v1 = 0, v2 = 0;
// std::cout << "请输入两个整数,用空格分开: " << std::endl;
// std::cin >> v1 >> v2;
// int i = v1;
// int max = v2;
// if (v1 > v2)
// {
// i = v2;
// max = v1;
// }
// while(i <= max)
// {
// std::cout << i << std::endl;
// i++;
// }
// return 0;

// }


//1.5.1练习 
//1.20 在网站http://www.informit.com/title/0321714113上,第一章的代码目录中包含了头文件Sales_item.h,将他拷贝到你自己的工作目录中,
//用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
#include "Sales_item.h"
#include <iostream>
int main()
{
Sales_item book;
while (std::cin >> book)
{
std::cout << book << std::endl;
}
return 0;

}



//1.21,编写程序,读取两个ISBN相同的Sales_item对象,输出它们的和
#include "Sales_item.h"
#include <iostream>
int main()
{
Sales_item book1, book2;


std::cout << "请输入两个ISBN相同的销售记录" << std::endl;
std::cin >> book1 >> book2;
while(book1.isbn() != book2.isbn())
{
std::cout << "请输入两个ISBN相同的销售记录" << std::endl;
std::cin >> book1 >> book2;
}
std::cout << "总和:" << book1 + book2 << std::endl;
return 0;

}



//1.22 编写程序,读取多个具有相同ISBN的销售记录,输出所有记录之和
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
Sales_item sum_book;
std::cout << "请输入ISBN相同的销售记录" << std::endl;
if (std::cin >> book)
{
sum_book = book;
std::cout << "请输入ISBN相同的销售记录" << std::endl;
while (std::cin >> book)
{
if (book.isbn() == sum_book.isbn())
{
sum_book = sum_book + book;
std::cout << "请输入ISBN相同的销售记录" << std::endl;
}
else
{
std::cout << "请输入ISBN相同的销售记录" << std::endl;
}
}
std::cout << "总和:" << sum_book << std::endl;
}
else
{
std::cerr << "没有数据" << std::endl;
return -1;
}
return 0;

}



//1.5.2练习
//1.23 编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。
//因为还没讲到数组,暂将题目理解成连续的销售记录
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book, currbook;
int count = 0;
std::cout << "请输入销售记录" << std::endl;
if (std::cin >> book)
{
currbook = book;
count = 1;
std::cout << "请输入销售记录" << std::endl;
while (std::cin >> book)
{
if (currbook.isbn() == book.isbn())
{
count++;
}
else
{
std::cout << currbook.isbn() << "有" << count << "条记录" << std::endl;
currbook = book;
count = 1;
}
std::cout << "请输入销售记录" << std::endl;
}
std::cout << currbook.isbn() << "有" << count << "条记录" << std::endl;
}
else
{
std::cerr << "没有数据" << std::endl;
return -1;
}


return 0;

}



//1.24:输入表示多个ISBN的多条销售记录来测试上一个程序,每个ISBN的记录应该聚在一起。 

//不知道题目意思


//1.25:借助网站上的Sales_item.h 头文件,编译并运行本节给出的书店程序。
#include <iostream>
#include "Sales_item.h"
int main()
{
//保持下一条交易记录的变量
Sales_item total;
//读入第一条交易记录,并确保有数据可以处理
if (std::cin >> total)
{
//保持和的变量
Sales_item trans;
//读入并处理剩余交易记录
while (std::cin >> trans)
{
//如果我们仍在处理相同的书
if (total.isbn() == trans.isbn())
//更新总销售量
total += trans;
else
{
//打印前一本书的结果
std::cout << total << std::endl;
//total现在表示下一本书的销售额
total = trans;
}
}
//打印最后一本书的结果
std::cout << total << std::endl;
}
else
{
//没有输入!警告读者
std::cerr << "No Data?!" << std::endl;
//表示失败
return -1;
}
return 0;

}



猜你喜欢

转载自blog.csdn.net/sukeychen/article/details/79604998