首页 > 其他分享 >第一章

第一章

时间:2024-11-06 19:41:26浏览次数:1  
标签:std cout int 练习 C++ 第一章 include

借鉴github上一位大佬的

1.1 节练习

练习 1.1

在Linux终端里面:

首先利用vim编辑器写一个test.cpp文件

内容如下:

img

通过g++ -o test test.cpp生成了一个可执行文件test

img

img

在UNIX和Windows系统中,执行完一个程序后,都可以通过echo命令获得其返回值。

在UNIX系统中(Linux其实是类UNIX系统,也适用),通过如下命令获得状态:

echo $?

img

发现返回值为1,这肯定不正常。

然后这样做了:

img

明确指定文件位置,用一个“.”后跟一个斜线来指出可执行文件位于当前目录中。

发现返回0,这表明程序没有遇到任何错误,并且成功执行完毕。

补充:

在Windows系统中,执行完一个程序后,通过echo %errorlevel%命令获得其返回值。

补充(自己按照书上实验了一下):

如果省略了-o test,在UNIX系统中编译器会生成一个名为a.out的可执行文件。

img

真的自动生成了一个可执行文件a.out

img

然后运行这个文件,发现返回值为0,这表明程序没有遇到任何错误,并且成功执行完毕。

img

练习 1.2

改写test.cpp文件

img

img

居然返回255

换了a.out试了下,发现也是返回255,然后问了gpt

附上gpt的回答:

在Linux系统中,程序的返回值实际上是通过进程的退出状态码来传递的。C++程序的return语句返回的值会被转换成一个8位无符号整数,并且在进程退出时,这个返回值会被传递给操作系统。

具体来说,Linux中的进程退出状态码由两部分组成:

- 退出状态(exit status):这是程序的返回值,范围是0-255。

- 信号状态(signal status):如果程序是由于某个信号而终止的,信号会影响退出状态。

当你的程序返回-1时,它会被转换为255,这是因为-1在转换为无符号整数时的值是255。

然后在Windows系统下试了一下:

test.cpp内容如下:

img

在visual studio自带的编辑器运行,发现返回值为-1。

img

1.2 节练习

练习 1.3

img

通过使用作用域运算符(::)来指出我们想使用定义在命名空间std中的名字cout

endl是一个被称为操纵符(manipulator)的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。

练习 1.4

img

练习 1.5

img

练习 1.6

不合法

img

改成:

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;

补充:

在Linux环境下也试了下:

demo.cpp内容如下:

img

img

1.3 节练习

练习 1.7

img

练习 1.8

img

补充:

发现第一个warning警告: [Warning] command line option '-std=c99' is valid for C/ObjC but not for C++

如何去除?

原先这样:
img

改成这样:

img

即指定-std=c++0x参数来打开对C++11的支持,或者使用-std=c++11参数来打开对C++11的支持。

chatgpt是这样介绍的:

C++0x是C++11标准的一个早期名称。在C++标准化过程中,C++11最初被称为C++0x,因为它的最终版本在2011年之前尚未发布。这个标准引入了许多新特性,如自动类型推导、范围for循环、智能指针等,极大增强了C++的功能和易用性。

C++11是C++标准的正式名称,包含了C++0x的所有特性。C++0x是一个过渡名称,表示当时尚未正式发布的标准。C++11引入了许多新特性,如:

自动类型推导(auto)
范围for循环
智能指针(std::unique_ptr和std::shared_ptr)
线程支持
lambda表达式

因此,C++0x和C++11指的是同一个标准,但C++11是其正式名称。

1.4.1 节练习

练习 1.9

#include <iostream>

int main()
{
	int sum = 0;
	int i = 50;
	while (i <= 100)
	{
		sum += i;
		i ++;
	}
	std::cout << sum << std::endl;
	return 0;	
}

img

练习 1.10

#include <iostream>

int main()
{
	int i = 11;
	while (i)
	{
		i --;
		std::cout << i << ' ';
	}
	
	std::cout << std::endl;
	return 0;
}

img

也可:

#include <iostream> 
int main() 
{ 
 int i = 10; 
 while (i >= 0) { 
 std::cout << i << " "; 
 i--; 
 } 
 std::cout << std::endl; 
 return 0; 
}

练习 1.11

#include <iostream>

int main()
{
	std::cout << "请输入两个数"; 
	std::cout << std::endl; 
	int v1, v2; 
	std::cin >> v1 >> v2; 
	if (v1 > v2) // 由大至小打印
		while (v1 >= v2) { 
		std::cout << v1 << " "; 
		v1--; 
 		}
 	else // 由小至大打印
		while (v1 <= v2) { 
			std::cout << v1 << " "; 
			v1++; 
		} 
		
	std::cout << std::endl; 
	
	return 0; 
}

img

记得要先判断输入的两个数之间的大小,避免循环出不来(死循环)的情况。

也看到了一种值得学习的写法:

