К основному контенту

Прата С. Решение задач 6 главы

На решение этих задач у меня ушло 2 дня. Становится все интереснее и интереснее! и черт возьми, я наконец-то поняла работу с файлами!
прошу прощения за корявые условия. просто в нормальном формате электронной книги у меня нет, потому скрины задач просто пропущены через Файнридер.


1. Напишите программу, которая читает клавиатурный ввод до символа 0 и повторяет его, за исключением десятичных цифр, преобразуя каждую букву верхнего регистра в букву нижнего регистра и наоборот. (Не забудьте о семействе функций cctype.)

2 Напишите программу, читающую в массив double до 10 значений пожертвований. (Или, если хотите, используйте шаблонный объект array.) Программа должна прекращать ввод при получении нечисловой величины. Она должна выдавать среднее значение полученных чисел, а также количество значений в массиве, превышающих среднее.

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

4. Когда вы вступите в Благотворительный Орден Программистов (БОП), к вам могут обращаться на заседаниях БОП по вашему реальному имени, но должно¬сти либо секретному имени БОП. Напишите программу, которая может выво¬дить списки членов по реальным именам, должностям, секретным именам либо по предпочтению самого члена. В основу положите следующую структуру.
// Структура имен Благотворительного Ордена Программистов
В этой программе создайте небольшой массив таких структур и инициализируй¬те его соответствующими значениями. Пусть программа запустит цикл, кото¬рый даст возможность пользователю выбирать разные альтернативы:
a. display by name b. display by title
c. display by bopname d. display by preference
q. quit
Обратите внимание, что “display by preference" (отображать по предпочтениям) не означает, что нужно отобразить член preference; это значит, что необходи¬мо отобразить член структуры, который соответствует значению preference. Например, если preference равно 1, то выбор d должен вызвать отображение должности данного программиста. Пример запуска этой программы может вы¬глядеть следующим образом: 
Benevolent Order of Programmers Report a. display by name b. display by title
c. display by bopname d. display by preference
q. quit
Enter your choice: a
Wimp Macho
Raki Rhodes
Celia Laiter
Hoppy Hipnan
Pat Hand
Next choice: d
Wimp Macho
Junior Programmer
MIPS
Analyst Trainee LOOPY
Next choice: q Bye !

5. Королевство Нейтрония, где денежной единицей служит твари, использует сле-дующую шкалу налогообложения:
первые 5 000 тварпов — налог 0% следующие 10 000 тварпов — налог 10% следующие 20 000 тварпов — налог 15% свыше 35 000 тварпов - налог 20%
Например, если некто зарабатывает 38 000 тварпов, то он должен заплатить на-логов 5000 х 0,00 + 10000 х 0,10 + 20000 х 0.15 + 3000 х 0.20. или 4 600 тварпов. Напишите программу, которая использует цикл для запроса доходов и выдачи подлежащего к выплате налога. Цикл должен завершаться, когда пользователь вводит отрицательное или нечисловое значение.

6. Постройте программу, которая отслеживает пожертвования в Общество Защиты Влиятельных Лиц. Она должна запрашивать у пользователя количество меценатов, а затем приглашать вводить их имена и суммы пожертвований от каждого. Информация должна сохраняться в динамически выделяемом массиве структур. Каждая структура должна иметь два члена: символьный массив (или объект string) для хранения имени и переменную-член типа double — для хранения суммы пожертвования. После чтения всех данных программа должна отображать имена и суммы пожертвований тех, кто не пожалел $10 000 и более. Этот список должен быть озаглавлен меткой “Grand Patrons”. После этого программа должна выдать список остальных жертвователей. Он должен быть озаглавлен "Patrons”. Если в одной из двух категорий не окажется никого, программа должна напечатать “попе”. Помимо отображения двух категорий, ника¬кой другой сортировки делать нс нужно.

7. Напишите программу, которая читает слова по одному за раз, пока нс будет введена отдельная буква q. После этого программа должна сообщить количество слов, начинающихся с гласных, количество слов, начинающихся с согласных, а также количество слов, не попадающих ни в одну из этих категорий. Одним из возможных подходов может быть применение isalpha () для различения слов, начинающихся с букв, и остальных, с последующим применением if или 
switch для идентификации тех слов, прошедших проверку isalphaO, которые начинаются с гласных. Пример запуска может выглядеть так:
Enter words (q to quit) :
The 12 awesome oxen ambled quietly across 15 meters of lawn, q
5 words beginning with vowels 4 words beginning with consonants 2 others

