Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вот такая головоломка...С++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вот такая головоломка...С++
Имя
Сообщение << Старые топики   Новые топики >>
Вот такая головоломка...С++ - 2007-12-02 17:23:45.080000   
Mamka

Сообщений: 560
Оценки: 0
Присоединился: 2007-11-26 22:20:09.313333
Смотрим сие антиструктурированне творение моего знакомого, попросившего помочь ему. В проге почти все исправил, остался только один ньюанс, который не могу понять..
Цель задачи, что то вроде создания качественного ПО. Ввводится вектор, потом на выбор его сортировка-по возрастанию/убыванию. Задача, исключить ошибки ввода пользователя. Например, при вводе "орпвлоарп74356" или "++4", "–4"-вывод ошибки. Корректный ввод это 54, -43, +32, 00000000000000004(=4) и т.д.



// sort.cpp : Defines the entry point for the console application.
//

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


char a_arr[50];
char b_arr[5];
int a[5];
char el;
int i,j,m,soa,sos,siz,elm,umn,se=0,sum,tos,tmp;
bool f=true,fg=true;


int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
while (f)
{
cout << "Enter size of array\n";
gets(a_arr);
sos=strlen(a_arr);
i=0;
if (a_arr[0] == '+')
i++;
while (a_arr == '0')
i++;
if ((a_arr&lt;'1') || (a_arr&gt;'5') || (strlen(a_arr)&gt;i+1))
cout &lt;&lt; "Try again\n";
else
{
siz=toascii(a_arr)-48;
f=false;
}
cout &lt;&lt; "size :" &lt;&lt; siz &lt;&lt; "\n";
}
f=true;
j=0;
int ind=1;
bool fl,fg;
while (f)
for (j=0; j&lt;=siz-1; j++)
{
cout &lt;&lt; "Enter " &lt;&lt; ind &lt;&lt; " element\n";
gets(b_arr);
soa=strlen(b_arr);
i=0;
fl=true;
if (b_arr[0] == '+')
i++;
if (b_arr[0] == '-')
{
fl=false;
i++;
}
while (b_arr == '0')
i++;
if (j==siz-1)
f=false;
if ((strlen(b_arr)&gt;i+5) || (strlen(b_arr)&lt;1) || (strlen(b_arr)==i))
{
cout &lt;&lt; "Try again\n";
j–;
}
else
{
sum=0;
umn=1;
fg=true;
//if (i!=0)
for (m=i; m&lt;=soa-1; m++)
{
if ((b_arr[m]&lt;'0') || (b_arr[m]&gt;'9'))
fg=false;
}
for (m=soa-1; m&gt;=0; m–)
{
elm=toascii(b_arr[m])-48;
elm*=umn;
umn*=10;
sum=sum+elm;
}

int stri, tri=1;
if (fl==false)
{
for (stri=0; stri&lt;=soa-2; stri++)
tri*=10;
}
if (fl==false)
{
sum=-sum-3*tri;
a[se]=sum;
}
else
a[se]=sum;
if (fg==false)
{
cout &lt;&lt; "Try again\n";
j–;
}
else
{
if ((a[se] &lt; -32768) || (a[se] &gt; 32767))
{
cout &lt;&lt; "Try again\n";
j–;
}
else
{
cout &lt;&lt; "i :" &lt;&lt; i &lt;&lt; "\n";
cout &lt;&lt; i++ &lt;&lt; " element :" &lt;&lt; b_arr &lt;&lt; "\n";
cout &lt;&lt; "element :" &lt;&lt; a[se] &lt;&lt; "\n";
cout &lt;&lt; "Element :" &lt;&lt; sum &lt;&lt; "\n";
se++;
i–;
ind++;

}
}
}
}


cout &lt;&lt; "Your array :\n";
ind=0;
for (i=0; i&lt;=siz-1; i++)
{
ind++;
cout &lt;&lt; "a[" &lt;&lt; ind &lt;&lt; "] = " &lt;&lt; a &lt;&lt; "\n";
}
cout &lt;&lt; "Choose type of sort : 1-increase, 2-decrease\n";
cin &gt;&gt; tos;
cout &lt;&lt; endl;
if (tos==1)
{
for(i = 1;i &lt; siz; i++)
for(j =siz-1;j &gt;= i; j–)
{
if (a[j-1] &gt; a[j])
{
tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
}
}
}
if (tos==2)
{
for(i = 1;i &lt; siz; i++)
for(j =siz-1;j &gt;= i; j–)
{
if (a[j-1] &lt; a[j])
{
tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
}
}
}
/*cout &lt;&lt; "Your array :\n";
ind=0;
for (i=0; i&lt;=siz-1; i++)
{
ind++;
cout &lt;&lt; "a[" &lt;&lt; ind &lt;&lt; "] = " &lt;&lt; a &lt;&lt; "\n";
}*/
getch();
return 0;
}



у меня ошибка такая, когда ввожу +&lt;число&gt;(например +4) програма выдает мне это число минус 50. При вводе просто отрицательного числа все норм. уже час не могу найти ошибку, интересно, найдете ли вы ее.
Post #: 1
RE: Вот такая головоломка...С++ - 2007-12-02 18:33:55.360000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25

quote:

ORIGINAL: Mamka

Смотрим сие антиструктурированне творение моего знакомого, попросившего помочь ему. В проге почти все исправил, остался только один ньюанс, который не могу понять..
Цель задачи, что то вроде создания качественного ПО. Ввводится вектор, потом на выбор его сортировка-по возрастанию/убыванию. Задача, исключить ошибки ввода пользователя. Например, при вводе "орпвлоарп74356" или "++4", "–4"-вывод ошибки. Корректный ввод это 54, -43, +32, 00000000000000004(=4) и т.д.

[…]

у меня ошибка такая, когда ввожу +&lt;число&gt;(например +4) програма выдает мне это число минус 50. При вводе просто отрицательного числа все норм. уже час не могу найти ошибку, интересно, найдете ли вы ее.

1. когда постишь код программы, заключай его в bb-теги code.
2. программу можно-таки переоформить с учётом замечаний дейкстры, за час времени ты управился бы, наверное, а заодно, вероятно, избавился бы от непонятной ошибки.
3. ключевое слово break знакомо? Используй его, вместо:x3_what_it_means=false;4. мне никак не уловить глубинный смысл конструкцииwhile (f) for (/*...*/) { /*...*/ }5. багу воспроизводить умеешь? ну дык, в руки дебуггер, и через две минуты ошибка будет диагностирована.
6. если предыдущие пять пунктов не помогли, то остаётся один вопрос: в какой момент надо вводить +4, чтобы получить -50?
Post #: 2
RE: Вот такая головоломка...С++ - 2007-12-11 17:33:52.500000   
crbunny

Сообщений: 223
Оценки: 0
Присоединился: 2006-06-22 21:20:01
Проверяют корректность ввода при поще cin.error
Post #: 3
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вот такая головоломка...С++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.