[Язык C] Упражнения по программированию (глава 7)


Задания из седьмой главы книжки Стивена Прата “C Primer Plus” —  «Управляющие операторы С: ветвление и переходы«.

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

#include <stdio.h>

int main (void)
{

 char ch;
 int space = 0;
 int newline = 0;
 int all_char = 0;

 printf("Please enter something..\n");

 while ((ch = getchar()) != '#')
  {
    if (ch== ' ')
        space++;
    if (ch== '\n')
        newline++;
    all_char++;
  }

 printf("%d spaces | %d newlines | %d all",
        space, newline, all_char);

getchar();getchar();
return 0;
}

2. Напишите программу, которая читает входные данные до тех пор, пока не встретится символ #. Программа должна выводить каждый введенный символ и его десятичный код ASCII. Каждая строка вывода должна содержать восемь пар “символ-код».

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

#include <stdio.h>

int main (void)
{

 char ch;
 int n=0;

 printf("Please enter something (# to quit)..\n");

 while ((ch = getchar()) != '#')
  {
    if (ch != '\n' && ch != ' ')
    {
        printf("%c-%d ", ch, ch);
        n++;
    }
    if ((n % 8) == 0)
        printf("\n");
  }

getchar();
return 0;
}

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

#include <stdio.h>

int main (void)
{

 int i;
 int even = 0;
 int sum_even = 0;
 int odd = 0;
 int sum_odd = 0;
 float average_even, average_odd;

 printf("Enter integer number (0 to quit)..\n");

 while (scanf("%d", &i) == 1 && i !=0 )
 {
    if ( (i%2) == 0 )
        {
            even++;
            sum_even += i;
        }
    else
        {
            odd++;
            sum_odd += i;
        }
 }
 if (even > 0)
    {
    average_even = sum_even/(float)even;
    printf("Even numbers: %d (average %.0f)\n",
        even, average_even);
    }
 if (odd > 0)
    {
    average_odd = sum_odd/(float)odd;
    printf("Odd numbers %d (average %.0f)",
        odd, average_odd);
    }

getchar();getchar();
return 0;
}

4. Используя операторы if else, напишите программу, которая читает входные
данные, пока не встретит символ #, заменяет каждую точку восклицательным
знаком, изначально присутствующие восклицательные знаки — двумя восклицательными знаками и в конце сообщает о количестве произведенных замен.

#include <stdio.h>
int main (void)
{

char ch;
int count=0;

printf("Enter something (# to quit)\n");

while ((ch = getchar()) != '#')
{
 if (ch == '.')
    {
    ch = '!';
    count++;
    printf("%c", ch);
    }
 else if (ch == '!')
    {
    putchar('!');
    putchar('!');
    count++;
    }
 else
    printf("%c", ch);
}
printf("There were %d replacements", count);

getchar();getchar();
return 0;
}

5. Выполните упражнение 4, но с применением оператора switch.

#include <stdio.h>
int main (void)
{

char ch;
int count=0;

printf("Enter something (# to quit)\n");

while ((ch = getchar()) != '#')
{
    switch (ch)
    {
        case '.':
        {
            count++;
            putchar('!');
            break;
        }
        case '!':
        {
            putchar('!');
            putchar('!');
            count++;
            break;
        }
        default:
            printf("%c", ch);
    }
}
printf("There were %d replacements", count);

getchar();getchar();
return 0;
}

6. Напишите программу, которая читает входные данные, пока не встретит символ #, и сообщает количество вхождений последовательности ei.

На заметку!
Эта программа должна “запоминать» предыдущий символ, а также текущий символ. Проверьте ее на входной последовательности вроде “Receive your eieio award#”.