8. Напишите программу, которая открывает текстовый файл, читает его символ за символом до самого конца и сообщает количество символов в файле.

9. Выполните упражнение 6, по измените его так, чтобы данные можно было по¬лучат!» из файла. Первым элементом файла должно быть количество меценатов, а остальная часть состоять из пар строк, в которых первая строка содержит имя, а вторая — сумму пожертвования. То есть файл должен выглядеть пример¬но так:
4
Sam Stone 2000
Freida Flass 100500 Таптпу Tubbs 5000
Rich Raptor 55000




1

#include "stdafx.h"
#include<iostream>
#include <cctype> // прототипы символьных функций

using namespace std;


void main() 
{
cout << "Enter the text and enter @" << endl;
char ch;
cin.get(ch); // получаем из буфера символ
while (ch != '@') // проверка всех символов до @
{
if (isalpha(ch)) // возвр true если аргумент буква
{
if (islower(ch)) // возвр тру если аргумент в нижнем регистре
{
cout << char(toupper(ch)); // возвращает символ верхнего регистра если аргумент в нижнем, иначе - оставляет без изменения. форматирование вывода, иначе будет числовой код буквы
}
else 
cout << char(tolower(ch)); // возвращает символ нижнего регистра если аргумент в верхнем, иначе - оставляет без изменения. форматирование вывода, иначе будет числовой код буквы
}
cin.get(ch); // получение следующего символа
}
cout << endl;
}



2




#include "stdafx.h"
#include<iostream>

using namespace std;
const int MAX = 10;

void main() 
{
double ar[MAX];
cout << "Enter amount of donations" << endl;
int i = 0; // счетчик 
double sum; 
while ((cin >> ar[i])) // если cin используется как часть проверочного условия, он преобр в bool. в данном случае оно равно тру пока вводятся числовые значения, т.е. принимается в счет ar[i] типа double, одновременно это выражение вставляет в массив значение введенное пользователем
i++; // счетчик цикла и счетчик взносов после каждого цикла увеличивается.
sum = ar[0];
for (int j = 1; j<i; j++)
sum += ar[j];
double average = sum/i;
cout << "Average = " << average << endl;
cout << "values greater than the average: " << endl; 
for (int k = 0; k<i; k++)
{
if (ar[k] > average)
cout << ar[k] << endl;
}
cout << endl;
}


3


#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

void main() 
{
char ch;
cout << "Enter one of the following choices: " << endl << "c) carnivore" << setw(20) << "p) pianist" << endl << "t) tree" << setw(20) << "g) game" << endl;
while (cin >> ch) // пока вводятся символьные значения цикл продолжается
{
if (ch == 'c')
{
cout << "Your choise с, this is a lenth of your word: " << strlen("carnivore") << endl; // определение длинны слова
break; // выход из цикла 
}
if (ch == 'p')
{
cout << "Your choise p, this is a lenth of your word: " << strlen("pianist") << endl;
break;
}
if (ch == 't')
{
cout << "Your choise t, this is a lenth of your word: " << strlen("tree") << endl;
break;
}
if (ch == 'g')
{
cout << "Your choise g, this is a lenth of your word: " << strlen("game") << endl;
break;
}
else // в случае неправильной буквы цикл продолжается
{
cout << "Please enter a c, p, t or g: ";
}
}
cout << endl;
}


4




#include "stdafx.h"
#include<iostream>
using namespace std;
const int SIZE = 35;
const int Bop = 2;

struct bop
{
char fullname[SIZE];
char title[SIZE];
char boqname[SIZE];
int preference;
};

void main() 
{
char ch;
bop BOP[Bop] = {"Wimp Macho", "programist", "WM", 0, 
                  "Raki Rhodes", "programist", "Junior Pro", 2};
cout << "Benevolent order of Programmers Report" << endl 
<< "a. display by name                     b. display by title" << endl;
cout << "c. display by boqname                  d. display by preference" << endl;
do
{
cout << "Enter your choise" << endl;
cin.get(ch);
cin.get();
if (ch == 'a')
{
for (int i = 0; i < Bop; i++)
cout << BOP[i].fullname << endl;
}
if (ch == 'b')
{
for (int i = 0; i < Bop; i++)
cout << BOP[i].title << endl;
}
if (ch == 'c')
{
for (int i = 0; i < Bop; i++)
cout << BOP[i].boqname << endl;
}
if (ch == 'd')
{
for (int i = 0; i < Bop; i++)
switch (BOP[i].preference)
{
case 0:
cout << BOP[i].fullname << endl;
break;
case 1:
cout << BOP[i].title << endl;
break;
case 2:
cout << BOP[i].boqname << endl;
break;
}
}
if (ch == 'q')
cout << "Bye!" << endl;
}
while (ch != 'q');
cout << endl;
}



