使用入门

以身作则

了解如何用新语言编写程序的最佳方式之一就是查看大量示例程序。最好的做法是将以下每个程序复制并粘贴到一个文本文件中,然后对其进行编译。然后,尝试相应的实验。 通过扩展这些示例程序,您将熟悉 C++ 的不同方面,并且在从头开始编写程序时更有信心。

示例 1:让编译器正常运行!

将以下经典程序复制并粘贴到文本文件中并进行编译(如果您尚未这样做)。如需了解如何编译,请点击此处

您可能已经学习了本教程中有关此程序的详细信息,因此我们不会在此提供逐行说明。不过,关于可读性,有几点需要注意。它是指能让程序易于阅读、理解和维护的注释和格式。

  • 我们编写的每个程序都以标头注释开头,提供作者的姓名、联系信息、简短说明和用法(如果适用)。每个函数都以关于操作和使用情况的注释开头。
  • 当代码本身没有进行记录时(例如,在处理棘手、不明显、有趣或重要的情况下),我们使用完整的句子添加说明注释。
  • 始终使用描述性名称:变量是用 _ 分隔的小写字词,如 my_variable。函数名称使用大写字母来标记单词,如 MyExcitingFunction() 中所示。常量以“k”开头,并使用大写字母来标记单词,如 kDaysInWeek 中。
  • 缩进量是二的倍数。第一层是两个空格;如果需要进一步缩进,可使用四个空格、六个空格等。
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

您可以尝试以下一些实验:

  • 最重要的是确保您可以编译和运行此程序。
  • 修改上述程序来输出“Hello World!”每次 6 行,一行 4 次,每次输出在一个有 17 个空格的字段中。可以使用 for 循环来实现此目的。点击此处,了解如何使用 cout 设置输出的格式。请点击此处查看解决方案。
  • 使用您刚刚完成的程序,找出如何在 17 个空格的字段中输出“Hello World!”(默认设置为右对齐)。请点击此处查看解决方案。

示例 2:获取一些输入内容

使用 cin 可以轻松地使用 C++ 从键盘中获取输入。示例如下:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

实验:

  • 当发生输入错误时,流会“中断”,cin 会返回 false,程序也会停止。正如我们在上面的程序中所做的那样,请务必注意避免此类错误。但是,如果我们想要从错误中恢复,而不是停止程序,该怎么办?如需从错误中恢复,需要执行两个步骤:
    1. 使用 cin.clear() 清除错误。
    2. 从视频流中移除错误的字符。一种方法是使用 cin.ignore()。

编写一个程序,它可以通过以下两个步骤从错误输入中恢复。请使用 Google 来搜索这些方法的工作原理。您可以在此处找到我们的解决方案。

示例 3:此程序输出什么?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

示例 4:分解让一切变得更简单...

是时候我们开始编写计算机游戏了!第一部分比较简单,但其实是一个开始。我们的任务是编写一个程序来实现猜测游戏。我们的程序会生成一个介于 0 到 100 之间的随机数字。玩家必须猜测密码。程序会提供“太高”或“太低”之类的提示,直到玩家最终猜出密码为止。

我们将分三步完善这款游戏。 

  1. 算出如何在给定的值范围内生成随机数。
  2. 创建一个主函数,用于处理玩家猜测的内容并提供提示。
  3. 添加允许多次猜测,直到玩家猜出数字所需的内容。

这个开发过程称为分解,这意味着将一个任务拆分为多个子任务,每个子任务都很容易完成。

从第 1 步开始,在 Google 中搜索,了解如何使用 C++ 生成随机数。请尝试搜索“rand C++”。点击此处,查看我们的解决方案。

对于第 2 步,我们需要接收来自播放器的整数输入(在 cin 上进行适当的错误检查),并对照密码进行检查。请先尝试自行编写游戏的这一部分,然后再查看我们的解决方案

最后,我们需要添加一个循环,用于不断收集玩家的猜测,直到玩家最终猜出密码。完成本课程的这一部分后,您可以查看我们的解决方案

