Условный оператор

Задания раздела 4.7
4.21. Напишите программу, использующую условный оператор для поиска в векторе vector<int> элементов с нечетным значением и их удвоения.
4.22. Дополните программу, присваивающую переменной значение оценки (высокая, проходная, не проходная), еще одной оценки, минимально-проходной от 60 до 75 включительно. Напишите две версии: одна использует только условные операторы; вторая использует один или несколько операторов if. Как по вашему, какую версию проще понять и почему?
4.23. Следующее выражение не компилируется из-за приоритета операторов. Используя таблицу из раздела 4.12, объясните причину проблемы. Как её исправить?
string s="word";
string p1=s+s[s.size()-1]=='s' ? "" : "s";
4.24. Программа, различавшая проходную и непроходную оценку, зависела от того факта, что условный оператор имеет правосторонний порядок. Опишите, как обрабатывался бы этот оператор, имей он левосторонний порядок.

Условный оператор можно использовать без if..else. Выглядит это так:
(условие) ? истинно : ложно
(i < 1024) ? "not enough" : "enough";
Условный оператор может быть вложенным:
(условие) ? истинно : (условие) ? истинно : ложно
(i>1025) ? "more than enough" : (i < 1024) ? "not enough" : "enough";
Порядок выполнения условного оператора правосторонний.
то есть сначала проверяется условие (i<1024), а уже потом (i>1025).
Условный оператор имеет низкий приоритет, поэтому все его выражение заключается в круглые скобки.

4.21. Напишите программу, использующую условный оператор для поиска в векторе vector<int> элементов с нечетным значением и их удвоения.
Я не знаю как пропустить условие, поэтому NULL
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v(10, 7);
auto pbeg=v.begin();
while (pbeg!=v.end()) {
(*pbeg%2) ? *pbeg*=2 : NULL ;
std::cout << *pbeg++ << " ";
}
return(0);
}

4.22. Дополните программу, присваивающую переменной значение оценки (высокая, проходная, не проходная), еще одной оценки, минимально-проходной от 60 до 75 включительно. Напишите две версии: одна использует только условные операторы; вторая использует один или несколько операторов if. Как по вашему, какую версию проще понять и почему?

Не знаю как на счет самой программы, но условие выглядит так:
string finalgrade=(grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";

Теперь необходимо добавить минимально-проходную оценку от 75 до 60.
string finalgrade=(grade > 90) ? "high pass" : (grade < 75 && grade > 60) ? "minimal" : (grade < 60) ? "fail" : "pass";
А так выглядит сама программа:
#include <iostream>
#include <vector>
int main()
{
int grade=0;
std::cout << "Enter grade:"<< std::endl;
std::cin >> grade;
std::string finalgrade=(grade > 90) ? "high pass" :
(grade < 75 && grade > 60) ? "minimal" :
(grade < 60) ? "fail" : "pass";
std::cout << finalgrade;
return(0);
}
После разных тестов оказалось, что никаких укороченных схем проверки у условного оператора нет. Если в этом выражении:
(grade > 90) ? "high pass" : (grade < 75 && grade > 60) ? "minimal" : (grade < 60) ? "fail" : "pass";
убрать && grade > 60 в условии (grade < 75 && grade > 60) и оставить так:
(grade > 90) ? "high pass" : (grade < 75) ? "minimal" : (grade < 60) ? "fail" : "pass";
то при проверке значения 55 сначала проверятся первое условие (grade < 60), если оно истинно, то проверяется второе (grade < 75) и если оба условия истинны выбирается последнее истинное по порядку.

Теперь на операторе if:
#include <iostream>
#include <vector>
int main()
{
int grade;
std::cout << "Enter grade:"<< std::endl;
std::cin >> grade;
std::string finalgrade;
if (grade < 60) finalgrade="fail";
else if (grade < 75) finalgrade="minimal";
else if (grade > 90) finalgrade="high pass";
else finalgrade="pass";
std::cout << finalgrade;
return(0);
}
На мой взгляд оба оператора читаются нормально. Без практики чтения чужого кода я не могу отдать предпочтение какому-то вот прямо сейчас. Но определенно что-то в условном операторе есть.

4.23. Следующее выражение не компилируется из-за приоритета операторов. Используя таблицу из раздела 4.12, объясните причину проблемы. Как её исправить?
string s="word";
string p1=s+s[s.size()-1]=='s' ? "" : "s";
Получаю последнюю букву строки s, если это буква 's' - ничего не делаю, если это не буква 's' добавляю ее к строке s и присваиваю результат строке p1.
#include <iostream>
#include <string>
int main()
{
std::string s="word";
std::string p1=s+((s[s.size()-1]=='s') ? "" : "s");
std::cout << p1;
return(0);
}

4.24. Программа, различавшая проходную и непроходную оценку, зависела от того факта, что условный оператор имеет правосторонний порядок. Опишите, как обрабатывался бы этот оператор, имей он левосторонний порядок.

Зачем?
string finalgrade=(grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";
Если оператор будет иметь левосторонний порядок, то судьбу условия будет решать самый последний оператор и оценка 95 при проверке условия получит обычный pass, а не high pass как задумывалось.

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