Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> цикл do-while 
:(
    Опции темы
bncom
Дата 10.11.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Помагите, пожалуйста, вот с такой проблемой.
Задали мне сделать программу (на Си, под ДОС), которая считает числовой ряд. Пользователь должен ввести число, до которого будет считаться ряд. Все сделал, все считает. Но мне усложнили задание, и попросили сделать так, чтобы при неправильном вводе числа с клавиатуры (а там есть ограничение на число: 0<число<1), выдавалась ошибка и было предложено повторить ввод числа. В общем, как бы дается три попытки на ввод... Я сделал это через условные операторы if и else. Но мне сказала преподаватель, что это неправильно, надо через цикл do-while. Однако я не знаю, как это сделать... smile Подскажите пожалуйста....
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
darkart
Дата 10.11.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Вроде бы так:
Код

/////////////////////////////////////
float x;
int count=0;
do
{
  cout<<"Please enter a number\n";
  cin>>x;
  if(x<0||x>1)cout<<"Error data. please reenter data\n";
  count++;
}
while((x<0||x>1)&&(count<3));
/////////////////////////////////////

PM MAIL WWW ICQ Skype GTalk   Вверх
cardinal
Дата 10.11.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 15
Всего: 99



А я бы сделал через цикл for, так как он наглядней...
Цитата(MSDN)
for Statement
for( [init-expr]; [cond-expr]; [loop-expr] )
statement

The for keyword executes statement repeatedly.

First, the initialization (init-expr) is evaluated. Then, while the conditional expression (cond-expr) evaluates to a nonzero value, statement is executed and the loop expression (loop-expr) is evaluated. When cond-expr becomes 0, control passes to the statement following the for loop.

For more information, see while, break, and continue.

Example

// Example of the for statement
for ( i = space = tab = 0; i < MAX; i++ )
{
    if ( line[i] == ' ' )
        space++;
    if ( line[i] == '\t' )
    {
        tab++;
        line[i] = ' ';
    }
}
This example counts space (' ') and tab ('\t') characters in the array of characters named line and replaces each tab character with a space. First i, space, and tab are initialized to 0. Then i is compared with the constant MAX; if i is less than MAX, the statement body is executed. Depending on the value of line[i], the body of one or neither of the if statements is executed. Then i is incremented and tested against MAX; the statement body is executed repeatedly as long as i is less than MAX.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
bncom
Дата 11.11.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Ребята, что-то не получается... Может вы мне все-таки поможете... Мне уже скоро работу сдать надо smile . Вобщем, вот условие задачи:

Вычислить сумму первых N элементов рада:
1 + 1*3/1*4 + 1*3*5/1*4*5 + 1*3*5*7/1*4*7*10
Вычисления проводить до тех пор, пока модуль очередного элемента будет больше <E>
(эпсилон)

А вот сам код программы, которую я написал:
Код

# include <stdio.h>
# include <math.h>
#include <conio.h>
# include <graphics.h>

void main (void)
{
    float epsilon; /*chislo epsilon, kotoroe nado vvesti*/
    float summa_elemntov; /*obshaya symma elementov ryada*/
    float element; /*znachenie elementa ryada*/
    int chislitel_elementa; /*chislitel elementa ryada*/
    int znamenatel_elementa; /*znamenatel elementa ryada*/
    
    summa_elemntov=0; /*provodim obnylenie obshei symmy elementov ryada*/
    element=1; /*ystanavlivaem tekyshee znachenie dlya elementa ryada */
    chislitel_elementa=1; /*ystanavlivaem tekyshee znachenie dlya chislitelya elementa ryada*/
    znamenatel_elementa=1; /*ystanavlivaem tekyshee znachenie dlya znamenatelya elementa ryada*/
    
    /*vypolnyaem graficheskoe predstovlenie programmy*/

Здесь я рисую таблицу, но здесь понятно, ее приводить не буду....
Затем сама программа:

if (epsilon > 0 && epsilon < 1)
    {    
        while (element > epsilon)
               {
            summa_elemntov=summa_elemntov+element;
            chislitel_elementa*=(chislitel_elementa+2);
            znamenatel_elementa*=(znamenatel_elementa+3);
            element=(chislitel_elementa*1.0)/znamenatel_elementa;
               }
        gotoxy (10,23);
        textcolor (4);
        cprintf ("- Symma pervyx <N> elementov ryada ravna %.2f \a", summa_elemntov);
        textcolor (7);
        gotoxy (10,25);
        cprintf ("Dlya zaversheniya nazhmite klavishy <ENTER>");
    }

/*esli yslovie ne vypolnyaetsya, to vyvoditsa soobshenie ob oshibke*/
    
    else
    {.... тут я делаю воспроизвожу позановому таблицу и ....
if (epsilon >= 1 || epsilon <= 0)
    {            
            textcolor (8);
            gotoxy (10,23);
            cprintf ("Izvenite, no vy opyat vveli chislo <E> nepravilno!\a");
            textcolor (2);
            gotoxy (10,24);
            cprintf ("Daetsya eshe odna popytka...");
            textcolor (8);
            gotoxy (10,25);
            cprintf ("Dlya vvoda chisla nazhmite <ENTER>");
            getch ();
            textbackground (7);
    clrscr;
и опять произвожу таблицу и так еще два раза....


Ограничение на число эпсилон я сделал через оператор if и else. А надо через do-while smile .
Вобщем, например, вводим число эпсилон, если оно удовлетворяет условию, то считаем ряд и на выход. Если же не удовлетворяет, то выводиться сообщение об ошибке с просьбой повторить число эпсилон еще раз, и так в общей сложности три раза будут появляться ошибки, пока пользователь не введет правильно число эпсилон, тогда, как вы понимаете, происходит подсчет и на выход.
Вобщем, я на вас очень надеюсь, помогите пожалуйста, это, наверно не трудно для вас. Я только начал узучать Си...
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
bncom
Дата 12.11.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Люди, ну помогите же... smile
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Rick
Дата 12.11.2005, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 4.11.2005
Где: Новосибирск

Репутация: 2
Всего: 3



проблема в алгоритме или исполнении его на Си?
--------------------
Не бывает атеистов в окопах под огнем   
PM MAIL ICQ   Вверх
bncom
Дата 12.11.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Прочитайте мой топик, там я все подробно разъяснил.
Проблема в алгоритме...
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
darkart
Дата 12.11.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Попробуй это...
Код

#include<stdio.h>
int main()
{
    double Eps,Sum=0.0,Elem=1.0,fc=1.0,fz=1.0;
    printf("Please enter Epsilon:\n");
    int count=0;
    do
    {
        scanf("%lf",&Eps);
        count++;
        if((Eps<=0||Eps>=1)&&count<3)printf("Invalidd data. Please reenter Epsilon:\n");
    }
    while((Eps<=0||Eps>=1)&&count<3);
    if(3==count)
    {
        printf("Error:Invalid data.\nExit.\n");
        return 0;
    }
    else
    {
        count=0;
        while(Eps<Elem)
        {
            Sum=Sum+Elem;
            fc*=(fc+2);
            fz*=(fz+3);
            Elem=fc/fz;
            count++;
        }
        printf("The sum of the first %d numbers is equal %.15f\n",count,Sum);
        return 0;
    }
}

PM MAIL WWW ICQ Skype GTalk   Вверх
bncom
Дата 13.11.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Большое спасибо! Все как и надо!
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
darkart
Дата 13.11.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Большое пожалуйста smile
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.