#include <stdio.h>
int main (void)
{

char ch;
int e = 0; // flag
int count=0;

printf("Enter something with ei (# to quit)\n");

while ((ch = getchar()) != '#')
{

    if (ch == 'e')
        e = 1;
    else if (ch == 'i' && e == 1)
        {
            count++;
            e = 0;
        }
    else
        e = 0;
}
printf("There were %d ei", count);

getchar();getchar();
return 0;
}
Enter something with ei (# to quit)
Receive your eieio award#
There were 3 ei

7. Напишите программу, которая запрашивает количество часов, отработанных за неделю, и выводит значения общей суммы начислений, налогов и чистой зарплаты. Исходите из перечисленных ниже утверждений:

а. Основная тарифная ставка заработной платы = $10,00/час
б. Сверхурочные часы (превышающие 40 часов в неделю) = коэффициент 1,5
в. Налоговая ставка:
15% с первых $300;
20% со следующих $150;
25% с остатка.

Используйте константы #define и не беспокойтесь, если приведенный пример
не соответствует действующему налогообложению.

Первый блин комом — криво считает налог выше 300:

#include <stdio.h>

#define S_PER_H 10 // 10$ per hour
#define OVERWORK 1.5 // x1.5 if more than 40 hours/week

#define TAX_300 15 // 15% for $300
#define ADD_TAX_150 20 // 20% for next $150
#define ADD_TAX_LEFT 25 // 25% from leftover

int main (void)
{

int h = 0; // hours
float total = 0.0;
float tax = 0.0;
float earned = 0.0;

printf("Enter hours/week (q to quit)\n");

while (scanf("%d", &h) == 1)
{

    total = (float)h * S_PER_H;

    if (h > 40)
        total *= OVERWORK;

    tax = (total * TAX_300) / 100;

    if (total > 300.0f)
        tax += (((total-300) * ADD_TAX_150) / 100);
    if (total > 450.0f)
        tax += (((total-450) * ADD_TAX_LEFT) / 100);

    earned = total - tax;

    printf("Total: %.0f (-%.0f$ taxes). Earned: %.0f\n",
          total, tax, earned);
    printf("Enter another value (hours/week) or 'q' to quit\n");
}

getchar();getchar();
return 0;
}

Вывод (комментарии добавил руками):

Enter hours/week (q to quit)
25
Total: 250 (-38$ taxes). Earned: 212 // RIGHT
Enter another value (hours/week) or 'q' to quit
40
Total: 400 (-80$ taxes). Earned: 320 // WRONG
Enter another value (hours/week) or 'q' to quit
80
Total: 1200 (-548$ taxes). Earned: 652 // WRONG
Enter another value (hours/week) or 'q' to quit

Вот рабочий вариант:

#include <stdio.h>

#define S_PER_H 10 // 10$ per hour
#define OVERWORK 1.5 // x1.5 if more than 40 hours/week

#define TAX_300 15 // 15% for $300
#define ADD_TAX_150 20 // 20% for next $150
#define ADD_TAX_LEFT 25 // 25% from leftover

int main (void)
{

int h = 0; // hours
float total = 0.0;
float tax = 0.0;
float earned = 0.0;

printf("Enter hours/week (q to quit)\n");

while (scanf("%d", &h) == 1)
{

    total = (float)h * S_PER_H;

    if (h > 40)
        total *= OVERWORK;

    if (total <= 300.0f)
        tax = (total * TAX_300) / 100;

    if (total > 300.0f && total < 450)
    {
        tax = ((300 * TAX_300) / 100);
        tax +=(((total-300) * ADD_TAX_150) / 100);
    }
    if (total >= 450.0f)
    {
        tax = ((300 * TAX_300) / 100);
        tax +=((150 * ADD_TAX_150) / 100);
        tax +=(((total-450) * ADD_TAX_LEFT) / 100);
    }
    earned = total - tax;

    printf("Total: %.0f (-%.0f$ taxes). Earned: %.0f\n",
          total, tax, earned);
    printf("Enter another value (hours/week) or 'q' to quit\n");
}

getchar();getchar();
return 0;
}
Enter hours/week (q to quit)
25
Total: 250 (-38$ taxes). Earned: 212
Enter another value (hours/week) or 'q' to quit
40
Total: 400 (-65$ taxes). Earned: 335
Enter another value (hours/week) or 'q' to quit
80
Total: 1200 (-262$ taxes). Earned: 938
Enter another value (hours/week) or 'q' to quit

Программа выглядит несколько громоздкой, но зато весьма понятной. Теперь приведем ее в более универсальный вид (это будет полезно для следующего задания):

#include <stdio.h>

#define RATE_1 10 // 10$ per hour

#define OVERTIME 40 // >40 hours is overtime
#define OVERWORK 1.5 // x1.5 if overtime

#define BRACKET_1 300.0f
#define TAX_1 0.15 // 15% for $300

#define BRACKET_2 150.0f
#define TAX_2 0.2 // 20% for next $150

#define TAX_3 0.25 // 25% from leftover

int main (void)
{

int h = 0; // hours
float total = 0.0;
float tax = 0.0;
float earned = 0.0;

printf("Enter hours/week (q to quit)\n");

while (scanf("%d", &h) == 1)
{

    total = (float)h * RATE_1;

    if (h > OVERTIME)
        total *= OVERWORK;

    if (total <= BRACKET_1)
        tax = total * TAX_1;

    if (total > BRACKET_1 && total < BRACKET_1 + BRACKET_2)
    {
        tax = BRACKET_1 * TAX_1;
        tax +=((total - BRACKET_1) * TAX_2);
    }
    if (total >= BRACKET_1 + BRACKET_2)
    {
        tax = BRACKET_1 * TAX_1;
        tax +=(BRACKET_2 * TAX_2);
        tax +=((total - (BRACKET_1+BRACKET_2)) * TAX_3);
    }
    earned = total - tax;

    printf("Total: %.0f (-%.0f$ taxes). Earned: %.0f\n",
    total, tax, earned);
    printf("Enter another value (hours/week) or 'q' to quit\n");
}

getchar();getchar();
return 0;
}

8. Измените предположение а) в упражнении 7 так, чтобы программа предоставляла меню с тарифными ставками. Для выбора тарифной ставки используйте оператор switch. После запуска программы вывод должен быть подобным по указанному ниже:

