Вот такая головоломка...С++
Пользователи, просматривающие топик: 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<'1') || (a_arr>'5') || (strlen(a_arr)>i+1)) cout << "Try again\n"; else { siz=toascii(a_arr)-48; f=false; } cout << "size :" << siz << "\n"; } f=true; j=0; int ind=1; bool fl,fg; while (f) for (j=0; j<=siz-1; j++) { cout << "Enter " << ind << " 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)>i+5) || (strlen(b_arr)<1) || (strlen(b_arr)==i)) { cout << "Try again\n"; j–; } else { sum=0; umn=1; fg=true; //if (i!=0) for (m=i; m<=soa-1; m++) { if ((b_arr[m]<'0') || (b_arr[m]>'9')) fg=false; } for (m=soa-1; m>=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<=soa-2; stri++) tri*=10; } if (fl==false) { sum=-sum-3*tri; a[se]=sum; } else a[se]=sum; if (fg==false) { cout << "Try again\n"; j–; } else { if ((a[se] < -32768) || (a[se] > 32767)) { cout << "Try again\n"; j–; } else { cout << "i :" << i << "\n"; cout << i++ << " element :" << b_arr << "\n"; cout << "element :" << a[se] << "\n"; cout << "Element :" << sum << "\n"; se++; i–; ind++; } } } } cout << "Your array :\n"; ind=0; for (i=0; i<=siz-1; i++) { ind++; cout << "a[" << ind << "] = " << a << "\n"; } cout << "Choose type of sort : 1-increase, 2-decrease\n"; cin >> tos; cout << endl; if (tos==1) { for(i = 1;i < siz; i++) for(j =siz-1;j >= i; j–) { if (a[j-1] > a[j]) { tmp = a[j-1]; a[j-1] = a[j]; a[j] = tmp; } } } if (tos==2) { for(i = 1;i < siz; i++) for(j =siz-1;j >= i; j–) { if (a[j-1] < a[j]) { tmp = a[j-1]; a[j-1] = a[j]; a[j] = tmp; } } } /*cout << "Your array :\n"; ind=0; for (i=0; i<=siz-1; i++) { ind++; cout << "a[" << ind << "] = " << a << "\n"; }*/ getch(); return 0; } у меня ошибка такая, когда ввожу +<число>(например +4) програма выдает мне это число минус 50. При вводе просто отрицательного числа все норм. уже час не могу найти ошибку, интересно, найдете ли вы ее.
|
|
|
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) и т.д. […] у меня ошибка такая, когда ввожу +<число>(например +4) програма выдает мне это число минус 50. При вводе просто отрицательного числа все норм. уже час не могу найти ошибку, интересно, найдете ли вы ее. 1. когда постишь код программы, заключай его в bb-теги code. 2. программу можно-таки переоформить с учётом замечаний дейкстры, за час времени ты управился бы, наверное, а заодно, вероятно, избавился бы от непонятной ошибки. 3. ключевое слово break знакомо? Используй его, вместо:x3_what_it_means=false; 4. мне никак не уловить глубинный смысл конструкцииwhile (f)
for (/*...*/) {
/*...*/
} 5. багу воспроизводить умеешь? ну дык, в руки дебуггер, и через две минуты ошибка будет диагностирована. 6. если предыдущие пять пунктов не помогли, то остаётся один вопрос: в какой момент надо вводить +4, чтобы получить -50?
|
|
|
RE: Вот такая головоломка...С++ - 2007-12-11 17:33:52.500000
|
|
|
crbunny
Сообщений: 223
Оценки: 0
Присоединился: 2006-06-22 21:20:01
|
Проверяют корректность ввода при поще cin.error
|
|
|
|
|