C++ в примерах и упражнениях. Т.В. Гурьянова

Основу данного учебного пособия составили теория и задания 30-часового курса по основам C/C++, который читался Т.В. Гурьяновой школьникам
6-10 классов «Юни-центра XXI» ФПМИ БГУ в 2016/2017 учебном году.
Параллельно с решением задач из данной книги ребятам предлагалось чтение книг «C/C++: быстрый старт» и «Информатика. Языки программирования С/С++» (стр. 295-309 )

Пример
Поменяйте значение целочисленных переменных a и b местами:
— воспользовавшись третьей переменной с для временного храниния данных;
— не используя третью переменную.

#include<iostream>
 using namespace std;
 void main() {
 setlocale (LC_CTYPE, "Russian");
 int a,b,c;
 cout<<"Введите 2 целых числа: \n";
 cin>>a>>b;
 cout<<"значение a и b:\n"; 
 cout<<"a="<<a<<"b="<<b<<'\n'; 
   c=a; 
   a=b; 
   b=c; 
cout<<"значение a и b:\n"; 
cout<<"a="<<a<<"b="<<b<<'\n'; 
system ("pause"); }

Хорошим тоном считается такой вариант написания программы:

#include<iostream>
 void main() {
 setlocale (LC_CTYPE, "Russian");
 int a,b,c;
 std::cout<<"Введите 2 целых числа: \n";
 std::cin>>a>>b;
 std::cout<<"значение a и b:\n";
 std::cout<<"a="<<a<<"b="<<b<<'\n';
    c=a;
    a=b;
    b=c;
 std::cout«"значение a и b:\n";
 std::cout«"a="<<a<<"b="<<b<<'\n';
 system ("pause");
 }

Но мы не будем себя ставить выше Б. Страуструпа (в своей книге он, с оговоркой использует везде using namespace std;) и будем писать так (вторая часть решения первого примера):

#include<iostream>
 using namespace std;
 void main() {
 setlocale (LC_CTYPE, "Russian");
 int a,b;
 cout<<"Введите 2 целых числа: \n";
 cin>>a>>b;
 cout<<"значение a и b:\n";
 cout<<"a="<<a<<"b="<<b<<'\n';
    a=a+b;
    b=a-b;
    a=a-b;
 cout<<"значение a и b:\n";
 cout<<"a="<<a<<"b="<<b<<'\n';
 system ("pause");
 }

Простые типы служат для представления чисел, символов и логических значений.
Существует несколько числовых типов для представления целых чисел. Они отличаются различными диапазонами возможных значений. Их нужно очень хорошо помнить:

byte От -128 до 127
short От -32768 до 32767
int От -2^31до 2^31-1
long От -2^63 до 2^63-1

Для представления дробных чисел предназначены два типа, которые отличаются точностью представления значений
(^ — означает возведение в степень):

float От 1,7 * 10^-38 до 1,7*10^38
double От 3,4 * 10^-308 до 1,7*10^308

Для представления букв, цифр, знаком препинания и других символов использует тип char. Это число от 0 до 215-1, которое является номером символа по таблице Unicode (это унифицированный и общепринятый способ нумерации символов).
Для представления логических значений презназначен тип boolean,
который содержит всего два значения – true и false, истина или ложь, “да” или “нет” в русском языке.
true и false представляются внутри процессора единицами и нулями, как и все остальные типы.

В выражениях могут быть использованы разные знаки, или операции. Для числовых типов это +, -, *, /, % (остаток от деления).

Пример

//Отладил Александр Боровский в 8 классе
#include <iostream>

using namespace std;
void main(){
cout«"Enter your X"«endl;
float a;
float b;
float c;
cin»a;
cout«"Enter your Y"«endl;
cin»b;
cout«"Enter your Z"«endl;
cin»c;

cout«a«"+"«b«"+"«c«"="«a+b+c«endl;
cout«a«"-"«b«"-"«c«"="«a-b-c«endl;
cout«a«"*"«b«"*"«c«"="«a*b*c«endl;
cout«a«"/"«b«"/"«c«"="«a/b/c«endl;
system("pause");
}

Возможные операции для типа boolean перечислены в таблице вместе с их результатами:

значение значение операция

A                  B      A || B     A && B     !A
false     false     false     false        true
true     false     true     false         false
false     true     true     false
true     true      true     true

