Перейти к содержимому

Фотография

Новые уроки по C++.5 урок.Циклы

автор денис марков

Сообщений в теме: 30

#1 DenisMD

DenisMD

    Продвинутый пользователь

  • Модераторы
  • 40 сообщений
  • ГородМагнитогорск

Отправлено 16 Июль 2013 - 01:41

В данном уроке научимся строить циклы в C++.


  • SmithJ это нравится

#2 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 23 Июль 2013 - 23:23

Всем привет. У меня вопрос, почему в теле цикла нельзя использовать функцию pow?



#3 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 23 Июль 2013 - 23:26

Всем привет. У меня вопрос, почему в теле цикла нельзя использовать функцию pow?

а с чего ты взял что нельзя вообще ?



#4 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 23 Июль 2013 - 23:58

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)



#5 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 24 Июль 2013 - 11:03

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)

когда хочешь ответить на сообщение нажми соответствующую кнопку, иначе не узнают кому ты хотел написать. А на счет перегрузки это ты мало знаешь еще ,поэтому.



#6 DenisMD

DenisMD

    Продвинутый пользователь

  • Модераторы
  • 40 сообщений
  • ГородМагнитогорск

Отправлено 24 Июль 2013 - 11:26

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)

Во первых скинь код, в котором ты используешь функцию pow, но у нее есть одна проблема она работает с типом double , и ее аргументы должны быть приведены к double . int a,b;   pow((double)a,(double) B); функция pow возвращает значение типа double и в задаче про зерна произойдет округление и потеря точности, поэтому лучше сделать отдельный цикл считающий возведение в степень



#7 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 24 Июль 2013 - 15:19

 

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)

Во первых скинь код, в котором ты используешь функцию pow, но у нее есть одна проблема она работает с типом double , и ее аргументы должны быть приведены к double . int a,b;   pow((double)a,(double) B); функция pow возвращает значение типа double и в задаче про зерна произойдет округление и потеря точности, поэтому лучше сделать отдельный цикл считающий возведение в степень

 

 

Действительно при изменении типа данных переменной зерно из int в double все заработало)) спасибо за подсказку.Вот код который получился.Если переменная зерно типа int то получается ошибка о перегрузке функции pow.



#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

int main()
{
setlocale(LC_ALL,"Russian");
double zerno=2;
int N=64;
for(int i=0;i<N;i++)
{
cout<<"На "<<i+1<<" клетку надо положить "<<unsigned long long int(pow(zerno,i))<<" зерен "<<endl;
}
_getch();
return 0;
}



#8 DenisMD

DenisMD

    Продвинутый пользователь

  • Модераторы
  • 40 сообщений
  • ГородМагнитогорск

Отправлено 24 Июль 2013 - 21:49

 

 

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)

Во первых скинь код, в котором ты используешь функцию pow, но у нее есть одна проблема она работает с типом double , и ее аргументы должны быть приведены к double . int a,b;   pow((double)a,(double) B); функция pow возвращает значение типа double и в задаче про зерна произойдет округление и потеря точности, поэтому лучше сделать отдельный цикл считающий возведение в степень

 

 

Действительно при изменении типа данных переменной зерно из int в double все заработало)) спасибо за подсказку.Вот код который получился.Если переменная зерно типа int то получается ошибка о перегрузке функции pow.



#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

int main()
{
setlocale(LC_ALL,"Russian");
double zerno=2;
int N=64;
for(int i=0;i<N;i++)
{
cout<<"На "<<i+1<<" клетку надо положить "<<unsigned long long int(pow(zerno,i))<<" зерен "<<endl;
}
_getch();
return 0;
}

 

с ответами сошлось?



#9 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 24 Июль 2013 - 23:22

 

 

 

Ну я попробовал ее применить и у меня выскочила ошибка о перегрузке функции pow(что такое перегрузка я пока не нашел)