Введите число, соответствующее желаемой тарифной ставке или действию:
1) $8.75/ч            2) $9.33/ч
3) $10.00/ч           4) $11.20/ч
5) Выход

Если выбран вариант с 1 по 4, программа должна запрашивать количество отработанных часов. Программа должна повторяться до тех пор, пока не будет выбран вариант 5. При вводе чего-то отличного от вариантов 1-5 программа должна напомнить пользователю допустимые варианты для ввода и снова ожидать ввод. Для различных тарифных и налоговых ставок применяйте константы #define.

#include <stdio.h>

#define RATE_1 8.75 // $ per hour
#define RATE_2 9.33
#define RATE_3 10.00
#define RATE_4 11.20

#define OVERTIME 40 // >40 hours is overtime
#define OVERWORK 1.5 // x1.5 if overtime

#define BRACKET_1 300.0f
#define TAX_1 0.15 // 15% for $300

#define BRACKET_2 150.0f
#define TAX_2 0.2 // 20% for next $150

#define TAX_3 0.25 // 25% from leftover

int main (void)
{

int h = 0; // hours
int r; // rate option
float rate = 0.0; // choosen rate
float total = 0.0;
float tax = 0.0;
float earned = 0.0;

printf("Choose your pay rate:\n");
printf("1) $8.75/hr     2) $9.33/hr\n");
printf("3) $10.00/hr    4) $11.20/hr\n");
printf("5) quit\n");

scanf("%d", &r);

while (((int)r) > 5 || ((int)r) < 1)
{
    while (getchar() != '\n') // clearing buffer after letter
        continue;
    printf("Please choose your pay rate:\n");
    printf("1) $8.75/hr     2) $9.33/hr\n");
    printf("3) $10.00/hr    4) $11.20/hr\n");
    printf("5) quit\n");
    scanf("%d", &r);
}

switch (r)
{
    case 1:
        rate = RATE_1;
        break;
    case 2:
        rate = RATE_2;
        break;
    case 3:
        rate = RATE_3;
        break;
    case 4:
        rate = RATE_4;
        break;
    case 5:
        goto end;
    }

printf("Enter hours/week (q to quit)\n");

while (scanf("%d", &h) == 1)
{

    total = (float)h * rate;

    if (h > OVERTIME)
        total *= OVERWORK;

    if (total <= BRACKET_1)
        tax = total * TAX_1;

    if (total > BRACKET_1 && total < BRACKET_1 + BRACKET_2)
    {
        tax = BRACKET_1 * TAX_1;
        tax +=((total - BRACKET_1) * TAX_2);
    }
    if (total >= BRACKET_1 + BRACKET_2)
    {
        tax = BRACKET_1 * TAX_1;
        tax +=(BRACKET_2 * TAX_2);
        tax +=((total - (BRACKET_1+BRACKET_2)) * TAX_3);
    }
    earned = total - tax;

    printf("Total: %.0f (-%.0f$ taxes). Earned: %.0f\n",
            total, tax, earned);
    printf("Enter another value (hours/week) or 'q' to quit\n");
}

end:
printf("See you next time!");

getchar();getchar();
return 0;
}

