C++ 语法基础(二)(一)

简介: C++ 语法基础(二)(一)

结构化程序设计

自顶向下的分解,每个小问题设计为一个函数,公共小问题可以设计成一个库实现阶段


image.png


自底向上的实现


程序由3种基本结构组成


顺序

分支

循环

功能


提供游戏指南

计算机随机产生正反面,让用户猜,报告对错结果

重复玩游戏过程,直到用户不想玩了为止

顶层分解


程序要做两件事:显示程序指南;模拟玩游戏的过程。

void prn_instruction();
void play();

prn_instruction()的实现

只要一系列的输出语句把程序指南显示一下就可以了

void prn_instruction()
{
    cout << "这是一个猜硬币正反面的游戏.\n";
    cout << "我会扔一个硬币,你来猜.\n";
    cout << "如果猜对了,你赢,否则我赢。\n";
}

play()函数的实现


随机产生正反面,让用户猜,报告对错结果,然后询问是否要继续玩


生成正反面:生成0和1两个随机数

输入用户的猜测:抽象成一个函数get_call_from_user。

void play()
{ 
        char flag = ‘y’;
        while ( flag == ‘Y’ || flag == ‘y’)
        { 
                coin = 生成正反面;
                输入用户的猜测;
                if  (用户猜测 == coin) 
                  报告本次猜测结果正确;
                else  
                  报告本次猜测结果错误;
                询问是否继续游戏
        }
}

产生随机数


srand(time(NULL));

coin = rand() * 2 / RAND_MAX;

get_call_from_user()的实现


该函数接收用户输入的一个整型数。如果输入的数不是0或1,则重新输入,否则返回输入的值

int get_call_from_user()
{
    int guess;
    do
    {
        cout << "\n输入你的选择(0表示正面,1表示反面):";
        cin >> guess;
    } while (guess != 0 && guess != 1);
    return guess;
}

image.png

枚举类型与头文件

知识点


程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。


石头、剪子、布游戏


要求


游戏规则:布覆盖石头;石头砸坏剪刀;剪刀剪碎布


游戏过程:


游戏者选择出石头、剪子或布


计算机也随机选择一个


输出输赢结果


继续游戏,直到游戏者选择结束为止


在此过程中,游戏者也可以阅读游戏指南或看看当前战况


第一层的分解:函数抽取(获取用户输入;获取机器输入;评判结果 ;报告结果并记录结果信息;显示目前战况;显示帮助信息)


image.png


类型定义格式


                         enum 枚举类型名 {元素表};


石头、剪子、布中的枚举类型


                        用户输入值的类型:enum p_r_s { paper, rock, scissor, game, help, quit } ;


                        比较结果类型:enum outcome { win, lose, tie } ;


枚举类型变量的定义


                       p_r_s select;


枚举类型变量的使用


                      赋值: select = paper;


                      比较:paper < rock 比较这两个值的内部表示


                     枚举类型不能直接输入输出


枚举类型的内部表示


采用编码表示:默认用0代表pape, 1代表rock ,…,5 表示quit


指定编码值


希望从1而不是0开始编号,可以这样定义


enum p_r_s { paper = 1, rock, scissor, game, help, quit } ;


可以从中间某一个开始重新指定,如


enum p_r_s { paper, rock = 5, scissor, game, help, quit } ;



选择题

1.


阅读下面的代码,写出输出结果

#include <bits/stdc++.h>
using namespace std;
enum fruits
{
    apple,
    banana,
    orange,
    grapes = 4,
    strawberry,
    pear
};
enum students
{
    math,
    chemistry,
    cs,
    physics,
    biology
};
int main()
{
    fruits a = apple, b = orange, c = strawberry;
    students d = math, e = physics;
    cout << (int)a << ' ' << (int)b << endl;
    cout << ((a == d) ? "Yes" : "No") << endl;
    cout << ((c <= e) ? "Yes" : "No") << endl;
    return 0;
}


image.png


概念


                        把程序再分成几个小的源文件。每个源文件都包含一组相关的函数


                        一个源文件被称为一个模块


模块划分标准


                      同一模块中的函数比较类似


                      块内联系尽可能大,块间联系尽可能小


案例——石头、剪刀、布游戏


游戏规则


                    布覆盖石头,石头砸坏剪刀,剪刀剪碎布


游戏的过程


游戏者选择出石头、剪子或布

计算机也随机选择一个

输出输赢结果

继续游戏,直到游戏者选择结束为止

在此过程中,游戏者也可以阅读游戏指南或看看当前战况。

石头、剪子、布中的枚举类型定义


用户输入值的类型:enum p_r_s { paper, rock, scissor, game, help, quit } ;

比较结果类型:enum outcome { win, lose, tie } ;

模块划分


主模块:main函数

获取选择的模块: selection_by_player、selection_by_machine

比较模块:compare

输出模块: report、prn_game_status、prn_help

Select模块的设计


selection_by_player


功能:从键盘接收用户的输入并返回此输入值


原型: p_r_s selection_by_player();


selection_by_machine


功能:由机器产生一个石头、剪子、布的值,并返回


原型: p_r_s selection_by_machine();


Compare模块的设计


功能:compare函数比较用户输入的值和机器产生的值,确定输赢

参数:用户输入的值和机器产生的值,都是p_r_s类型的

返回值:判断的结果 , 是outcome类型

原型:outcome compare( p_r_s, p_r_s );

print模块的设计


prn_help


功能:显示一个用户输入的指南,告诉用户如何输入他的选择。它没有参数也没有返回值


原型: void prn_help();


Report


功能:函数报告输赢结果,并记录输赢的次数


参数:输赢结果、输的次数、赢的次数和平局的次数


返回值:无


原型:void report(outcome result);


prn_game_status


功能:报告至今为止的战况


参数:输的次数、赢的次数和平的次数


返回值:无


原型:void prn_game_status();


image.png


相关文章
|
12天前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
29 2
|
1月前
|
Java 编译器 程序员
C++中的语法知识虚继承和虚基类
**C++中的多继承可能导致命名冲突和数据冗余,尤其在菱形继承中。为解决这一问题,C++引入了虚继承(virtual inheritance),确保派生类只保留虚基类的一份实例,消除二义性。虚继承通过`virtual`关键字指定,允许明确访问特定路径上的成员,如`B::m_a`或`C::m_a`。这样,即使基类在继承链中多次出现,也只有一份成员副本,简化了内存布局并避免冲突。虚继承应在需要时提前在继承声明中指定,影响到从虚基类派生的所有后代类。**
44 7
|
1月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
49 13
|
2月前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
52 13
|
2月前
|
编译器 C语言 C++
|
2月前
|
存储 自然语言处理 编译器
【C++语言1】基本语法
【C++语言1】基本语法
|
3月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
46 1
|
3月前
|
存储 C++ 容器
【C++从练气到飞升】09---string语法指南(二)
【C++从练气到飞升】09---string语法指南(二)
|
3月前
|
存储 Linux C语言
【C++从练气到飞升】09---string语法指南(一)
【C++从练气到飞升】09---string语法指南(一)