#include <iostream>

void  print_range(int lo, int hi)
{
	if (lo > hi)
	{
		print_range(hi, lo);
		return;
	}
	while (lo <= hi)
	{
		std::cout << lo << std::endl;
		++lo;
	}
}

int main()
{
	int low, high;
	std::cout << "please input two numbers : " << std::endl;
	std::cin >> low >> high;

	print_range(low, high);
	return 0;
}

img

虽然对于这个代码,当输入的第一个数大于输入的第二个数时,不能实现由第一个输入的数从大到小打印至输入的第二个数(即逆序输出),但是这个代码结构还是值得学习的。

1.4.2 节练习

练习 1.12

此循环将 −100 到 100 之间(包含 −100 和 100)的整数相加(即从 -100 加到 100 ),sum 的终值是 0。

练习 1.13

比较简单,不赘叙了

练习 1.14

在StackOverflow有类似的问题

蛮有意思的,可以看下

练习 1.15

不赘叙

1.4.3 节练习

练习 1.16

#include <iostream>

int main()
{
	int sum = 0, value = 0;
	
	while (std::cin >> value)
	{
		sum += value;
	}
	std::cout << sum << std::endl;
	return 0;
}

img

img

补充:

  • 当我们使用一个istream对象作为条件时,其效果是检测流的状态。

    如果流是有效的,即流未遇到错误,那么检测成功。

    当遇到文件结束符(end-ofFfile),或遇到一个无效输入时,istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。

  • 文件结束符

    当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。

    在Windows系统中,输入文件结束符的方法是敲Ctrl+Z(按住Ctrl键的同时按Z键), 然后按Enter或Retum键。

    在UNIX系统中,包括MacOSX系统中,文件结束符输入是用Ctrl+D。

1.4.4 节练习

img

img

img

1.5.1 节练习

练习 1.20

#include <iostream> 
#include "Sales_item.h" 
int main()
{
	Sales_item book;
	std::cout << "请输入销售记录:"
		<< std::endl;
	while (std::cin >> book) {
		std::cout << "ISBN、售出本数、销售额和平均售价为 "
			<< book << std::endl;
	}
	return 0;
}

img

练习 1.21

#include <iostream> 
#include "Sales_item.h" 
int main()
{
	Sales_item trans1, trans2;
	std::cout << "请输入两条 ISBN 相同的销售记录:"
		<< std::endl;
	std::cin >> trans1 >> trans2;
	if (compareIsbn(trans1, trans2))
		std::cout << "汇总信息:ISBN、售出本数、销售额和平均售价为 "
		<< trans1 + trans2 << std::endl;
	else
		std::cout << "两条销售记录的 ISBN 不同" << std::endl;
	return 0;
}

img

其中compareIsbn函数是在Sales_item.h文件中定义的,如下:

img

练习 1.22

#include <iostream> 
#include "Sales_item.h" 
int main()
{
	Sales_item total, trans;
	std::cout << "请输入几条 ISBN 相同的销售记录:"
		<< std::endl;
	if (std::cin >> total) {
		while (std::cin >> trans)
			if (compareIsbn(total, trans)) // ISBN 相同
				total = total + trans;
			else { // ISBN 不同
				std::cout << "ISBN 不同" << std::endl;
				return -1;
			}
		std::cout << "汇总信息:ISBN、售出本数、销售额和平均售价为 "
			<< total << std::endl;
	}
	else {
		std::cout << "没有数据" << std::endl;
		return -1;
	}
	return 0;
}

img

img

这个程序和1.4.4 节练习中的程序巧妙处有点像,但是又不完全一样

看了一位大佬写的:

#include <iostream>
#include "Sales_item.h"

int main()
{
	Sales_item currItem, valItem;
	if (std::cin >> currItem)
	{
		int cnt = 1;
		while (std::cin >> valItem)
		{
			if (valItem.isbn() == currItem.isbn())
			{
				++cnt;
			}
			else
			{
				std::cout << currItem << " occurs " << cnt << " times " << std::endl;
				currItem = valItem;
				cnt = 1;
			}
		}
		std::cout << currItem << " occurs " << cnt << " times " << std::endl;
	}
	return 0;
}

这个程序和1.4.4 节练习中的程序就基本一样了

练习 1.23

#include <iostream>
#include <cstdio>
#include "Sales_item.h"

int main()
{
	FILE* file = nullptr;
	errno_t err = freopen_s(&file, "input.txt", "r", stdin);
	if (err != 0) {
		std::cerr << "Failed to redirect input." << std::endl;
		return 1;
	}

	Sales_item trans1, trans2;
	int num = 1;
	std::cout << "若干销售记录在input.txt里,已文件重定向到输入:" << std::endl;
	if (std::cin >> trans1)
	{
		while (std::cin >> trans2)
			if (compareIsbn(trans1, trans2)) // ISBN相同
				num++;
			else
			{
				//ISBN不同
				std::cout << trans1.isbn() << " 共有 "
					<< num << " 条销售记录" << std::endl;
				trans1 = trans2;
				num = 1;
			}
		std::cout << trans1.isbn() << " 共有 "
			<< num << " 条销售记录" << std::endl;
	}
	else
	{
		std::cout << "没有数据" << std::endl;
		return -1;
	}
	return 0;
}