Допустим, нам нужно вывести в консоль максимальное из значений a и b.
Сравнивать числа можно с помощью операторов сравнения: >, <, == (равно), != (не равно).
(Не путайте оператор присваивания = и оператор сравнения ==.)

Результат сравнения двух чисел — логический:

3==5 — false (нет)

(3<7)&&(3<8) — true (да)

(3<7)||(13<12) — true (да), поскольку выражение в первой скобке true, во второй false,
а
true||false=true (cм. таблицу выше)

Проверьте значения указанных выше выражений, выведя эти выражение в консоль
Например, последнее выражение можно вывести в консоль так: cout<<(3<7||13<12).  В C++ есть оператор выбора
if: if (условие ) {команды} если условие в круглых скобках true, то выполняются команды в фигурных скобках {}, а если условие false, то команды в фигурных скобках не выполняются.

Пример
Пишем игру-викторину.

Пусть у нас есть вопросы и на каждый вопрос есть несколько вариантов ответов. Мы задаем вопрос и предлагаем ответить на него одним из трех способов.

#include<iostream>
 using namespace std;
 void main() {
 setlocale (LC_CTYPE, "Russian");
 cout<<"Гаттерия - это: "<<endl;
 cout<<"1. Бабочка огромных размеров."<<endl;
 cout<<"2. Мелкий крокодил."<<endl;
 cout<<"3. Единственная рептилия, у которой на темени есть третий глаз."<<endl;
 cout<<"Введите вариант ответа 1, 2 или 3."<<endl;
 char answer;
 cin>>answer;
 if (answer=='3') {cout<<"Правильно."<<endl;}
 else{cout<<"Не верно."<<endl;}
 //...
 system ("pause");
 }

Упражнение
Используя оператор if, найдите максимальное из двух чисел.
Как найти максимальное из трех чисел? Из 5?

Пример
Подсчитать среднее арифметическое четырех оценок,введенных с клавиатуры.

//Отладила Дарья Медведева в 9 классе
 #include<iostream>
 using namespace std;
 void main() {
 setlocale (LC_CTYPE, "Russian");
 float a,b,c,d;
 cout<<"Введите 4 числа: "<<endl;
 cin>>a>>b>>c>>d;
 cout<<((a+b+c+d)/4)<<endl;
 system ("pause");
 }

Как переписать программу,  для произвольного числа оценок (N — любое целое число)?

Циклы

for

while

do … while

Операторы циклов обеспечивают повторяющееся, циклическое выполнение участка кода. Если мы хотим сделать что-то много раз подряд, например, вывести строку “Hello, World!” 100 раз, то у нас есть 2 способа:
— написать оператор вывода 100 раз
— использовать цикл

Цикл while

Самый простой цикл – это цикл while. Он выглядит следующим образом:

while (<условие продолжения>) {

<список операторов>

}

(В переводе с английского “while” обозначает “до тех пор, пока”, или ”пока”.) Список операторов иначе называется телом цикла.

Вернёмся к нашем примеру с выводом “Hello, World!” в консоль. Цикл будет выглядеть следующим образом:

while (100 раз не выведено) {
cout<<“Hello, World!”;
}

//Отладила Дарья Медведева в 9 классе
 #include<iostream>
 using namespace std;
 void main() {
 int i=0
 while (i<100; i++){
 cout<<"Hello, world! "<<endl;}
 system ("pause");
 }

строка 1:     int i = 0;
строка 2:     while (i < 100) {
строка 3:     cout<<“Hello, World!”;
строка 4:     i++;
строка 5:     }

