Помощ със задача Dev C++

+4 гласа
1,259 прегледа
попитан 2016 юни 22 от xhaxha (170 точки)
Здравейте, имам задача, но не успявам да се справя. Ще се радвам, ако някой помогне. Задачата е следната: ДСП, която въвежда число n от клавиатурата и извежда стойността на функцията y=(n+4)/(n-4). Програмата да извежда подходящо съобщение и да изисква ново въвеждане всеки път, когато потребителят въведе некоректна стойност.

Задачата трябва да се реши с while и отделно с do while. Трябват ми най-простите решения.

2 отговори

+2 гласа
отговорени 2016 юни 22 от Антон Яначков (490 точки)
редактиран 2016 юни 22 от Антон Яначков

Учи по съвременен език там нещата са много по прости. Ето как се решава твоята задачка във Visual Basic 6.0

http://programirane.bivaood.com/primeri/forumDev/1/1.jpg

Товае целия сорс:


Private Sub Command1_Click()
    Text2.Text = "" 'Почистваме Text2 от предишни изчисления
    n = Text1.Text 'Въвеждаме си проста променлива, за да пишем по-лесно математическия израз, но това не е задължително
    On Error GoTo dolu ' Манипулатор на грешка, който реално извършва и валидирането на входните данни
    Text2.Text = (n + 4) / (n - 4) ' Визуализираме изчисления резултат, ако е възможен
    Exit Sub ' Излизаме от процедурата
dolu:         'Етикет за скок при грешка и невъзможност да се извърши математичната операция
    MsgBox "Некоректни входни данни", vbCritical, "Пример за проста валидация" ' Съобщение
End Sub


Предполагам си представяш в една сложна програма какво ще се случи, ако започнеш с цикли да проверяваш и валидариш всяка входна данна. Затова в програмирането се използват прости манипулатори на грешка. Аз съм ти дал един прост пример за подобен манипулатор. В общия случай са няколко, като самия процес на отстраняване на възможни грешки се нарича настройка на програмата. Това е много отговорен момент при създаване на една програма, защото при грешка програмата ще затвори, ако грешката не е манипулирана, тоест предвидена. В общия случай времето за създаване на една истинска програма се разделя на 3. Една трета от времето отива за написване на реалния сорс, който реализира идеята ти. Една трета отива и за изработване на картинките и дизайна, тоест как да изглежда програмата и последната една трета отива за настройка на програмата, тоест при натискане на даден бутон, кой да се покаже, какво да се скрие и каква грешка може да се получи.

Ето линк и към самото проектче, вътре има и компилирано ехе, сам да провериш дали програмата решава твоята проста задачка:

http://programirane.bivaood.com/primeri/forumDev/1/1.rar

коментиран 2016 юни 22 от rm (1,220 точки)
Ето и решение на php:
[code]
<html>
<head>
 <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
</head>
<body>
 <form action='index.php' method='post' enctype='multipart/form-data'>
  Числото n: <input name="n" />
  <br/>
<?php
  if(isset($_POST['n']))
  {// Имаме изпратена променлива!
   // Проверка за число
   if(!is_numeric($_POST['n']))
       echo "ГРЕШКА: Невалиден цифров формат!";
   else
   {$n=strval($_POST['n']);
    if($n==4)
        echo "ГРЕШКА: Деление на 0!";
    else
        echo "Резултат: ".(($n+4)/($n-4));
   }
  }
?>
  <br/>
  <input type="submit" value="Изчисли"/>