Эту программу было очень прикольно писать. В процессе наткнулся на проблему заклинивания (jam) при вводе вместо 1-5 какого-либо символа; об этом отдельная статья.

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

#include <stdio.h>

int main (void)
{

int n, i;
int f; // flag prime

printf("Enter positive integer number or q to exit\n");

for (scanf ("%d", &n) == 1; n>1; n--)
{
    for (i=n-1, f = 0; n > 1 && i > 1; i--)
    {
        if (n % i == 0)
            f = 1;
    }
    if (f != 1)
        printf("%d ", n);
}

getchar(); getchar();
return 0;
}

10. В 1988 году шкала федеральных налоговых ставок Соединенных Штатов была самой простой за все прошедшее время. Она содержала четыре категории, каждая из которых включала две ставки. Ниже приведены самые общие данные (суммы в долларах представляют собой доход, облагаемый налогом).

Категория Налог
Одинокий 15% с первых $17 850 плюс 28% от суммы, превышающей указанную
Глава семейства 15% с первых $23 900 плюс 28% от суммы, превышающей указанную
Состоит в браке, совместное
ведение хозяйства
15% с первых $29 750 плюс 28% от суммы, превышающей указанную
Состоит в браке, раздельное
ведение хозяйства
15% с первых $14 875 плюс 28% от суммы, превышающей указанную

Например, одинокий работник, получающий облагаемый налогом доход в
$20000, платит налоги в сумме 0.15 х $17 850 + 0.28 х ($20 $17 850). Напишите
программу, которая позволяет пользователю указать категорию и облагаемый
налогом доход, после чего вычисляет сумму налога. Используйте цикл, чтобы
пользователь мог вводить разные варианты налогообложения.

Первый вариант получился кривоватым; кроме того, не используется глобальный цикл:

#include <stdio.h>

int main (void)
{

int c; // category
int category; // choosen category
int gross; // gross income
const int b1 = 17850;  // b.. is bracket $
const int b2 = 23900;
const int b3 = 29750;
const int b4 = 14875;
const float rate_1 = 0.15f;
const float rate_2 = 0.28f;
float tax; // tax
float net; // net income

printf("Choose your tax category:\n");

printf("1) Single: \
(15%% of first $17,850 plus 28%% of excess\n");
printf("2) Head of Household: \
15%% of first $23,900 plus 28%% of excess\n");
printf("3) Married, Joint: \
15%% of first $29,750 plus 28%% of excess\n");
printf("4) Married, Separate: \
15%% of first $14,875 plus 28%% of excess\n");
printf("5) Quit\n");

scanf("%d", &c);

while (!(c < 5) && !(c > 0))
{   while (getchar() != '\n')
        ;                     // ; flush buffer
    scanf("%d", &c);
}
switch(c)
{
    case 1:
    { category = 1;
        break; }
    case 2:
    { category = 2;
        break; }
    case 3:
    { category = 3;
        break; }
    case 4:
    { category = 4;
        break; }
    case 5:
        goto end;
}

printf("Enter your gross income:\n");

while (scanf("%d", &gross) == 1)
{
    if (category == 1)
        if (gross <= b1)
            tax = gross * rate_1;
        else
            tax = (b1 * rate_1) + ((gross - b1)*rate_2);
    if (category == 2)
        if (gross <= b2)
            tax = gross * rate_1;
        else
            tax = (b2 * rate_1) + ((gross - b2)*rate_2);
    if (category == 3)
        if (gross <= b3)
            tax = gross * rate_1;
        else
            tax = (b3 * rate_1) + ((gross - b3)*rate_2);
    if (category == 4)
        if (gross <= b4)
            tax = gross * rate_1;
        else
            tax = (b4 * rate_1) + ((gross - b4)*rate_2);

    net = gross - tax;

    printf("Gross: %d; tax: %.0f; net: %.0f\n",
            gross, tax, net);
    printf("Enter another income of 'q' to quit:\n");
}

end: printf("Bye!");    // goto category 5 choice to quit

getchar(); getchar();

return 0;
}