Рассмотрим, как выполняются эти 5 строк кода, по шагам:
шаг 1:     строка 1:     Создаётся переменная i, на этом этапе она равна 0.
шаг 2:     строка 2:     Вычисляется значение выражения i < 100 – условие продолжения цикла. Значение равно true, поэтому выполняется тело цикла – список операторов, указанный в { } скобках после условия.
шаг 3:     строка 3:     Вывод строки “Hello, World!”
шаг 4:     строка 4:     Вывели строку и тут же увеличиваем значение i. Теперь мы можем быть уверены, что мы вывели строку ровно 1 раз, так как i содержит значение 1.
шаг 5:     строка 2:     Управление снова переходит на строку 2 и снова проверяется условие i < 100. Оно снова истинно, поэтому список операторов внутри цикла будет выполнено ещё раз.
шаг 6:     строка 3:     Вывод строки “Hello, World!”
шаг 7:     строка 4:     Снова увеличиваем переменную i. Теперь она равна 2, и мы можем быть уверены, что мы вывели строку ровно 2 раза.
шаг 8:     строка 2:     Управление снова переходит к проверке условия i < 100. 2 меньше 100, поэтому цикл продолжается, управление переходит к списку операторов внутри цикла – к строке 3.
шаг 10:     строка 3:     Вывод строки “Hello, World!”
шаг 11:     строка 4:     Снова увеличиваем переменную-счётчик i. Теперь она равна 3, и мы знаем, что строка “Hello, World!” выведена ровно 3 раза.

Каждый раз после окончания тела цикла мы уверены, что строка “Hello, World!” была выведена ровно i раз. Чтобы не описывать ещё 97 одинаковых повторений, или итераций, цикла, перейдем сразу к последнему повторению. Перед последним повторением i равно 99.
шаг:     строка 2:     Проверяется условие продолжения цикла, i все ещё меньше 100, поэтому управление переходит в тело цикла.
шаг:     строка 3:     Вывод строки “Hello, World!”
шаг:     строка 4:     Переменная i увеличивается на 1 и становится равной 100.
шаг:     строка 2:     Проверяется условие продолжения цикла, i, равное 100, уже не меньше 100. Значение выражения i < 100 ложно, поэтому управление не переходит в тело цикла. Цикл завершается, и управление переходит к оператору, следующему за } скобкой после цикла. В нашем примере этот оператор не указан.

Пример
Задача №234. День святого Франциска Ксавьера (Турнир Архимеда, 2007).

Сегодня в индийском городке Старый Гоа отмечают День святого Франциска Ксавьера. Святой Франциск Ксавьер – миссионер, член ордена иезуитов, считается величайшим католическим миссионером Нового времени.

Мощи святого Франциска Ксавьера – духовного покровителя индийских христиан – покоятся в Старом Гоа в известном католическом храме – Базилике Бом Иисус. Со дня постройки храма в 1605 году раз в десять лет мощи святого выставляются для всеобщего обозрения.

Индийский крестьянин Вирмарам  – человек очень набожный, он не упускал случая коснуться святых мощей. Зная годы его жизни, определите, сколько раз он мог коснуться святых мощей (считается, что в год своего рождения он не мог этого сделать, а в год смерти – мог).  

//Решение Леонида Дорошко (7 класс)
 #include <iostream>
 using namespace std;
 int main()
 {
 int gr, gs, i, a = 0;
 cin >> gr >> gs;
 if (gr<1605) {
 gr = 1604;
 }
 for(i=gr+1; ;i++) {
 if((i%5==0) && (i%2==1)) {
 break;
 }
 }
 if (i <= gs) {
 for( ; i <= gs; i=i+10) {
 a++;
 }
 }
 cout << a;
 return (0);
 }

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

#include<iostream>
 using namespace std;
 void main() {
 int N
 cout<<"Введите число: "<<endl;
 cin>>N;
 for (int i=0;i<=N/2;i++){
 cout<<"N="<<i<<"+"<<N-i<<«endl;
 }
 system ("pause");
 }

Пример
Найти максимальное из трех чисел.

#include<iostream>
using namespace std;
int main() {
setlocale (LC_CTYPE, "Russian");
float a,b,c;
cout <<"Введите 3 чисел"<<endl;
cin>>a>>b>>c;
if ((a>=b)&&(a>c)) {cout<<a;}
if ((b>=a)&&(b>c)) {cout<<b;}
if ((c>=b)&&(c>a)) {cout<<c;}
system ("pause");
return 0;
}

Упражнение
Найти максимальное из 10 чисел. Числа можно вводить с клавиатуры и сравнивать попарно, минимальное число из пары отбрасывать, максимальное сравнивать со следующим из введенных.

Но что делать, если все эти числа нужно запомнить для того, например, чтобы вывести их в порядке возрастания (убывания).

