Здорова господа! Я сейчас читаю книгу «Visual C++ полный курс» автор Айвор Хортон, ну и в общем решил решать задачки, там их не много, примерно по 5 задач после каждой главы, от буду создавать пост и внем выкладывать все решения задач которые я сам делаю. Да задачи эти уже решены и можно скачать на сайте автора книги, но я как то хочу сам решать, даже в решение не охота подсматривать, книга эта как бы для новичков и я это все уже как бы знаю. Да и задачки легкие, не то что у Страуструпа.
[tip]
Упражнение 1
Напишите программу ISO/IEC C++, которая предлагает пользователю ввести число, а затем отображать его, используя локальную целочисленную переменную.
Эта от видите легкая задачка, тут ее по сути дела нечего решать. Для детей начальные задачи.
От код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using std::cout; using std::cin; using std::endl; int count; int main() { setlocale(LC_ALL,"Russian"); int count=11; { int count=10; cout <<"Введите число"<<endl; cin >>::count; cout <<"локально count= "<<count<<endl; cout <<"глобальный равен ::count= "<<::count<<endl; } cout <<"еще локально count= "<<count<<endl; cout <<"глобальный равен ::count= "<<::count<<endl; return 0; } |
[/tip]
[tip]
Упражнение 2
Напишите программу, которая читает с клавиатуры целочисленное значение в переменную типа int и использует один из битовых операторов (но не %) для определение положительного остатка от деления на 8. Например, 29=(3*8)+5 и -14=(-2*8)+2 имеют положительные остатки 5 и 2 соответственно.
Да тут хз что делать
не сильно то я понял что и куда.
Я короче подсмотрел как решена задача, пришлось подсмотреть, такую задачку я еще не решал.
И так нужно использовать операции сдвиг влево и сдвиг вправо (>><<)
Мы сдвигаем вправо на 3 и это эквивалентно операции деления на 8 без остатка то есть 2*2*2, если сдвигаем влево на 4 то эквивалентно 2*2*2*2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using std::cout; using std::cin; using std::endl; int main() { setlocale(LC_ALL,"Russian"); int num; cout <<"Введите число..."<<endl; cin >>num; cout <<"Остаток от деления на 8 будет "; cout <<num-((num>>3)<<3)<<endl; cout <<"Остаток от деления на 16 будет "; cout <<num-((num>>4)<<4)<<endl; return 0; } |
[/tip]
[tip]
Упражнение 3
Вставьте скобки в следующие выражения, чтобы проиллюстрировать приоритеты и ассоциативность.
1+2+3+4
16*4/2*3
а>b?a:c>d? e: f
a & b && c & d
(((1+2)+3)+4)
(((16*4)/2)*3)
(a>b?a:(c>d?e:f))
((a&b)&&(c&d))
[/tip]
[tip]
Упражнение 4
Напишите программу которая вычисляет разрешение экрана вашего компьютера по заданным значениям ширины и высоты в пикселях, используя следующие операторы.
int width=1280;
int height=1024;
double aspect=width/height;
Ну что ж попробуем, это легкая задачка.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> using std::cout; using std::endl; int main() { int width=1280; int height=1024; double aspect=static_cast<double>(width)/height; cout <<"aspect= "<<aspect<<endl; return 0; } |
Вывод:
[/tip]
[tip]
Упражнение 5
Какой ответ вы получите в результате? Будет ли он удовлетворительным? Если нет, то как следует изменить код не добавляя новые переменные?
Да хз. вроде все как нужно вывел хз.А ну я думаю вопрос в том что нужно было использовать операцию static_cast<dobule>() просто перевести одно из значений в double что б и второе тоже перевелось, а иначе получается неправильный результат. Если мы поделим width/height, то мы получим фигню в ответ целое число 1 и остаток от деления у нас потеряется, поэтому в упражнении 4 я использую static_cast<double>(width) — преобразую переменную в double ну и тогда уже и вторая переменная height автоматически преобразуется в тип double-в высший тип.
[/tip]
[tip]
Упражнение 6
(Дополнительно) Не запуская на выполнение следующий код, можете ли вы сказать, какой результат он выдаст и почему?
unsigned s=555;
int i=(s>>4)&~(0<<3);
cout <<i;
Я сам хз. не понял что происходит, пришлось подсмотреть.s>>4 — двигает биты s вправо на 4 знака. Это равносильно делению на 2*2*2*2 (16)выражение ~0 переворачивает все биты нулевые в 1, то есть будет максимальное число unsignedвыражение (~0 << 3) двигает все биты влево на 3, то есть получится что первые 3 бита будут установлены в 0.
выражение ~(~0 >> 3) переворачивает все биты, то есть первые 3 бита которые в 0 станут в 1, а остальные которые в 1 станут в 0
выражение (s >> 4) & ~(~0 << 3) типо будет в двоичном представлении, но я не понял как это так, а ну там типо 0000 0000 0000 0000 0000 0000 0100 0010 (34) и применяем операцию & с числом 0000 0000 0000 0000 0000 0000 0000 0111 и у нас получается число 0000 0000 0000 0000 0000 0000 0000 0010.
ну я честно так сходу и не понял что там так.
[/tip]
[tip]
Упражнение 7
Напишите консольную программу С++/CLI, которая использует перечисление для идентификации месяцев года значениями номеров месяцев от 1 до 12. Программа должна выдавать каждую константу перечисления и лежащее в основе значение.
Напишите консольную программу С++/CLI, которая вычислить площади трех комнат и округлит их до ближайшего числа полных квадратных футов. Размеры комнат приведены ниже.
Комната 1: 10,5 на 17,6 Комната 2: 12,7 на 18,9 Комната 3: 16,3 на 15,4
Программа также должна вычислить и вывести среднюю площадь этих трех комнат, а также их общую площадь, причем в каждом случае результат должен быть ближайшим целым числом квадратных футов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// test.cpp: главный файл проекта. #include "stdafx.h" using namespace System; enum class Month{Jan=1,Feb,Mar,Apr,May,Jun,Jul,Agest,Sept,Okt,Nov,Des}; int main(array<System::String ^> ^args) { Console::WriteLine("Начало программы"); Month m=Month::Jan; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Feb; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Mar; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Apr; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::May; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Jun; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Jul; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Agest; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Sept; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Okt; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Nov; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); m=Month::Des; Console::WriteLine("{0} - {1}",m,safe_cast<int>(m)); Console::ReadLine(); return 0; } |
вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// test.cpp: главный файл проекта. #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine("hellow world!"); Console::WriteLine("begin!"); double width=10.5; double height=17.6; double res=width*height; Console::WriteLine("res= {0} after roudn {1}",res,Math::Round(res)); width=12.7; height=18.9; double res2=width*height; Console::WriteLine("res={0} after res={1}",res2,Math::Round(res2)); width=16.3; height=15.4; double res3=width*height; Console::WriteLine("res={0} after res={1}",res3,Math::Round(res3)); double sum=res+res2+res3; Console::WriteLine("sum={0} after sum={1}",sum,Math::Round(sum)); double averige=sum/3; Console::WriteLine("averige={0} after avarige {1}",averige,Math::Round(averige)); Console::ReadLine(); return 0; } |
[/tip]
На этом все, в главе 2 всего 7 упражнений, да если честно, то хорошо, что есть решение каждого упражнения, так что если что экономия времени, просто взял и подсмотрел как правильно нужно решать, то или иное упражнение. Переходим к следующей главе 3.
[youtube]https://www.youtube.com/watch?v=P36PD-McxjQ[/youtube]