Во первых скинь код, в котором ты используешь функцию pow, но у нее есть одна проблема она работает с типом double , и ее аргументы должны быть приведены к double . int a,b;   pow((double)a,(double) B); функция pow возвращает значение типа double и в задаче про зерна произойдет округление и потеря точности, поэтому лучше сделать отдельный цикл считающий возведение в степень

 

 

Действительно при изменении типа данных переменной зерно из int в double все заработало)) спасибо за подсказку.Вот код который получился.Если переменная зерно типа int то получается ошибка о перегрузке функции pow.



#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

int main()
{
setlocale(LC_ALL,"Russian");
double zerno=2;
int N=64;
for(int i=0;i<N;i++)
{
cout<<"На "<<i+1<<" клетку надо положить "<<unsigned long long int(pow(zerno,i))<<" зерен "<<endl;
}
_getch();
return 0;
}

 

с ответами сошлось?

 

да



#10 Sequoza

Sequoza

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 31 Октябрь 2013 - 19:47

Добрый день. Попробовал написать сам программу поиска простых чисел. Вот что получилось:

1 #include <iostream>
2 #include <conio.h>
3
4 using std::cout;
5 using std::cin;
6 using std::endl;
7
8 int main()
9 {
10 const int n=100;
11 bool a[n];
12 for (int i=1; i<=n;i++)
13    {
14     a[i]=true;
15    }
16 for (int i=2; i<n+1; i++)
17        {
18             if (a[i]==true)
19                {for (int j=2; j<n/i+1; j++)// количество чисел, кратных найденному простому числу
20                    {a[i*j]=false;}
21                }        
22        }
23 for (int i=1; i<n+1; i++)
24     if (a[i]==true)
25         cout << i<< endl;
26  _getch();
27 return 0;
28 }

У меня возник вопрос по 20-ой строке. Visual studio при компилировании, создает новый массив. dev-c++ проглатывает строку и выдает верный результат. Не могли бы подсказать, с чем это связано и можно ли данное решение скорректировать под студию?



#11 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 01 Ноябрь 2013 - 00:44

Добрый день. Попробовал написать сам программу поиска простых чисел. Вот что получилось:

1 #include <iostream>
2 #include <conio.h>
3
4 using std::cout;
5 using std::cin;
6 using std::endl;
7
8 int main()
9 {
10 const int n=100;
11 bool a[n];
12 for (int i=1; i<=n;i++)
13    {
14     a[i]=true;
15    }
16 for (int i=2; i<n+1; i++)
17        {
18             if (a[i]==true)
19                {for (int j=2; j<n/i+1; j++)// количество чисел, кратных найденному простому числу
20                    {a[i*j]=false;}
21                }        
22        }
23 for (int i=1; i<n+1; i++)
24     if (a[i]==true)
25         cout << i<< endl;
26  _getch();
27 return 0;
28 }

У меня возник вопрос по 20-ой строке. Visual studio при компилировании, создает новый массив. dev-c++ проглатывает строку и выдает верный результат. Не могли бы подсказать, с чем это связано и можно ли данное решение скорректировать под студию?

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



#12 Сергей

Сергей

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 28 Январь 2014 - 23:53

Сразу хочу поблагодарить за адэктватные уроки, что так хорошо всё разъесняешь!

Побродил по интернету нашел задачу по циклам. Написал решение.

 

#include <iostream>

using namespace std;

int main()
{
    setlocale(0, "");

    cout << "\t\t*****за сколько лет накопится определенная сумма*****\n\n";
    
    double sum, prib, start, pribvgod, i = 0; // i - сколько нужно лет
    
    cout << "\nВведите стартовый капитал - ";
    cin >> start;
    cout << "\nВведите прибыль за год в проц. - ";
    cin >> prib;
    cout << "\nВведите желаемую сумму - ";
    cin >> sum;

    pribvgod = start*(prib / 100);

    while (i < (sum/pribvgod))
    {
        i++;
    }
    
    cout << "\nответ = " << i;

    _getch();
    return 0;
}

 

У меня возник вопрос. Меняю значение "i" на 0, на 1, на 2 но ответ всеравно такой же. Почему так не могу понять. По идее должно же быть меньше циклов, если значение "i" больше.



