пятница, 25 июля 2008 г.

глава 7 упражнение 4


Дать определение рекурсивной функции, которая принимает в качестве аргумента целое число и возвращает факториал этого аргумента.
Напоминаем, что 3 факториал, записывается как 3!, что равно 3 х 2!, при этом 0!, по определению, равен 1. В общем случае n! = n * (n - 1)!.
Проверьте это в программе, которая использует цикл для того, чтобы позволить пользователю вводить различные значения, для которых программа вычисляет факториал.



#include <iostream.h>
#include <stdlib.h>
int main()
{
int ;
double ;
system("PAUSE");
return 0;
}
void countdown(int n)
{
cout « "Counting down ..." « n « "\n";
if (n > 0)
countdown(n-1); // функция вызывает саму себя
cout « n « ": Kaboom!\n";
}

четверг, 10 июля 2008 г.

глава 6 упражнение 5

В королевстве Нейтронии, в которой денежной единицей является tvarp, установлены следующие ставки подоходного налога:

первые 5000 tvarp: 0%
следующие 10000 tvarp: 10%
следующие 20000 tvarp: 15%
свыше 35000: 20%

Например, кто-либо получающий 38000 tvarp должен был бы уплатить налог величиной 5000 х 0.00 + 10000 х 0.10 + 20000 х 0.15 + 3000 х 0.20, или 4600 tvarp.

Напишите программу, которая использует цикл для запроса о доходах и для отображения суммы налога. Цикл прерывается, когда пользователь вводит отрицательное число или нечисловое значение.
______________________________________________________


#include <iostream.h>
#include <stdlib.h>

int main()
{
int summa;
const int max =4; // можно было бы просто 4, но, имхо, был бы говнокод
double nalog=0;
const int e[max] = {5000, 10000, 20000, 35000}; // значения для ставок
const double procent[max] = {0.00, 0.10, 0.15, 0.20}; //процентные ставки
int i; // для счетчика

cout << "vvedite summu : ";
while (cin >> summa && summa > 0)
{
nalog =0;
for (i=0; i<max; i++)
{
summa = summa - e[i];
if (summa>=0)
nalog = nalog + e[i]*procent[i];
else
{
nalog = nalog + (e[i]+summa)*procent[i];
break;
};
};
cout << "nalog :" << nalog << "\nvvedite summu : ";
};


system("PAUSE");
return 0;
}

________________


сам понимаю, что куй знает что, но вот так вот... Если бы я не напрегся, то созерцали бы вы ...эээээм...... даже слова такого не знаю. Долго ипался, и уже хотел все сделать через иф елсе ))

глава 6 упражнение 4

// Структура имен членов Order of Programmers Benevolent struct bop { char fullname[strsize]; //действительное имя char title[strsize]; //название должности char bopname[strsize]; //секретная кличка ВОР int preference; // 0 = fullname, // 1 = title, // 2 = bopname


В программе создайте небольшой массив таких структур и инициализируйте его подходящими значениями. Программа должна выполнять цикл, который позволяет пользователю выбирать различные возможности: a. отображение по имени b. отображение по должности c. отображение по тайной кличке d. отображение по привилегиям q. выход __________________________________________________________


 #include <iostream.h> #include <stdlib.h> struct bop {    char fullname [20];    char title [20];    char bopname[20];    int pref;    }; int main() {    char ch[5];    int i=0;    bop e[3] =    {       { "wimp1", "title1", "bopname1", 1},       { "Raki2", "title2", "bopname2", 0},       {"Celia3", "title3", "bopname3", 2}       }; // инициализация массива структур     cout << "Benevolent Order of Programmers Report\n";    cout << "a. display by name\n";    cout << "b. display by title\n";    cout << "c. display by bopname\n";    cout << "d. display by preference\n";    cout << "q. quit\n";     while (cin.getline(ch, 5))    {       if (ch[0]== 'q') // если q то выход       {          cout <<"Bye!\n";          break;       }    if (strlen(ch) == 1)    // проверка ввода лишь одного символа    switch (ch[0])    {       case 'a' : for (i=0;i<3;i++)                  cout << e[i].fullname << "\n";                  break;       case 'b' : for (i=0;i<3;i++)                  cout << e[i].title << "\n";                  break;       case 'c' : for (i=0;i<3;i++)                  cout << e[i].bopname << "\n" ;                  break;       case 'd' : for (i=0;i<3;i++)                   switch (e[i].pref)                  {                     case 0 : cout << e[i].fullname << "\n";                              break;                     case 1 : cout << e[i].title << "\n";                              break;                     case 2 : cout << e[i].bopname << "\n";                              break;                  };                  break;      default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";    }    else cout << "vy vveli neskolko simvolov, povtorite vvod\n"; }  system("PAUSE"); return 0; } 