分解是程序员需要学习的最重要技能之一。无论项目规模大小,能够将一项任务分解为多个易于管理的部分,然后一次完成一个任务,这一点至关重要。下面列出了一些您可以练习分解的其他机会。

  • 许多日常任务都有机会培养分解能力。您可能会惊讶地发现自己的大脑就是这样运作的!

    例如,如果我必须打扫一个杂乱无章的厨房(也许有些小女孩刚刚烤了一个蛋糕),我就会拆分任务,以便制定计划,并确保以后无需重新处理工作。如果柜台上有各种需要清理的物品,我就不想先洗地板了,我以后可能还需要再打地板。所以,也许我先舍弃所有食材,把所有菜肴移入水槽,清理柜台,清洗餐具,最后清理地板。也可以通过其他方式执行此任务,但先仔细考虑,有助于我制定一个不需要重新处理的计划。

    以日常任务为例来培养分解能力。 谁知道呢 - 它甚至还能让您在家中更高效地工作!

  • 两个整数的最大公约数是将两个整数平均相除的最大数。例如,gcd(12, 18) = 6, gcd(-4, 14) = 2。 计算 gcd 的最有效方法是使用欧几里得算法。编写一个程序,其中包含一个函数,用于计算两个整数的 gcd。请先尝试在不使用递归的情况下执行该函数,这有助于您了解算法的工作原理。

    明确定义您的子任务,例如,找到欧几里得算法的代码;为该算法创建一个非递归函数等等。点击此处是我们的解决方案。

示例 5:数学益智游戏

计算的强大功能之一是能够进行暴力破解搜索,以寻求问题的解决方案。反复试验和出错只会对某些问题有效。实际上,计算机对此类问题非常擅长。请考虑以下要点:

马为 10 美元,猪的价格为 3 美元,兔子的价格仅为 0.50 美元。一个农民花 100 美元买了 100 只动物,他买了多少只? 

有个非常简单的方法可以解决这个问题。建议您先看看我们的教程,看看能否找到它。

我再试试下面这个方法:
在书架上,您可以从左到右排列 6 本不同的图书,可以采用多少种方式?

这一次,我们只为您提供解决方案,并让您编写程序:720。

示例 6:供您考虑的字符串

以下程序会输出什么内容?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

如需帮助,请点击此处

示例 7:分解的后续步骤 - 上班的第一天

您刚刚得到了一个 ExerShoe 公司的销售人员,该公司专营高端运动鞋,每双 225 美元左右。您的老板为您提供了三个薪酬选项,您必须在第一天开始申请之前做出选择:

  1. 每周的直工资为 600 美元;
  2. 工资为每小时 $7.00,外加 10% 的销售佣金;
  3. 没有薪资,但每买一双鞋子收取 20% 的佣金,佣金为 20 美元

作为一名专业的 C++ 程序员,您可以编写一个程序来帮助决定最佳的薪酬选择。

对大型程序执行分解的一种常见方法是创建一个像概览一样读取的主函数来解决问题。然后,我们编写函数来执行每项任务。

以下是主程序中的第一次遍历:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

请先了解您能否实现上述每个功能,然后再查看我们的解决方案

示例 8:提供哪些国家/地区?

以下程序的输出是什么?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

找出答案后,请点击此处查看我们注释掉的代码版本。

示例 9:处理文件

C++ 中的文件处理是使用 fstream 执行的。为了保存到文件中,我们需要声明一个 ofstream,然后使用“out”模式打开它。详见下例。

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • 看看您能否弄清楚如何打开刚刚创建的文件并显示数据。点击此处查看我们的解决方案。
  • 现在,看看您是否可以修改此程序,以允许用户使用循环输入多条数据记录。我们还希望一次读回一条记录中的所有数据。点击此处查看我们的解决方案。

现在,您可以自行尝试一些练习和项目了!

Google 软件工程师的工作体验

访问此网站,了解在 Google 工作是一种怎样的体验。

练习和项目