</body>
</html>
[/code]
коментиран 2016 юни 22 от xhaxha (170 точки)
Благодаря за подробния отговор, но задачата ми е дадена от училище и работим с dev c++. :(
0 гласа
отговорени 2016 юни 22 от IvayloHristov (5,390 точки)
Здравей, според мен има липса на условие. За да се изисква да се изпозлва while и да се валидира променливата n би трябвало да има някакво ограничение. Напимер да има условие в задачата от вида. n да е положително число или n да е от 0 до 100 или нещо подобно. Когато имаш тази информация и след това е лесно.
коментиран 2016 юни 22 от xhaxha (170 точки)
Ами да, но не знам какво да е условието.
коментиран 2016 юни 22 от IvayloHristov (5,390 точки)
Аха сега разбирам. Ако не е дадено условие трябва да се предпазиш от делене на нула. Значи въвеждаш число докато не е различно от 4. Защото при 4 ще се получи делене на нула.
коментиран 2016 юни 23 от Антон Яначков (490 точки)
редактиран 2016 юни 23 от Антон Яначков
В общия случай n би трябвало да бъде всякакво число  -  цяло, реално, положително и отрицателно. Има се впредвид,  чрез цикъл  да се обходят символите ( било цифри, букви или други знаци ) един по един и да се прецени дали е цифра, десетична точка, знак плюс или минус, като се следи да няма повторение на знака или десетичната точка.  Тоест определя се дължината на въведения стринг и символ по символ се проверява.  Ако съдържа само цифри в комбинация от един знак плюс или минус и една десетична точка, значи въведеното е число, а ако се открие дори една буква или друг символ, значи имаме некоректни данни. В конкретния слуай трябва да се изключи и числото 4, защото ще се предизвика делене на 0. Но пак казвам, че това е безсмислено упражнение, защото няма език, който да няма манипулатор на грешка. Хвърлянето на децата в безсмислени главоблъсканици води до отчуждаване на хлапетата от програмирането.  Да, това може да е пример за цикъл, но може да се измислят хиляди други смислени задачи, чрез които да се демонстрира или упражнява цикъла do while. А на конкретната задача трябва да се даде истинско приложимо решение за валидация, което реално се използва от програмистите. Това решение обикновено е само от един ред. Задачата ясно показва нивото на нашето образование както и  нивото на нашите преподаватели.
коментиран 2016 юни 23 от code (2,460 точки)
Антоне никакъв вид проверка на числен формат не се иска! Задачата е такава, че се създава prompt програма, която върти цикъл докато: "потребителят въведе некоректна стойност".

В днешно време промптовите програми се ползват почти изцяло от администратори и системни програмисти. Това те правят не по навик, а защото промптът им дава огромна гъвкавост и скорост при въвеждането, което е несравнимо по-добро от графичния интерфейс с мишка и кликания. Естествено тук си прав (за разлика от другата тема), че не е нормално в образованието да обучаваме всички като системни програмисти. Това е една относително тясно специализирана специалност!
коментиран 2016 юни 23 от xhaxha (170 точки)
#include <iostream>
#include <math.h>
using namespace std;

int main()
{        int n;
        int y;
   
         cout << "Input a number:";
         cin >> n;
   
         while (n>0){(y=(n+4)/(n-4)};
         cout<<n<<endl;


system ("pause");
return 0;
}

Това успявам да измисля като гледам какво се писали в тетрадките и следвам модела, който сме писали, но не ми се получава. Нищо не разбирам. Писали сме while <условие> <оператор>, не ми се получава, не знам как трябва да стане. Знам, че задачата е елементарна, но госпожата не ни обяснява, просто ни дава схемата. Ще се радвам, ако някой може да ми каже къде греша и как точно трябва да бъде.
коментиран 2016 юни 23 от Антон Яначков (490 точки)
Според условието на задачата, трябва да се визуализира резултат при всяко въвеждане на число от клавиатурата. Обърни внимание при всяко въвеждане на число от клавиатурата.
Тоест, ако въвеждаш букви или други символи не трябва да има реакция. Изисква се реакция само и единствено при въвеждане на число от клавиатурата. С клавиатурата се въвеждат цифри и букви. Чрез определена комбинация от цифри се получават различни числа. Ако допуснем. че условието на задачата е вярно, то програмата така трябва да бъде изпълнена, че при комбинация от цифри и букви тя не трябва да реагира, защото не е въведено число от клавиатурата, а някаква комбинация от символи и това е извън заданието. Но ако е въведено истинско число то трябва да има реакция и възможните варианти са само два. Ако е въведено числото 4 съобщение за грешка, а ако е въведено друго число следва решение на функцията. Излиза, че ни трябва само един IF, който да провери дали въведеното число не е 4.
Горните разсъждения са верни, ако строго следваме условието на задачата. Но лично аз се съмнявам, че точно това е искал да каже преподавателя. Според мен се изисква валидация на въведеното, което е нещо смислено. Другото е абсурдно глупаво.
коментиран 2016 юни 23 от IvayloHristov (5,390 точки)
Това, което бъркаш е следното.

Трябва да въвеждаш стойност докато не е правилната стойност. И ако имаш неправилна стойност да повториш.
Виж това:

while ( условие )
{    
         cout << "Input a number:";
         cin >> n;
   
}
коментиран 2016 юни 23 от xhaxha (170 точки)
Може ли някой да напише цялото решение?
коментиран 2016 юни 24 от code (2,460 точки)
Цялото решение няма да ти го дам, но ето почти цялото:

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

int main()
{int n;
 int y;
 
 int bad=1;
 while(bad)
 {cout << "Input a number:";
  cin >> n;
  if(n==4)
  {... извеждаш, че се дели на нула!
  }
  else
  {y=(n+4)/(n-4);
   ... маркираш, че изчислението е OK!
  }

  cout<<y<<endl;
 }

 return 0;
}

Между другото не знам дали сте учили за обработка на грешки в C++. Ако сте, тогава трябва да ползваш тази технология, а да не е по начина по който ти показвам.
...