______________________________


особой сложности не встретил, пол-кода взял из прошлого упражнения. Только был подзабывши как со структурами обращаться ))


все могло бы быть проще и нагляднее с помощью функций, но пока предполагается, что я еще не знаю этого. Хотя сколько раз я начинал с разных книг, столько я и читал про функции ))

глава 6 упражнение 3

Напишите заготовку программы, управляемой меню. Программа должна отображать меню, состоящее из четырех пунктов, каждый из которых помечен буквой. Если пользователь отвечает вводом буквы, отличающейся от одного из допустимых пунктов, программа должна предлагать ему ввести допустимый ответ до тех пор, пока это не будет сделано. Затем программа должна использовать переключатель для выбора простого действия, исходя из ответа пользователя. Результат выполнения программы мог бы выглядеть примерно так:


Please enter one of the following choices:
c) carnivore p) pianist
t) tree g) game

Please enter a c, p, t, or g : y
Please enter a c, p, t, or g : t
A maple is a tree.




#include <iostream.h>#include <stdlib.h>#include <cstring.h>  // для strlen()int main(){   char ch [20];   cout <<  "Please enter one of the following choices:\n";   cout << "c) carnivorne        p) pianist\n";   cout << "t) tree              g) game\n";   cout << "q) quit\n";   while (cin.getline(ch, 20))   {   if (ch[0]== 'q') // если q то выход   {      cout << "quit\n";      break;   }   if (strlen(ch) == 1)    // проверка ввода лишь одного символа   switch (ch[0])   {      case 'c' : cout <<"carnivorne\n";                 break;      case 't' : cout << "tree\n";                 break;      case 'p' : cout << "pianist\n";                 break;      case 'g' : cout << "game\n";                 break;      default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";   }   else cout <<"vy vveli neskolko simvolov, povtorite vvod\n";}system("PAUSE");return 0;}

Добавил только выход из цикла
Оч много проепался с проверкой на ввод одного символа, только потом вспомнил, что можно замереть длину строки strlen()'ом
Массив символов ограничил 20 и это значит, если ввести больше то прога завершит работу.

среда, 9 июля 2008 г.

глава 6 упражнение 2

Напишите программу, которая считывает до десяти значений "пожертвований" в массив значений типа double. Программа должна прерывать ввод при вводе нечислового значения. Она должна сообщать о средней величине "пожертвований", а также о том, сколько значений в массиве превышают среднее значение



#include <iostream.h>
#include <stdlib.h>

int main()
{
double pr [10];
double accum = 0;
double sred = 0;
int c=0;
int i=0;
for (i; i<10; i++)
{
cout << " round #" << i+1 << " :";
while (!(cin >> pr[i]))
{
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Please enter number : ";
}
}
for (i=0; i<10; i++)
accum += pr[i];
cout << "\n obschaja summa :" << accum << " \n";
sred = accum/i;
cout << "srednjaja summa :" << sred << " \n\n\n";
for (i=0; i<10;i++)
if (sred < pr[i])
{
c++;
cout << pr[i] << " " ;
};
cout << "takie znachenija vyshe srednego. Ix vsego : " << c <<endl;


system("PAUSE");
return 0;
}