Второй вариант (отступы съехали децл):

#include <stdio.h>

int main (void)
{

int category; // category
int bracket; // choosen category
int gross; // gross income
const int b1 = 17850;  // b.. is bracket $
const int b2 = 23900;
const int b3 = 29750;
const int b4 = 14875;
const float rate_1 = 0.15f;
const float rate_2 = 0.28f;
float tax;
float net; // net income
int flag; // "continue MAIN LOOP?" flag

do { // MAIN LOOP start

printf("Choose your tax category:\n");

printf("1) Single: \
(15%% of first $17,850 plus 28%% of excess\n");
printf("2) Head of Household: \
15%% of first $23,900 plus 28%% of excess\n");
printf("3) Married, Joint: \
15%% of first $29,750 plus 28%% of excess\n");
printf("4) Married, Separate: \
15%% of first $14,875 plus 28%% of excess\n");
printf("5) Quit\n");

scanf("%d", &category);

while (!(category < 5) && !(category > 0))
{   while (getchar() != '\n')
        ;                     // ; flush buffer
    scanf("%d", &category);
}
switch(category)
{
    case 1:
    { bracket = b1;
        break; }
    case 2:
    { bracket = b2;
        break; }
    case 3:
    { bracket = b3;
        break; }
    case 4:
    { bracket = b4;
        break; }
    case 5:
        goto end;
}

printf("Enter your gross income:\n");

while (scanf("%d", &gross) != 1)
    while (getchar() != '\n')  // flush buffer
	    continue;
if (gross <= bracket)
    tax = gross * rate_1;
else
tax = (bracket * rate_1) + ((gross - bracket)*rate_2);

net = gross - tax;

printf("Gross: %d; tax: %.0f; net: %.0f\n",
       gross, tax, net);
while (getchar() != '\n')  // flush buffer
	continue;

printf("Make another calculation (y) or any key to quit\n");

if (getchar() == 'y')
    flag = 1;

} while (flag == 1);  // MAIN LOOP end

end: printf("Bye!");

getchar(); getchar();

return 0;
}

11. Компания АВС Mail Order Grocery продает артишоки по цене $2.05 за фунт, свеклу по $1.15 за фунт и морковь по $1.09 за фунт. До добавления затрат на доставку компания предоставляет скидку 5% на заказы на сумму $100 и выше. Затраты составляют $6.50 за доставку и обработку заказа весом в 5 фунтов или менее, $14.00 за обработку и доставку заказа весом от 5 до 20 фунтов и $14.00 плюс $0.50 за каждый фунт для доставки заказа с весом, превышающим 20 фунтов. Напишите программу, которая использует оператор swi tch в цикле так, что в ответ на ввода пользователь получает возможность указать желаемый вес артишоков в фунтах; в ответ на ввод b — вес свеклы в фунтах; в ответ на ввод c — вес моркови в фунтах; а в ответ на ввод q — завершить процесс заказа. Программа должна вести учет сумм нарастающим итогом. То есть если пользователь вводит 4 фунта свеклы и позже вводит еще 5 фунтов свеклы, программа должна сообщать о заказе 9 фунтов свеклы. Затем программа должна вычислить общие затраты, скидку, если есть, расходы на доставку и полную сумму заказа. Далее программа должна отобразить всю информацию о покупке: стоимость фунта товара, количество заказанных фунтов, стоимость каждого заказанного вида овощей, общую стоимость заказа, скидку (если есть), затраты на доставку и итоговую сумму заказа с учетом всех затрат.

Удивительно. В этой программе я впервые столкнулся с тем, что неправильно понял «заказчика» (условие задачи). В итоге уже пару раз пришлось все переделывать — сначала я использовать цифры 123, вместо abc (соответственно проверки все кривые), затем меня проглючило и я в меню заказа на q повесил выход из программы (а не из заказа!), почему-то у меня в голове было именно такое (не по ТЗ) условие задачи. В общем, еще раз получил по голове за лень — надо четко прописывать алгоритм программы на бумажке — в строгом соответствии с ТЗ. Иначе потом переделывать замучаешься… Ну.. Тяжело в учении, легко в бою 😉

Также я специально эту и предыдущие две программы пишу через разные лупы (петли.. циклы), чтобы потренироваться. Итак, код:

#include <stdio.h>

#define ARTICHOKE  2.05 // $ price per lb
#define BEET       1.15 // $ price per lb
#define CARROT     1.09 // $ price per lb
#define DISCOUNT   0.95  // % for >= 100$
#define SHIPPING_1 6.5  // $ for 5-20 pounds (lb)
#define SHIPPING_2 0.5  // $ per pound for 20+ pounds

void flush_buffer (void);

int main (void)
{

char menu;        // menu options abcq
float product;   // product choice menu
float weight;
float artichoke = 0.0; // weight
float beet = 0.0;
float carrot = 0.0;
float artichoke_price;
float beet_price;
float carrot_price;
float total;  // $ for order without delivery
float sum_weight;
float delivery = 0.0;
float pay;    // price for everything

 printf("Which vegetable you wish to buy?\n");
 printf("a) Artichoke 2.05$\nb) Beet 1.15$\nc) Carrot 1.09$\
 \nq) Finish order\n");

while ((menu = getchar ()) != 'q')
{
 if (menu == '\n')  // to flush space after abc were
    continue;       // choosen (so 'q' will work)

 if (menu != 'a' && menu != 'b' && menu != 'c' && menu != 'q')
    flush_buffer();

 switch (menu)
 {
    case 'a':
      { printf("How much pounds?\n");
        if (scanf("%f", &weight) != 1 || weight < 0)
            flush_buffer();
        artichoke += weight;
        break; }
    case 'b':
      { printf("How much pounds?\n");
        if (scanf("%f", &weight) != 1 || weight < 0)
            flush_buffer();
        beet += weight;
        break; }
    case 'c':
      { printf("How much pounds?\n");
        if (scanf("%f", &weight) != 1 || weight < 0)
            flush_buffer();
        carrot += weight;
        break; }
 }  // switch

 printf("Which vegetable you wish to buy?\n");
 printf("a) Artichoke 2.05$\nb) Beet 1.15$\nc) Carrot 1.09$\
 \nq) Finish order\n");

}  // while

artichoke_price = artichoke*ARTICHOKE;
beet_price = beet*BEET;
carrot_price = carrot*CARROT;

total = artichoke_price + beet_price + carrot_price;

if (total >= 100.0) // discount
    total *= DISCOUNT;

sum_weight = artichoke + beet + carrot;

if (sum_weight <= 5.0 && sum_weight > 0.0)
    delivery = 6.5;
if (sum_weight > 5.0 && sum_weight <= 20.0)
    delivery = 14.0;
if (sum_weight > 20.0)
    delivery = 14.0 + ((sum_weight - 20.0)*0.5);

pay = total + delivery;

printf("You've ordered:\n");

if (artichoke != 0.0)
    printf("%.1f lb artichoke for %.1f$ (%.2f$ per 1 lb)\n",
    artichoke, artichoke_price, ARTICHOKE);
if (beet != 0.0)
    printf("%.1f lb beet for %.1f$ (%.2f$ per 1 lb)\n",
    beet, beet_price, BEET);
if (carrot != 0.0)
    printf("%.1f lb carrot for %.1f$ (%.2f$ per 1 lb)\n",
    carrot, carrot_price, CARROT);

printf("Cost of vegetables: %.1f$ ", total);
if (total >= 100.0) // note about discount
    printf ("(with discount 5%)");
printf("\n");
if (delivery != 0.0)
printf("Delivery will cost: %.1f$\n", delivery);
printf("Total order cost: %.1f$ ", pay);

getchar(); getchar();

return 0;

}  // main

void flush_buffer (void)
{
    while (getchar () != '\n')
        return;
}

Вообще, эта последняя программы была весьма непростой. Много всяких тонкостей, связанных с корректным выходом из цикла. Так как автор книги написал, что goto лучше не использовать (кроме вывода ошибок и других экстренных случаев), я старался к нему не прибегать, что привело к некоторым сложностям. Но в итоге, все работает! %)

Буду рад вашим комментариям!


Запись опубликована в рубрике С (Си). Добавьте в закладки постоянную ссылку.