5



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

void main() 
{
int income, tax = 0;
cout << "\nEnter your income" << endl;

while (cin >> income) // пока вводятся цифры
{
if (income < 10000)
{
cout << "your tax = " << 0 << ". I do not know for you to rejoice or cry ..." << endl;
}

if ((income > 10000) && (income < 20000))
{
tax = (5000 * 0) + ((income-5000) * 0.10);
cout << "your tax = " << tax << endl;
}

if ((income > 20000) && (income < 35000))
{
tax = (5000 * 0) + (10000 * 0.10) + ((income - 10000) * 0.15);
cout << "your tax = " << tax << endl;
}

if (income > 35000)
{
tax = (5000 * 0) + (10000 * 0.10) + (20000 * 0.15) + ((income - 35000) * 0.20);
cout << "your tax = " << tax << endl;
}
}
cout << endl << "Bye!" << endl;
}



6




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

struct Patrons
{
string name;
double donation;
};

void main() 
{
int patrons;
cout << "enter the number of patrons" << endl;
cin >> patrons;
Patrons *pat = new Patrons[patrons];
for (int i = 0; i < patrons; i++)
{
cout << "Enter " << i+1 << " patron" << endl;
cout << "Name ";
cin >> pat->name;
cout << "\nDonation ";
cin >> pat->donation;
pat++;
}
cout << "\n*******GRAND PATRONS*******" << endl;
for (int i = 0; i < patrons; i++)
{
if (pat->donation >= 10000)
cout << pat->name << endl;
pat--;
}
cout << "\nPATRONS" << endl;
for (int i = 0; i < patrons; i++)
{
if (pat->donation <= 10000)
cout << pat->name << endl;
pat++;
}
cout << endl;
}

7



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



void main() 
{
    using namespace std;
    cout << "Enter words, (q to quit):\n";
    string word;
    int vowels = 0;
    int consonants = 0;
    int other = 0;
    while (cin >> word &&  word != "q")
    {
        if (isalpha(word[0])) // чтение ондого слова и его первой буквы!
        {
            switch (word[0])
                {
                    case 'a': case 'A':
                    case 'e': case 'E':
                    case 'i': case 'I':
                    case 'y': case 'Y':
                    case 'o': case 'O':
                    case 'u': case 'U': vowels++;
                        break;
                    default: consonants++;
            }
        }else other++;
    }
    cout << vowels << " words beginning with vowels.\n";
    cout << consonants << " words beginning with consonants.\n";
    cout << other << " words beginning with any other character.\n";
}




8





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



void main() 
{
ifstream inFile; //объявление названия объекта для обработки файлового вывода
inFile.open("lialia.txt"); //открываем файл
char ch; //в эту переменную будут передаваться символы по одному
if (!inFile.is_open()) //если файл не открылся - завершение программы
{
cout <<"couldn't open the file" << endl;
cout << "Program terminanting.\n";
exit(EXIT_FAILURE);
}
int count = 0;
inFile >> ch; // получение первого символа
while (inFile.good()) // пока ввод происходит благополучно
{
++count; //увеличиваем счетчик
inFile >> ch; // получаем следующий символ
}
if (inFile.eof()) //когда достигнул конец файла
cout <<"End of file reached.\n";
else if (inFile.fail()) //ввод прекращен из-за несоответствия данных
cout << "Input terminated by data mismatch. \n";
else
cout << "Input terminated for unknown reason. \n"; //ввод прекращен по неизвестной причине
if (count == 0) 
cout << "NO data\n";
else 
{
cout << count << " sign" << endl;
}
inFile.close(); // закрываем файл
}





9




/* примечание: можно вводить имена только из одного слова */
#include "stdafx.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

struct Patrons
{
string name;
double donation;
};

