Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > цикл do-while


Автор: bncom 10.11.2005, 19:18
Помагите, пожалуйста, вот с такой проблемой.
Задали мне сделать программу (на Си, под ДОС), которая считает числовой ряд. Пользователь должен ввести число, до которого будет считаться ряд. Все сделал, все считает. Но мне усложнили задание, и попросили сделать так, чтобы при неправильном вводе числа с клавиатуры (а там есть ограничение на число: 0<число<1), выдавалась ошибка и было предложено повторить ввод числа. В общем, как бы дается три попытки на ввод... Я сделал это через условные операторы if и else. Но мне сказала преподаватель, что это неправильно, надо через цикл do-while. Однако я не знаю, как это сделать... smile Подскажите пожалуйста....

Автор: darkart 10.11.2005, 20:06
Вроде бы так:
Код

/////////////////////////////////////
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));
/////////////////////////////////////

Автор: cardinal 10.11.2005, 21:20
А я бы сделал через цикл 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.

Автор: bncom 11.11.2005, 21:02
Ребята, что-то не получается... Может вы мне все-таки поможете... Мне уже скоро работу сдать надо 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 .
Вобщем, например, вводим число эпсилон, если оно удовлетворяет условию, то считаем ряд и на выход. Если же не удовлетворяет, то выводиться сообщение об ошибке с просьбой повторить число эпсилон еще раз, и так в общей сложности три раза будут появляться ошибки, пока пользователь не введет правильно число эпсилон, тогда, как вы понимаете, происходит подсчет и на выход.
Вобщем, я на вас очень надеюсь, помогите пожалуйста, это, наверно не трудно для вас. Я только начал узучать Си...

Автор: bncom 12.11.2005, 17:29
Люди, ну помогите же... smile

Автор: Rick 12.11.2005, 18:50
проблема в алгоритме или исполнении его на Си?

Автор: bncom 12.11.2005, 19:10
Прочитайте мой топик, там я все подробно разъяснил.
Проблема в алгоритме...

Автор: darkart 12.11.2005, 19:15
Попробуй это...
Код

#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;
    }
}

Автор: bncom 13.11.2005, 15:16
Большое спасибо! Все как и надо!

Автор: darkart 13.11.2005, 15:53
Большое пожалуйста smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)