#13 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 29 Январь 2014 - 19:28

Сразу хочу поблагодарить за адэктватные уроки, что так хорошо всё разъесняешь!

Побродил по интернету нашел задачу по циклам. Написал решение.

 

#include <iostream>

using namespace std;

int main()
{
    setlocale(0, "");

    cout << "\t\t*****за сколько лет накопится определенная сумма*****\n\n";
    
    double sum, prib, start, pribvgod, i = 0; // i - сколько нужно лет
    
    cout << "\nВведите стартовый капитал - ";
    cin >> start;
    cout << "\nВведите прибыль за год в проц. - ";
    cin >> prib;
    cout << "\nВведите желаемую сумму - ";
    cin >> sum;

    pribvgod = start*(prib / 100);

    while (i < (sum/pribvgod))
    {
        i++;
    }
    
    cout << "\nответ = " << i;

    _getch();
    return 0;
}

 

У меня возник вопрос. Меняю значение "i" на 0, на 1, на 2 но ответ всеравно такой же. Почему так не могу понять. По идее должно же быть меньше циклов, если значение "i" больше.

у вас переменная pribvgod всего лишь один раз получает значение, ваши циклы пустые, вы с переменной pribvgod  ничего не делаете, вы только переменную i инкреминтируете и всё



#14 Сергей

Сергей

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 04 Февраль 2014 - 17:45


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

#include <iostream>

using namespace std;

int main()
{
setlocale(0, "");

cout << "\t\t*****за сколько лет накопится определенная сумма*****\n\n";

double sum, prib, start, pribvgod, i = 0; // i - сколько нужно лет

cout << "\nВведите стартовый капитал - ";
cin >> start;
cout << "\nВведите прибыль за год в проц. - ";
cin >> prib;
cout << "\nВведите желаемую сумму - ";
cin >> sum;

pribvgod = start*(prib / 100);

while (i < (sum/pribvgod))
{
i++;
}

cout << "\nответ = " << i;

_getch();
return 0;
}

У меня возник вопрос. Меняю значение "i" на 0, на 1, на 2 но ответ всеравно такой же. Почему так не могу понять. По идее должно же быть меньше циклов, если значение "i" больше.

у вас переменная pribvgod всего лишь один раз получает значение, ваши циклы пустые, вы с переменной pribvgod ничего не делаете, вы только переменную i инкреминтируете и всё

Хочу попросить чтобы вы написали правильный вариант программы, как она должна выглядеть на самом деле. Заранее благодарю!

#15 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 04 Февраль 2014 - 17:53

Хочу попросить чтобы вы написали правильный вариант программы, как она должна выглядеть на самом деле. Заранее благодарю!

 

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



#16 Сергей

Сергей

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 04 Февраль 2014 - 20:25

Хочу попросить чтобы вы написали правильный вариант программы, как она должна выглядеть на самом деле. Заранее благодарю!

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

Хочу попросить чтобы вы написали правильный вариант программы, как она должна выглядеть на самом деле. Заранее благодарю!

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

Коммерсант, имея стартовый капитал n рублей, занялся торговлей, которая увеличивает капитал на р% ежемесячно. Через сколько лет он накопит сумму s, достаточную для покупки собственного магазина?

Вот так звучит задача.

Я уже нашел ответ. Вот он:

#include <iostream>
using namespace std;

int main() {
unsigned int n;
unsigned int s;
int p;
int count = 0;
int u = 0;
cout << "The starting sum: ";
cin >> n;
cout << "\nThe price of your shop: ";

cin >> s;

cout << "\nThe percent per month increase: ";
cin >> p;

while(n<s)
{count++;
n+=n*p/100;}
cout << "It will take " << count/12 << " years and " << count%12 << " month\n";
system("pause");
return 0;
}

#17 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 04 Февраль 2014 - 20:32

 

 

Хочу попросить чтобы вы написали правильный вариант программы, как она должна выглядеть на самом деле. Заранее благодарю!

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