Первое, что приходит в голову — ввести десять переменных: a, b, c, d, e, f,… нет, лучше: a1, a2, a3, a4, … , a10
А если переменных будет гораздо больше? А если переменных будет гораздо больше? Это лучше всего сделать при помощи массивов.

Массивы

Для того, чтобы было удобнее работать с большим количеством однотипных величин, ввели понятие массива.

Массив напоминает очередь в банке, в которой никто не знает , как зовут другого, но у каждого есть талончик, на котором написан порядковый номер, соответствующий расположению этого человека в очереди. Все элементы массива имеют одно имя и различаются между собой, как люди в очереди, порядковыми номерами или (что тоже самое) индексами. Примеры объявления массива (есть еще способы объявления, но о них расскажем позже):
int  a[10];
double arr1[100];
double arr2[150];
Если имя массива a, то первый элемент массива может быть записан, как
a[0], a[1] — второй, пятый — как a[4] и так далее.

Пример 

#include <iostream>
using namespace std;
int main () {
int mark[5];
int i;
for (i=0;i<5;i++) 
{ cout <<"[" << i+1 <<"]";
cin>> mark[i];
} 
cout << "vash massiv=" << endl;
for (i=0;i<5;i++){
cout << mark[i] <<'\t';}
cout <<'\n';
system("pause");
}

Пример
Найти среднее арифметическое 10 чисел (отметок), используя массив для хранения данных.

//Отладила Дарья Медведева в 9 классе
 #include<iostream>
 using namespace std;
 void main (){
 setlocale (LC_CTYPE,"Russian");
 int a[10];
 for(int i=0;i<10;i++){cin»a[i];}
 float sum=0;
 for(int i=0;i<10;i++){sum=sum+a[i];}
 cout<<(sum/10)<<endl;
 system ("pause");
 }


 

Пример
Удвоить значение элементов массива.  (Значение элемента удваивается в отдельной функции. Если функцию описываем )

//отладил Андрей Мурашко в 10 классе
#include <iostream>
#define length 8
using namespace std;
//Если функцию описываем отдельно (в нашем случае - в конце 
//программы), тут дублируем ее заголовок
void twice(int a[]); 
void main(){
 int a[length]={1,2,3,4,5,6,7,8};
 cout<<"before\n";
for(int i=0;i<length;i++){cout<<a[i]<<endl;
 }
 twice(a);
 cout<<"after\n";
 for(int i=0;i<length;i++){
 cout<<a[i]<<endl;
 }
system("pause");
}
void twice(int a[]){
 for(int i=0;i<length;i++){
 a[i]=a[i]+a[i];
 }
 }

 

Пример
Вася давно мечтает выиграть олимпиаду по информатике. У него всего три слабых места: циклы, массивы и строки. Перед сегодняшним турниром Вася провёл интенсивную подготовку, в ходе которой он решил A задач на циклы, B задач на массивы и C задач на строки. Впоследствии выяснилось, что из решённых задач D были и на циклы, и на массивы, E – на циклы и на строки, F – на строки и на массивы. И даже было G задач, которые включали и циклы, и строки, и массивы. Помогите Васе вычислить, сколько всего различных задач он решил.

Разбор задачи

Мы знаем что задачи которые включали в себя все 3 темы т.е. G. Теперь найдем те задачи которые
включали в себя 2 темы их количество будет  D + E + F , но те задачи которые включали 3 темы мы 
учитываем и поэтому надо их исключить т.е. D + E + F – G.  Теперь найдем те задачи которые включали 
в себя 1 тему их количество A+B+C , но те задачи которые включали в себя 3 и 2 темы мы учитываем и 
поэтому надо их исключить т.е. A+B+C – (D + E + F – G) – G = A + B + C – D – E - F. В конце нам 
надо знать количество различных задач т.е. G + A + B + C – D – E – F. Ответом к этой задаче будет G
 + A + B + C – D – E – F.

Решение   

#include <iostream>
using namespace std; int main() { int a,b,c,d,e,f,g,baz; cin>>a>>b>>c>>d>>e>>f>>g; baz=a+b+c+g-e-f-d; cout<<baz; return 0; }

И условие задачи, и разбор задачи взяты с сайта Дистанционной подготовки по информатике (Турниры по информатике). Надеемся, что этот сайт поможет и Васе из условия примера, и нашему читателю подготовиться к олимпиаде по информатике.

 