输出如下:

img

补充

这里我用了文件重定向(因为不想重复输入销售记录)

详细的请看这篇博客:对C++程序使用输入输出重定向

练习 1.24

在练习 1.23演示过了

练习 1.25

前面差不多了

标签:std,cout,int,练习,C++,第一章,include
From: https://www.cnblogs.com/hisun9/p/18530916

相关文章

  • 第一章 TypeScript 基础数据类型详解
    在TypeScript中,正确理解和使用各种数据类型是构建强大、类型安全的应用程序的关键。让我们深入了解TypeScript中的一些主要数据类型。一、变量声明使用`let`关键字可以定义变量。例如:leta:number=100;console.log(a);这里明确指定变量`a`的类型为`number`......
  • 【用Rust写CAD】第一章 环境搭建
    文章目录1、搭建C/C++编译环境2、安装Rust3、配置PATH环境变量4、验证安装结果5、安装编辑工具1、搭建C/C++编译环境Rust的编译工具依赖C语言的编译工具,这意味着你的电脑上至少已经存在一个C语言的编译环境。如果你使用的是Linux系统,往往已经具备了GCC或......
  • 第一章 JavaScript基础
    1.什么是JavaScriptJavaScript是一种基于对象和事件驱动的、并具有安全性能的脚本语言JavaScript特点向HTML页面中添加交互行为脚本语言,语法和Java类似解释性语言,边执行边解释JavaScript组成ES基础语法DOM操作HTML元素BOM操作浏览器前进,后退,刷新2.JavaScrip......
  • 第一章 初始Java
    一 Java语言特性1.体系结构中立(跨平台性):(1)定义:利用Java语言写出来的代码,编译器通过生成与特定计算机体系无关的字节码指令,(其构成字节码文件(.class)),可以通过不同版本的JVM(Java虚拟机)在不同的操作系统上使用。注:其他语言如果能严格按照字节码文件的规格生成.class文件,也可以通......
  • C程序设计语言 第一章 导言
    1.1入门学习一门新程序设计语言的唯一途径就是使用它编写程序。对于所有语言的初学者来说编写的第一个程序几乎都是相同的,即请打印出下列内容hello,world尽管这个练习很简单,但对于初学语言的人来说,它仍然可能成为一大障碍,因为要实现这个目的,我们首先必须编写程序文本,然后......
  • 《代码大全》读后感-第一章
    当我翻开《代码大全》这本书,开始阅读第一章时,仿佛开启了一场充满智慧与启迪的编程之旅。这一章犹如一把钥匙,为我打开了通往高质量软件开发世界的大门,让我对软件构建有了全新的认识和深刻的感悟。第一章以一种引人入胜的方式介绍了软件构建的重要性和复杂性。它让我明白,软件构建不......
  • 程序员修炼之路 从小工到专家 第一章读书笔记
    《程序员修炼之道——从小工到专家》的第一章“注重实效的哲学”给我留下了深刻的印象。这一章通过一系列生动的故事和实用的建议,向我们展示了成为一名优秀程序员所需要具备的品质和思维方式。在阅读过程中,我首先被书中提到的“不要害怕暴露弱点”这一观点所吸引。作者认为,......
  • 《程序员修炼之道 —— 从小工到专家》第一章有感
    《程序员修炼之道——从小工到专家》的第一章节有感在阅读此书时,我发现这本书并不是那种枯燥无味的,而是其中有很多小故事,我们从故事中,可以明白其中的对于我们程序员来讲很不错的习惯和道理此章节着重强调了务实的态度对于程序员的根本性意义。在当今快速发展的科技领域,程序员......
  • 《读〈程序员修炼之道:从小工到专家〉第一章有感》
    《程序员修炼之道:从小工到专家》的第一章“注重实效的哲学”阐述了许多对程序员来说至关重要的观念。首先,书中强调了要关注你的技艺。就像工匠对待自己的手艺一样,程序员不能仅仅满足于完成任务,而是要不断打磨自己的编程技能,保持对新技术、新方法的好奇心。这是成为优秀程序员的基......
  • vue3第一章基础:创建Vue3.0工程,包括使用vue-cli 创建、使用 vite 创建
    @目录一、vue2、vue3、vue-cli版本、vue-router版本的关联关系1.说明2.不同版本的vue对应的vue-router版本和vuex版本二、创建Vue3.0工程1.使用vue-cli创建2.使用vite创建一、vue2、vue3、vue-cli版本、vue-router版本的关联关系1.说明1.VueCLI4.5以下,对应的是Vue2;Vue......