void main() 
{
ifstream inFile; //обьявление названия обьекта для обработки файлового вывода
inFile.open("lialia.txt"); //открываем файл
if (!inFile.is_open()) //если файл не открылся - завершение программы
{
cout <<"couldn't open the file" << endl;
cout << "Program terminanting.\n";
exit(EXIT_FAILURE);
}
int patrons;
cout << "enter the number of patrons" << endl;
inFile >> patrons; // использование inFile точно так же как и cin
Patrons *pat = new Patrons[patrons];
for (int i = 0; i < patrons, inFile.good(); i++)  // пока ввод происходит благополучно
{
cout << "Enter " << i+1 << " patron" << endl;
cout << "Name ";
inFile >> pat->name;
cout << "\nDonation ";
inFile >> pat->donation;
pat++;
}
cout << "\n*******GRAND PATRONS*******" << endl;
for (int i = 0; i < patrons; i++)
{
if (pat->donation >= 10000)
cout << pat->name << endl;
pat--;
}
if (inFile.eof()) //когда достигнул конец файла
cout <<"End of file reached.\n";
else if (inFile.fail()) //ввод прекращен из-за несоответствия данных
cout << "Input terminated by data mismatch. \n";
else
cout << "Input terminated for unknown reason. \n"; //ввод прекращен по неизвестной причине
cout << "\nPATRONS" << endl;
for (int i = 0; i < patrons; i++)
{
if (pat->donation <= 10000)
cout << pat->name << endl;
pat++;
}
cout << endl;
inFile.close(); // закрываем файл
}


Комментарии

  1. На рутрекере эта книжка уже несколько лет как в свободном доступе лежит - качай не хочу:
    http://rutracker.org/forum/viewtopic.php?t=4123652

    ОтветитьУдалить
  2. И ещё один момент. Лучше не писать void main().
    Пишите int main() и в конце программы - return 0;
    Подробнее тут: http://www.cyberforum.ru/cpp-beginners/thread1245556.html

    ОтветитьУдалить
  3. У того же Праты, если Вы читали внимательно, во второй главе (стр. 53-54) сказано:

    Некоторые программисты используют следующий заголовок и опускают оператор
    возврата:
    void main()
    Это логически имеет смысл, поскольку возвращаемый тип void означает, что
    функция не возвращает значения. Однако хотя данный вариант работает в
    некоторых системах, он не является частью стандарта C++. Таким образом, в других
    системах он даст сбой. Лучше всего не применять эту форму записи, а использовать форму,
    соответствующую стандарту C++; особых усилий это не потребует.

    ОтветитьУдалить
  4. И да, пятое задание решено неверно.

    ОтветитьУдалить
    Ответы
    1. да, я его немного от фонаря написала ибо запуталась в условии)

      Удалить
  5. Глава 6 задание 6
    не могу понять..., когда я ввожу данные Grands of Patrons первыми он их не выводит...
    и что значит pat++ в твоем коде, ты просто переводишь на адрес? чтобы значие в массиве вводилось в следующий адрес я правильно понял?

    ОтветитьУдалить
    Ответы
    1. выражение pat++ перемещает указатель на следующий элемент массива, а не просто адрес.

      Удалить
  6. Разберитесь с работой cin, прежде чем выкладывать решения с ошибками. С кучей ошибок.

    ОтветитьУдалить
  7. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  8. enum PAY {LOW = 5000, MIDDLE = 10000, HIGHT = 20000, VERY_HIGHT};
    int salary = 0, tax = 0, tmp = 0;
    std::cout << "Enter your salary:\n";

    while (std::cin >> salary && salary > 0)
    {
    tmp = salary;
    tmp = tmp - PAY::LOW;

    while (true)
    {
    if (tmp < 0) break;

    if (tmp <= PAY::MIDDLE)
    {
    tax += tmp * 0.1;
    break;
    }
    else
    {
    tax += PAY::MIDDLE * 0.1;
    tmp = tmp - PAY::MIDDLE;
    }

    if (tmp < PAY::HIGHT)
    {
    tax += tmp * 0.15;
    break;
    }
    else
    {
    tax += PAY::HIGHT * 0.15;
    tmp = tmp - PAY::HIGHT;
    }
    if (tmp > 0)
    {
    tax += tmp * 0.2;
    break;
    }
    }

    std::cout << "Your salary: " << salary << std::endl;
    std::cout << "Tax: " << tax << std::endl;
    salary = tax = 0;
    std::cout << "\nEnter your salary:\n";
    }

    ОтветитьУдалить
  9. Программа номер 5 должна быть так:
    #include
    #include

    const int tax_2 = 1000;
    const int tax_3 = tax_2 + 3000;

    int main(void)
    {
    using namespace std;
    SetConsoleOutputCP(1251);

    double income;

    cout << "Введите ваш доход: ";
    while(cin >> income && income >= 0)
    {
    if(income <= 5000)
    cout << "У вас нет налогов.\n";
    else if(income > 5000 && income <= 15000)
    cout << "У вас налог " << tax_2 << " тварпов.\n";
    else if(income > 15000 && income <= 35000)
    cout << "У вас налог " << tax_3 << " тварпов.\n";
    else
    cout << "У вас налог " << tax_3 + (income - 35000) * 0.20 << " тварпов\n";
    cout << "Введите следующую сумму: ";
    }
    cout << "Программа завершена.\n";
    return 0;
    }


    Программа номер 9 должна быть так:
    #include
    #include
    #include
    #include

    using namespace std;

    struct patrons
    {
    char name[20];
    double sum;
    };
    int main(void)
    {
    SetConsoleOutputCP(1251);
    int num_pat;
    int i = 0;
    int n = 0;
    char filename[15];
    ifstream infile;
    cout << "Введите имя файла: ";
    cin.getline(filename, 15);
    infile.open(filename);
    if (!infile.is_open())
    {
    cout << "Файл " << filename << " не найден";
    exit(EXIT_FAILURE);
    }
    (infile >> num_pat).get();
    patrons * ptr = new patrons[num_pat];
    while(infile.good())
    {
    infile.getline(ptr[i].name, 15);
    (infile >> ptr[i].sum).get();
    i++;
    }
    if (infile.eof())
    cout << "Чтение файла завершено.\n";
    else if (infile.fail())
    cout << "Несоответствия типов.\n";
    else
    cout << "Чтение прекращено по неизвестной причине.\n";
    cout << "Grand Patrons\n";
    for(i = 0, n = 0; i < num_pat; i++)
    if (ptr[i].sum >= 10000)
    {
    cout << ptr[i].name << ": "
    << ptr[i].sum << endl;
    n++;
    }
    if (!n)
    cout << "None\n";
    cout << "Patrons\n";
    for(i = 0, n = 0; i < num_pat; i++)
    if (ptr[i].sum < 10000)
    {
    cout << ptr[i].name << ": "
    << ptr[i].sum << endl;
    n++;
    }
    if (!n)
    cout << "None\n";
    return 0;
    }

    ОтветитьУдалить
  10. В программе номер 5 заголовочные файлы:
    iostream
    windows.h (Это для вывода русских букв)

    ОтветитьУдалить
  11. В программе номер 9 заголовочные файлы:
    iostream
    windows.h
    fstream

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