Коммерсант, имея стартовый капитал n рублей, занялся торговлей, которая увеличивает капитал на р% ежемесячно. Через сколько лет он накопит сумму s, достаточную для покупки собственного магазина?

Вот так звучит задача.

Я уже нашел ответ. Вот он:

#include <iostream>
using namespace std;

int main() {
unsigned int n;
unsigned int s;
int p;
int count = 0;
int u = 0;
cout << "The starting sum: ";
cin >> n;
cout << "\nThe price of your shop: ";

cin >> s;

cout << "\nThe percent per month increase: ";
cin >> p;

while(n<s)
{count++;
n+=n*p/100;}
cout << "It will take " << count/12 << " years and " << count%12 << " month\n";
system("pause");
return 0;
}

 

хорошо



#18 Classic

Classic

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 21 Февраль 2014 - 15:48

здравствуйте!

пытаюсь написать альтернативный вариант нахождения нок.

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

 

#include <conio.h>                        
#include <iostream>
#include <climits>
#include <cmath>                    

using std::cout;                        
using std::endl;
using std::cin;
using std::ios_base;

 

int main()
{    
    setlocale (LC_ALL,"Russian");

    unsigned int x,y;
    int a,b;
    int nok;

    cout << "введите 2 числа ";
    cin >> x >> y;

if(x>y)
    {nok=x;
    while(1)
        {
        a=nok%x;
        b=nok%y;
        cout<<nok<<endl;
            if((a=0)&&(b=0))
            {break;}
        nok++;
        }
    }

else
    {nok=y;
    while(1)
        {
        a=nok%x;
        b=nok%y;
        cout<<nok<<endl;
            if((a=0)&&(b=0))
            {break;}
        nok++;
        }
    }


    _getch();                            
    return 0;                            
}

 

 

у меня возникла проблема с заданием условия if. т.е когда искомая nok будет делиться на оба числа без остатка...

в общем получается бесконечный цикл.

 

укажите мне пожалуйста на мою ошибку



#19 kam1kazy

kam1kazy

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений
  • ГородКоролев

Отправлено 22 Февраль 2014 - 12:36

Здравствуйте, я бы хотел задать вопрос по уроку.

	const int N = 64; 
	unsigned long long reziltat = 1, paw = 1;
	for(int i(1); i <= 64; i++)
	{
		for (int j(0); j < i; j++)
		paw *= 2;
		cout << "\nНа " << i << " клетку приходится: " << reziltat;
		reziltat += paw;
		paw = 1;
	}

Как работает " for (int j(0); j < i; j++) ", я понять не как не могу. Почему нельзя весь код написать в первом цикле. Я уберал второй цикл и он выдовал простые числа, не возводя в степень. Как он работает ?



#20 Classic

Classic

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 22 Февраль 2014 - 14:32

здравствуйте!

пытаюсь написать альтернативный вариант нахождения нок.

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

 

#include <conio.h>                        
#include <iostream>
#include <climits>
#include <cmath>                    

using std::cout;                        
using std::endl;
using std::cin;
using std::ios_base;

 

int main()
{    
    setlocale (LC_ALL,"Russian");

    unsigned int x,y;
    int a,b;
    int nok;

    cout << "введите 2 числа ";
    cin >> x >> y;

if(x>y)
    {nok=x;
    while(1)
        {
        a=nok%x;
        b=nok%y;
        cout<<nok<<endl;
            if((a=0)&&(b=0))
            {break;}
        nok++;
        }
    }

else
    {nok=y;
    while(1)
        {
        a=nok%x;
        b=nok%y;
        cout<<nok<<endl;
            if((a=0)&&(b=0))
            {break;}
        nok++;
        }
    }


    _getch();                            
    return 0;                            
}

 

 

у меня возникла проблема с заданием условия if. т.е когда искомая nok будет делиться на оба числа без остатка...

в общем получается бесконечный цикл.

 

укажите мне пожалуйста на мою ошибку

разобрался))) я неверно задал равенство (= вместо ==)







Темы с аналогичным тегами автор денис марков