3 комментария на «[Язык C] Упражнения по программированию (глава 7)»

  1. Евгений говорит:

    Привет.
    7 задание с ошибкой.
    Пересмотри пожалуйста подсчёт премии за переработку.

    И проблема с часами и оплатой если вводишь 80 часов.

    • Евгений говорит:

      Не с часами все нормально. Скобки забыл поставить.
      А вот премия,должна начислятся только на часы,которые выше 40.
      40 часов по нормальному тарафу идут.
      Пересмотр.
      Мой вариант:

      while((scanf(«%d»,&stunden)) == 1)
      {
      total = (float)stunden * LOHN;// общая сумма заработка

      if(stunden > ARBEITSWOCHE)
      {
      uberstunden = stunden — ARBEITSWOCHE;
      premie = uberstunden * PREMIE;
      total += premie;
      }
      ….
      Как-то так должно быть.

  2. Евгений говорит:

    Привет
    Мой вариант 8 задания:

    #include
    #include

    //Зарплата/час
    #define LOHN_8 8.75
    #define LOHN_9 9.33
    #define LOHN_10 10.00
    #define LOHN_11 11.20

    #define ARBEITSWOCHE 40 //рабочая неделя

    #define PREMIE 1.5 //Коэффициент за переработку 40 часов
    #define STEUERSTUFE1 300 //Налоговая сумма
    #define STEUERSTUFE2 150 //Налоговая сумма

    #define STEUER1 0.15 //Налог на прибыль до 300€
    #define STEUER2 0.20 //Налог на следующие 150€
    #define STEUER3 0.25 //Налог на остаток

    //Функция общёта

    int lohn(float lohn){

    int stunden = 0, uberstunden = 0;
    float total = 0.00, steuer = 0.00, netto = 0, premie = 0;

    printf(«Введите кол-во часов за неделю:\n»);

    scanf(«%d»,&stunden);

    total = (float)stunden * lohn;// общая сумма заработка

    if(stunden > ARBEITSWOCHE)
    {
    uberstunden = stunden — ARBEITSWOCHE;
    premie = uberstunden * PREMIE;
    total += premie;
    }

    if(total STEUERSTUFE1 && total = STEUERSTUFE1 + STEUERSTUFE2)
    {
    steuer = STEUERSTUFE1 * STEUER1;
    steuer += (STEUERSTUFE2 * STEUER2);
    steuer += ((total — (STEUERSTUFE1 + STEUERSTUFE2)) * STEUER3);
    }

    netto = total — steuer;

    printf(«Общая сумма заработка: %.2f.\n», total);
    printf(«Налог от суммы: %.2f.\n»,steuer);
    printf(«Сумма на руки: %.2f.\n»,netto);

    return 1;
    }

    int main(void){

    float stundenlohn = 0.0;
    int numer = 0;
    bool flag = 0;

    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);

    while((scanf(«%d»,&numer)) == 1 )
    {
    while(getchar() != ‘\n’)
    continue;
    if(numer 5)
    {
    printf(«Введите диапазон от 1 до 5.\n»);
    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);
    continue;
    }
    switch(numer)
    {
    case 1 :
    printf(«Ваш тариф: %d — 8.75$/час.\n»,numer);
    break;
    case 2 :
    printf(«Ваш тариф: %d — 9.33$/час.\n»,numer);
    break;
    case 3 :
    printf(«Ваш тариф: %d — 10.00$/час.\n»,numer);
    break;
    case 4 :
    printf(«Ваш тариф: %d — 11.20$/час.\n»,numer);
    break;
    case 5 :
    printf(«Спасибо. До следующего раза.\n»);
    break;
    default:
    printf(«Что-то пошло не так!\n»);
    break;
    }
    switch(numer)
    {
    case 1:
    stundenlohn = LOHN_8;
    flag = lohn(stundenlohn);
    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);
    break;
    case 2:
    stundenlohn = LOHN_9;
    flag = lohn(stundenlohn);
    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);
    break;
    case 3:
    stundenlohn = LOHN_10;
    flag = lohn(stundenlohn);
    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);
    break;
    case 4:
    stundenlohn = LOHN_11;
    flag = lohn(stundenlohn);
    printf(» Выберите ваш тариф. \n»);
    printf(» 1) 8.75$/час 2) 9.33$/час \n»);
    printf(» 3) 10.00$/час 4) 11.20$/час \n»);
    printf(» 5) Выход из программы. \n»);
    break;

    case 5 :
    goto end;
    break;
    }
    }
    end:
    return 0;

    }

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.