ВОПРОС К ЧИТАТЕЛЯМ

Уважаемые читатели моего блога и просто проходящие мимо! У меня появилась идея заняться созданием уроков по интересующим вас темам. Предпочтительно на C++, но не ограничиваясь ими, я хочу поделиться своими знаниями не только в виде готового кода но и подробными объяснениями что к чему. Прошу вас, если вы имеете идею и хотели бы разобраться в какой-то теме - отпишитесь в комментариях, что было бы вам интересно. Постараюсь помочь. 

7 глава, Лафоре Р

*1. Напишите функцию reversit(), которая переворачивает строку (массив типа char). Используйте цикл for, который меняет местами первый и последний символы, затем следующие и т. д. до предпоследнего. Строка должна пере- даваться в функцию reversit() как аргумент. Напишите программу для выполнения функции reversit(). Программа долж- на принимать строку от пользователя, вызывать функцию reversit(), а за- тем выводить полученный результат. Используйте метод ввода, который позволяет использовать внутренние пробелы. Протестируйте программу на примере фразы «Аргентина манит негра».

6 глава, Лафоре Р

*1. Создайте класс Int, имитирующий стандартный тип int. Единственное поле этого класса должно иметь тип int. Создайте методы, которые будут устанавливать значение поля, равным нулю, инициализировать его целым значением, выводить значение поля на экран и складывать два значения типа Int. Напишите программу, в которой будут созданы три объекта класса Int, два из которых будут инициализированы. Сложите два инициализирован- ных объекта, присвойте результат третьему, а затем отобразите результат на экране.