Начало работы

Учитесь на примере

Один из лучших способов научиться программировать на новом языке — просмотреть множество примеров программ. Лучшее, что можно сделать, — это скопировать и вставить каждую приведенную ниже программу в текстовый файл и скомпилировать его. Затем попробуйте провести эксперименты. Расширяя эти примеры программ, вы познакомитесь с различными аспектами 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!» 4 раза в строке по 6 строк, где каждая печатается в поле из 17 пробелов. Для этого используйте циклы for. Нажмите здесь , чтобы узнать о форматировании вывода с помощью cout. Нажмите здесь , чтобы увидеть решение.
  • Используя только что завершенную программу, выясните, как напечатать «Hello World!» выравнивание по левому краю в полях по 17 пробелов (по умолчанию обычно выравнивание по правому краю). Нажмите здесь , чтобы увидеть решение.

Пример 2: Получите некоторую информацию

В C++ легко вводить данные с клавиатуры, используя cin. Вот пример:

// 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) и сравнить его с секретным числом. Попробуйте написать эту часть игры самостоятельно, прежде чем проверять наше решение .

Наконец, нам нужно добавить цикл, который будет собирать догадки игрока, пока он наконец не угадает секретное число. После завершения этой части программы вы можете проверить наше решение .

Декомпозиция — один из наиболее важных навыков, которым должен овладеть программист. Возможность разбить задачу на управляемые части, а затем выполнять их по одной, имеет решающее значение, независимо от того, насколько велик или мал проект. Вот еще несколько возможностей попрактиковаться в разложении.

  • Многие повседневные задачи предоставляют возможности для развития навыков декомпозиции. Вы можете удивиться, обнаружив, что ваш разум работает именно так!

    Например, если мне нужно навести порядок на кухне (возможно, какие-то маленькие девочки только что испекли торт), я разбиваю задачи на несколько частей, чтобы составить план и убедиться, что мне не придется переделывать работу позже. Я не хочу сначала мыть пол, если на прилавках есть всякие вещи, которые нужно убирать — мне, вероятно, придется мыть пол снова позже. Итак, возможно, я сначала убрал все ингредиенты; переместить всю посуду в раковину; очистить прилавки; мыть посуду; и наконец, вымойте пол. Есть и другие способы выполнить эту задачу, но предварительное обдумывание помогает мне составить план, который не потребует переделки.

    Используйте повседневные задачи в качестве примеров для развития своих навыков декомпозиции. Кто знает, возможно, это даже сделает вашу работу по дому более эффективной!

  • Наибольший общий делитель двух целых чисел — это наибольшее число, которое делит их оба поровну. Например, НОД(12, 18) = 6, НОД(-4, 14) = 2. Самый эффективный способ вычисления НОД — использовать алгоритм Евклида. Напишите программу с функцией вычисления НОД для двух целых чисел. Попробуйте сначала выполнить функцию без рекурсии — это поможет вам понять, как работает алгоритм.

    Явно определите свои подзадачи, например, найдите код алгоритма Евклида; создать нерекурсивную функцию для алгоритма; и т. д. Вот наше решение.

Пример 5: Математические головоломки

Одна из возможностей вычислений — это возможность грубого поиска решения проблемы. Метод проб и ошибок прекрасно справляется с некоторыми проблемами. На самом деле компьютеры могут особенно хорошо справляться с такими задачами. Учти это:

Лошади стоят 10 долларов, свиньи — 3 доллара, а кролики — всего 0,50 доллара. Фермер покупает 100 животных за 100 долларов. Сколько каждого животного он купил?

Есть удивительно простое решение этой проблемы. Прежде чем посмотреть наш, посмотрите, сможете ли вы его найти.

Вот еще один, который стоит попробовать:
Сколькими способами можно расположить на полке шесть разных книг слева направо?

На этот раз мы просто дадим вам решение и позволим вам написать программу: 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 долларов в час плюс 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. Чтобы сохранить в файл, мы объявляем offstream и открываем его в режиме «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. Затем вы складываете все результаты этих умножений вместе.

    Используйте функции везде, где только можете, в этой программе. Вы можете создать функцию для получения входных данных, передав в качестве параметра строку, которая будет отображаться в поясняющем выводе. Вот пример запуска:

    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. Вот проблема с «магическим числом»: попросите пользователя ввести трехзначное число, первая цифра которого больше последней. Ваша программа перевернет число и вычтет разворот из исходного числа. Наконец, переверните полученное число и прибавьте его к неперевернутой форме. Выведите окончательный результат. Исходное число, которое вводит пользователь, должно иметь целочисленный тип (не три символа). Подумайте, как написать функцию, которая принимает на вход целое число и возвращает обратное этому числу. Пример:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. Закон требует, чтобы производители продуктов питания указывали сроки годности на своей продукции, но в законе есть лазейка: он не требует, чтобы срок годности был указан в какой-либо конкретной форме. Таким образом, оно может быть написано на суахили и при этом быть законным.

    Троюродная сестра Ральфа Нейдера, Надин, является самопровозглашенным шпионом за качеством продуктов питания. Она узнала, что многие производители продуктов питания начали кодировать сроки годности продуктов, чтобы покупатели не знали, сколько лет продуктам.

    Но кодировка позволяет бакалейщикам определять сроки годности, если по какой-то причине они этого захотят.

    Один популярный метод кодирования:

    • закодируйте месяцы с января по декабрь как от «A» до «L»
    • закодируйте каждую цифру даты как от «Q» до «Z»
    • закодируйте год как от «A» до «Z», что означает от 1 до 26, что затем добавляется к 1995.

    Надин нашла особенно сомнительную буханку хлеба с этой датой: 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. Напишите программу, реализующую этот алгоритм.

Приложение: визуализация музыки с помощью анимации.

Инженеры-программисты создают множество интересных и инновационных приложений. В каждом модуле этого курса мы представляем отдельное приложение, разработанное и реализованное инженерами, чтобы помочь вам понять все различные области, в которых работают инженеры.

Вот одно интересное приложение, созданное для визуализации музыки.