Пример
Подсчитать, чему равен факториал введенного числа n: n!

#include<iostream>
using namespace std;
void main () {
setlocale (LC_CTYPE, "Russian");

int f=1;
int n;
cout<<"Введите число"<<endl;
cin»n;
for (int i=1 ;i<=n;i++) {
f=f*i;}
cout<<sum<<endl;
system ("pause");
}

Пример

Определите, лежит ли точка A(a,b) над прямой y=kx+l, над ней или под ней.

#include<iostream>
using namespace std;
void main (){
setlocale (LC_CTYPE, "Russian");
float k,x,a,b;
cout«"Введите значения переменной и аргумента и координаты точки:"«endl;
cin»k»x»a»b;
if (b==k*x+1) {cout<<"Точка лежит на прямой"<<endl;}
if (b>k*x+1) {cout<<"Точка лежит выше прямой"<<endl;}
if (b<k*x+1) {cout<<"Точка лежит ниже прямой"<<endl;}
system ("pause");
}

Пример

Чтение из файла, запись в файл.

//отладил Андрей Мурашко в 10 классе
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
#define Mesto_pod_nulevoi_simvol_okonchaniya_str 1
#define Maksimalnaya_dlina_familii 35
int main( ){
char customer_name[Maksimalnaya_dlina_familii + Mesto_pod_nulevoi_simvol_okonchaniya_str];
float total_sale;
int percent_disc;
ifstream fin("D:\Temp\\file_in.txt");
ofstream fout("D:\Temp\\file_out.txt");
fin >> customer_name >> total_sale >> percent_disc;
while( !fin.eof() ){
fout << setiosflags(ios::fixed); // для округления. 
//Чтобы лучше понять — закомментируйте
fout << "Ваша покупка \t\t$"<< setprecision(2) << setw(8) << total_sale << '\n';

fout << "Скидка!! " << setprecision(2) << setw(8) << total_sale * ((100 - percent_disc) * 0.01) << '\n';
fin >> customer_name >> total_sale >> percent_disc;
}
system("pause");
fin.close();
fout.close();
return ( EXIT_SUCCESS );
}

Пример

Подсчитываем количество вхождений подстроки в строке.

//отладил Андрей Мурашко в 10 классе
#include <iostream>
#include <string.h>
using namespace std;
void main(){

 char st[]="Abra Cadabra";
 char str[]="ra";
 
 char* ptr_ch=st;
 
 int counter=0,smth=32;

 while (ptr_ch[2]!='\0'){
 ptr_ch=strstr(ptr_ch,str);//находим вхождение "ra"
 ptr_ch=strnset(ptr_ch,smth,3);//удаляем строку с начала до "ra" 
//включительно, увеличиваем значение счетчика, возобновляем поиск 
 counter++;}

 cout<<counter<<endl;
 system("pause");
}


Пример

Программа на С,  демонстрирующая использование оператора switch.

//отладил Никита Чумаков в 9 классе
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LENGTH 10
    #define TIME_TO_CELEBRATE 0

    int main() {
    enum DayDefinitions { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday = 0,DayUnderflow = -1, DayOverflow = -7}
    Today;
    enum DayDefinitions
    CurrentDaysCalculation = Monday;
    char DayString [LENGTH];
    printf ("Please enter today is name, i.e. Monday:");
    scanf("%s", DayString);
    if( strcmp (DayString, "Monday") ==0)
    Today = Monday;
    switch( Today ){
    case Monday : printf("Torday is Monday\n: ");
    //defaulte:...;
    break;
    }
    if ((Today <= DayUnderflow) || (Today >= DayOverflow) )
    printf("Invalid Day Specification\n");
    printf("The integnal value of Monday is %d", Monday);
    Today = 2;
    Today = (enum DayDefinitions) 3;
    if( Today == TIME_TO_CELEBRATE)
    printf("\n\n » Have an enjoable evening you have earned it! «");
    // scanf("%s", DayString);
    return(0);
    }

 Литература
1. Б. Страуструп. Язык программирования С++. М: Бином, С-Пб.: Невский диалект.
2. Криса Паппас и Уильям Мюррей. С/C++. Руководство программиста. Книга I,II. ZD-Press Em-
eryville, California USA, СК-Пресс, Москва-Россия

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

методические материалы по информатике