以下练习将带您更多地使用基本 C++ 进行练习。我们不为这些练习和项目提供解决方案,因为我们希望您与其他学生一起学习本课程。

  1. 普通田野板球的鸣叫声与当前温度成正比。 将板球每分钟鸣叫的次数加上 40,然后将该值除以 4,即可得出温度。编写一个程序,将一分钟内的鸣叫声次数作为输入并输出当前温度。例如,
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. 编写一个程序来计算您参加的编程课程的最终成绩。以下是评分方案:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    您的程序应要求用户提供四个作业分数,即期中、期末和各单元的成绩。然后,计算并输出最终得分。 计算时,请将四项作业分数的平均值相加,然后乘以 0.4 (40%)。然后,用期中分数乘以 0.15,将期末分数乘以 0.35,然后将参与成绩乘以 0.1。然后将这些乘法的结果相加。

    在此程序中尽可能使用函数。您可以创建一个函数来获取输入,方法是将要在说明性 cout 中显示的字符串作为参数传入。下面是一个运行示例:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. 随着电子秒表越来越便宜、越来越准确,毫无疑问,时间的测量结果必然会下降到极不可能达到的结果。编写一个程序,将给定的时间段(以秒为单位)作为输入,并输出其表示的小时数、分钟数和秒数。例如,
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. 在以下内容中,请在编写程序之前进行分解。尽可能使用函数创建结构合理的程序。

  5. 假设我们要为以下内容打印横幅:

    “冰冷的微风把三颗树冻”

    由于这是横幅,因此我们希望字母非常大:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    

    作为一个很好的问题分解器,您可能会注意到,与将所有 cout 都放在主函数中相比,将它们放在函数中要高效得多。因此,我们可以创建一个“printE”函数和一个“printZ”函数,等等。

    编写一个带有函数的程序,该函数可以创建包含大量重复字母的字词或短语的横幅。以下是一些可能的使用方法:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. 这是一个“魔数”问题:要求用户输入一个三位数,且该数字的首位大于最后一个数。您的程序会反转数字,并从原始数字中减去反转。最后,将得到的数反转,然后加上其反转形式。输出最终结果。用户输入的原始数字必须是整数类型(而不是 3 个字符)。考虑如何编写一个函数,该函数接受整数作为输入并返回该数字的倒数。示例:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. 法律规定,食品制造商必须在其产品上注明下架日期,但法律上有漏洞:它不要求以任何特定形式宣传下架日期。因此,可以使用斯瓦希里语编写,并且仍然合法。

    Ralph Nader 的第三个表弟 Nadine 是一位自封的食品质量间谍。 她了解到,许多食品制造商已经开始对商品下架日期进行编码,以避免客户知道商品的下架时间。

    但是,如果出于某种原因,杂货店可以借助编码确定失效日期。

    一种常用的编码方法:

    • 将 1 月到 12 月的月份编码为“A”到“L”
    • 将日期的每个数字编码为“Q”到“Z”
    • 将年份编码为“A”到“Z”,表示 1 到 26,然后加上 1995。

    Nadine 发现了一块特别可疑的面包,这个日期是 ARZM。 编写一个程序来确定日期。

  8. 这就像一个著名的纸牌技巧。要求用户输入一个三位数的数字。将数字视为 ABC(其中 A、B、C 是该数字的三位数字)。现在,计算由 ABC、BCA 和 CAB 组成的数字除以 11 所得的余数。我们将这些余数称为 X、Y、Z。将它们加起来为 X+Y、Y+Z、Z+X。如果总和为奇数,请将其增加或减少 11(以哪个运算的结果为小于 20 的正数;请注意,如果总和为 9,只需报告此结果并停止该过程)。最后,将每个总和除以一半。得出的数字为 A、B、C。编写一个实现此算法的程序。

应用:使用动画直观呈现音乐

软件工程师打造了各种通常很有趣且有创新性的应用。在本课程的每个单元中,我们都展示了工程师设计和实现的不同应用,以帮助您了解工程师从事的所有不同领域。

这里是一款专为直观呈现音乐而打造的有趣应用。