Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Пропускает строчку в цикле do while


Автор: Archiolidius 24.2.2012, 16:35
В цикле do while пропускает  строчку ввода строка 63 ( gets ) при втором проходе;
Как с этим бороться? пробовал также cin.getline, но результат тот-же.
Код

#include<iostream>;
#include <windows.h>
#include <string>
using namespace std;
double perev();
double perev1();
double x,c,q=1,e,y=1; int k;
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char p;
    do{
    cout<<"Введите х : ";
    x=perev();
    cout<<"Введите k : ";
    k=perev();
    if (k==0){
        cout<<"Невозможно вычислить. K не может быть равно 0\n";
        system("pause");
        return(0);
    }
    if((k>0)&&(k%2==0)&&(x<0)){
        cout<<"Невозможно вычислить. При парном К>0 X должен быть больше или равно 0\n";
        system("pause");
        return(0);
    }
    if((k<0)&&(k%2==0)&&(x<=0)){
        cout<<"Невозможно вычислить. При парном К<0 X должен быть больше 0\n";
        system("pause");
        return(0);
    }
    if((k<0)&&(k%2!=0)&&(x==0)){
        cout<<"Невозможно вычислить. При непарном К<0 X не должен быть равным 0\n";
        system("pause");
        return(0);
    }    
    cout<<"Введите точность : ";
    e=perev1();
    while(fabs(q)>=e){
        q=(x/(pow(y,(k-1)))-y)/k;
        y=y+q;
    }
    cout<<y<<endl;
    cout<<"Продолжить роботу(y/n)?";
    cin>>p;
    if (p=='n') return(0);
    }
    while(p!='n');
}
double perev()
{
    double ch;
    int y=0;
    do{
    y=1;
    int q=0;
    int q1=0;
    int q2=0;
    int i;    
    char ch1[256];
    //cin.getline (ch1, 256);
    gets(ch1);
    ch=atof(ch1);
    for(i=0;i<strlen(ch1);i++){        
            if (((ch1[i]<45)||(ch1[i]>57))&&(ch1[i]!='e')||(ch1[i]==47)||(ch>100000)||(ch<-100000)){
                cout<<"Неправильный ввод! Введите ЧИСЛО в дапазоне от -100000 до 100000 еще раз!\n"; y=0;  break;
            }                                
            if(ch1[i]=='.') q++;
            if(ch1[1]=='-') q1++;
            if(ch1[i]=='e') q2++;
            if ((q>1)||(q1>1)||(q2>1))
            {
                cout<<"Неправильный ввод! Введите ЧИСЛО в дапазоне от -100000 до 100000 еще раз!\n"; y=0; break;}            
            }
    }
    while(y!=1);
    return(ch);
};
double perev1()
{
    double ch;
    int y=0;
    do{
    y=1;
    int q=0;
    int q1=0;
    int q2=0;
    int i;    
    char ch1[256];
    gets(ch1);
    ch=atof(ch1);
    for(i=0;i<strlen(ch1);i++){        
            if (((ch1[i]<45)||(ch1[i]>57))&&(ch1[i]!='e')||(ch1[1]==47)||((ch1[0]=='0')&&(ch1[1]!='.'))||(ch>1)||(ch<0)){
                cout<<"Неправильный ввод! Введите ЧИСЛО в дапазоне от 0 до 1 еще раз!\n"; y=0;  break;
            }                                
            if(ch1[i]=='.') q++;
            if(ch1[1]=='-') q1++;
            if(ch1[i]=='e') q2++;
            if ((q>1)||(q1>1)||(q2>1))
            {
                cout<<"Неправильный ввод! Введите ЧИСЛО в дапазоне от 0 до 1 еще раз!\n"; y=0; break;}            
            }
    }
    while(y!=1);
    return(ch);
};

Автор: feodorv 24.2.2012, 19:18
Неужели программа компилится?  smile 

Цитата(Archiolidius @  24.2.2012,  16:35 Найти цитируемый пост)
#include<iostream>;

Точка с запятой при деле?


Отсутствует 
Код

#include <math.h>



Цитата(Archiolidius @  24.2.2012,  16:35 Найти цитируемый пост)
            if(ch1[1]=='-') q1++;

[1] - это правильно?


Цитата(Archiolidius @  24.2.2012,  16:35 Найти цитируемый пост)
при втором проходе

При каком втором проходе? Если сомневаеетесь, то выдайте на экран введённое значение строки ch1 ;)

Автор: Twelves 1.3.2012, 10:17
Код

if (((ch1[i]<45)||(ch1[i]>57))&&(ch1[i]!='e')||(ch1[i]==47)||(ch>100000)||(ch<-100000)){

избегайте магических констант

Автор: Estranged 3.3.2012, 00:21
char p; недостаточного размера для cin>>p; на строке 43. И не смешивайте С с С++. Если уж читать gets, то везде gets. На 43 замените cin на gets, будет работать.

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