Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск

Кто сейчас на форуме
Сейчас посетителей на форуме: 2, из них зарегистрированных: 0, скрытых: 0 и гостей: 2

Нет

[ Посмотреть весь список ]


Больше всего посетителей (9) здесь было Вс Фев 11, 2018 12:54 pm
Самые активные пользователи за неделю


Домашняя работа №5.

Перейти вниз

Домашняя работа №5.

Сообщение автор Gragory023 в Вт Янв 31, 2017 8:50 am

В домашней работе возникли следующие вопросы.
1.По первому заданию нашел способ в интернете, но не разобрался в принципе работы(
Код:

#include<iostream>
#include<cmath>
using namespace std;
int main() {
 bool prime;
 for (int i = 2; i < 1000; i++) {
 prime = true;
 int sqrti = sqrt(i);
 for (int j = 2; j < sqrti + 1; j++)// не могу понять как это работает
 if (i%j == 0) {// тут получается всегда будет 2/2. 3/3 ...
 prime = false;
 break;
 }
 if (prime) // не препоминаю данную запись, т.е. вывести все i, где prime true?
 cout << i << " simple number \n";
 }
 return 0;
}
2. Во втором получается сделать лишь прямоугольник из символа #, но вставить внутрь пробелы не получается. Как только не пробовал используя setfill('0).
Код:
#include <iostream>
#include <iomanip>

using namespace std;
int main() {
 int height, width, i=0;
 cout << "Please enter Height and Width " << endl;
 cin >> height>> width;
 for (int row = 0; row < width; row++) {
 for (int col = 0; col < height; col++) {
 }
 cout << endl;
 }
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Вт Янв 31, 2017 5:08 pm

Первая задача устроена так. Будет цикл в цикле (поскольку это тема урока).

Внешний цикл по i: перебираем все числа от 2 до 1000. Внешний цикл решает задачу: печатать или не печатать i?

Если i простое, то печатать
Если i составное, то не печатать.

Чтобы понять, простое i или составное, нужно вспомнить определение простого числа. Число простое, если у него нет других делителей, кроме самого числа и 1. Значит что? Надо перебрать все числа между 1 и i, и проверить, не являются ли они делителями.

Внутренний цикл по j решает именно эту проблему. Он перебирает все числа j — кандидаты на то, чтобы быть делителями. j будет делителем i, если большее число i делится на меньшее j без остатка. Если нашли хоть один делитель — число i составное, можно цикл прервать break-ом. Название переменной prime переводится как «простое».

Хитрые математики говорят, что можно сэкономить объём вычислений, перебирая не все j от 2 до i - 1, а только от 2 до квадратного корня из i. Дело в том, что если у числа найдётся делитель больший, чем корень из i, то можно i на него поделить, и выяснится, что у i был делитель и меньший, чем корень из i. Который мы не нашли. Значит, делителей больше корня из i нет.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Вт Янв 31, 2017 5:10 pm

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

В цикле нам нужно принять решение, печатать пробел или знак решётки. Это if / else, как мы делали на уроке. Единственная заковыка — это условие if-а.

В каком случае мы печатаем знак решётки?
• Если это первая строка
• Если это первый столбец
• Если это последняя строка
• Если это последний столбец
• В остальных случаях печатаем пробел

Эти условия переводятся на язык C крайне просто. Например:
Код:
if (i == 0) // если это первая строка

Предлагаю поэкспериментировать и найти остальные правильные условия самостоятельно.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 11:46 am

Вторая задачка получилась)
А вот первую пробую преобразовать без корня, тк с корнем уж слишком сложно, но не получается.
Код:
int main() {
 bool prime;
 for (int i = 2; i < 1000; i++) {
 prime = true;
 for (int j = 1; j < i ; j++)//это получается внутренний цикл, который перебирает кандидаты в делители (i-большее число , чем j)
 if (i%j == 0) {
 prime = false;
 break;
 
 }
 if (prime)
 cout << i << " simple number \n";
 }
 return 0;
}

Третью задачу сделал с двумя циклами. Все работает, но в сети нашел решение с одним циклом. Хотелось бы, чтоб его пояснили.
Код:
int main(){
 int A = 7, i, j;

 cout << " pn  vt  sr  ch  pt  sb  vs \n";

 for (i = 1, j = 1; i < 32; i++) {
 if (i == 1 && j < A) {//условие выполняется до 7, при этом печатается пробел, но i становиться 7
 cout << "    ";
 i--;// параллельно пред условию выполняется уменьшенее переменной(присутсвует такое ощущение, что это будет повторяться бесконечно), но как из оператора if выходит переменная i =1, которая печатается в else
 }
 else {
 cout << " ";
 if (i < 10)
 cout << " ";
 cout << i << " ";
 }

 if (j++ > 6) {//не понимаю как этот if переносит строки
 j = 1;
 cout << "\n\n";
 }
 }

}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 12:25 pm

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

Третью можно делать с одним циклом. Управляющая переменная цикла — номер дня в календаре, это переменная i (смотри условие: i < 32). j вспомогательная переменная, хранит текущий номер столбца.

Первый if/else решает проблему: мы уже достигли первого числа месяца или печатаем пробелы перед ним? Расположение первого числа месяца зашито в константе A. Имена переменных и констант здесь явно могли быть лучше:
i -> day
j -> column
A -> WEEK_DAY_FIRST

Поскольку после каждого витка цикла у нас автоматически происходит i++, в первом if-е есть компенсирующий i--, чтобы удержать i на месте (равным 1). Это не будет происходить вечно, потому что j растёт и рано или поздно нарушит вторую половинку условия if. Это опять же нагляднее под отладчиком.

else устроен тривиально, печатает текущий день и пробел (просто кое-кто не знает манипулятора setw).

Второй if отвечает за две вещи сразу. Во-первых, он увеличивает j на единицу (j++); во-вторых, если j было равно 7, он сбрасывает j до 1 и печатает перенос на новую строку. После воскресенья пора переходить на новую строку.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 1:23 pm

С месяцем разобрался.
А первая все так и висит, кое что изменил, но теперь печатаются числа с 700 до 999 ( не понятно почему так)
Код:
int main() {
   bool prime;
   for (int i = 2; i < 1000; i++) {
      prime = true;
      for (int j = 1; j < i ; j++)
         if (i%j == 0) {
            prime = false;
            break;
         }
            if (prime=true)
            cout << i << " simple number \n";
         
   }
   return 0;
}
А как тут использовать отладчик, там же по шагам все происходит, а тут получается тысячи проверок?

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 1:25 pm

Код:
if (prime=true)
Это присваивание, а не проверка на равенство. Из-за присваивания условие if всегда выполнено, то естьон печатает просто все числа. А у консоли ограниченный объём памяти вверх, видимо, помнит только последние 300 строк.

Получилось ли поставить точку остановки и запустить с отладчиком? Походи по шагам и посмотри на переменные.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 1:34 pm

" />
1. Нажимаю начать отладку
2. Нажимаю F11.
Ну вот хожу по шагам, но что то не особо помогает Бледный

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 1:39 pm

Предлагаю такую схему тестирования:

2 — известно что простое число
Считает ли программа 2 простым или составным?

Нужно зайти во внешний цикл (i = 2), и посмотреть как работает внутренний. Какие значения j проходят, заходит в if или нет. На каждом шаге нужно смотреть значения управляющих переменных: i, j, prime. Можно проверить, выполнено ли условие if-а.

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

Если с 2 всё хорошо, посмотреть ещё 3 и 4 для надёжности.

Если 2, 3, 4 обрабатываются правильно, то можно прекращать ходить по шагам и запускать программу в свободное плавание, оценивать, то ли она печатает в целом.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 1:47 pm

А как зайти во внешний цикл?
По ходу дело я просто не знаю, как правильно пользоваться отладчиком((

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 1:49 pm

Зайти во внешний цикл — дойти до первой его инструкции. Можно поставить точку остановки прямо на нём и запустить F5. Отладчик остановится перед началом цикла. Потом ходить F10 (меню Debug -> Step Over).

Внизу слева будут отладочные окна с переменными: Auto, Locals, Watch.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 2:17 pm

Поставил точку остановки во внешенем цикле, нажимаю f 11 он все равно проходит точку остановки и идет до конца вниз+ еще открывает iostream(Где огромный код написан)

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 2:18 pm

F11 — это зайти внутрь (просмотреть текущую операцию более подробно)
F10 — это пройти на следующий шаг

Для простых присваиваний вроде int i = 0 они равносильны.
Для более сложных операций, например, cout << i, F10 перепрыгнет операцию, а F11 полезет вглубь (из-за чего открывается iostream).
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 2:29 pm

Если я начинаю со внешнего цикла j =1, т.е чтоб проверить когда будет 2 или 3 надо пройти i=999, x2-999?

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 2:34 pm

Это внешний цикл:
Код:
for (int i = 2; i < 1000; i++) {

Это внутренний:
Код:
for (int j = 1; j < i ; j++)

Внутренний цикл заключён внутри внешнего.

Внутренний цикл довольно короткий при маленьких i, потому что он выполнится всего лишь i раз.
i = 2
j = 1

i = 3
j = 1
j = 2

i = 4
j = 1
j = 2
j = 3

Поэтому его вполне реально посмотреть под отладчиком. 999 появится ближе к концу внешнего цикла, когда i будет 999.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 2:43 pm

У меня j не увеличивается получается(

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 2:45 pm

Странно, должно увеличиваться. Во внутреннем цикле есть команда j++.

Дам прямую подсказку. В этом цикле неправильно определены границы:
Код:
for (int j = 1; j < i ; j++)
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Ср Фев 01, 2017 2:58 pm

Попробовал все варианты и < и > и =< и => все равно тоже самое.

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Ср Фев 01, 2017 4:29 pm

Дело не в верхней границе, а в нижней. Почему мы проверяем на то, что 1 — делитель? 1 — всегда делитель, любого числа.

Компьютер проверяет i % 1 == 0, а это всегда так, и делает вывод, что число i — составное.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Чт Фев 02, 2017 8:24 am

Код:
int main() {
   bool prime;
   for (int i = 2; i < 1000; i++) {
      prime = true;
      for (int j = 1; j < i; j++)
         if (i%j == 0) {// делителем тут является j, который увеличивается
            prime = false;
            break;
         }
            if (prime == true)
               cout << i << " simple number \n";
   }
   return 0;
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Ярослав в Чт Фев 02, 2017 2:07 pm

Должно быть:

for (int j = 2; j < i; j++)

Иначе компьютер проверяет делимость на 1. Любое число делится на 1 без остатка.
avatar
Ярослав
Admin

Posts : 599
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Gragory023 в Чт Фев 02, 2017 2:25 pm

ААА, теперь понял) Спасибо)

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №5.

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения