[Язык C] Символьные строки и форматированный ввод-вывод (глава 4)

Четвертая глава в книжке Стивена Прата “C Primer Plus”.

Упражнения по программированию и их решения:

1. Напишите программу, которая запрашивает имя и фамилию, а затем выводит их в формате фамилия, имя.

#include <stdio.h>
int main(void)
{
char name[20], surname[20];
printf("Enter your name and surname:\n");
scanf("%s %s", name, surname);
printf("Your surname is %s, %s", surname, name);
getchar();getchar();
return 0;
}

2. Напишите программу, которая запрашивает имя и выполняет с ним следующие действия:

  1. Выводит его заключенным в двойные кавычки.
  2. Выводит его в поле шириной 20 символов, при этом все поле заключается в
    кавычки, а имя выравнивается по правому краю ноля.
  3. Выводит его с левого края поля шириной 20 символов, при этом все поле заключается в кавычки.
  4. Выводит его в поле шириной, на три символа превышающем длину имени.

#include <stdio.h>
#include <string.h>
int main(void)
{
char name[20];
printf("Enter your name:\n");
scanf("%s", name);
printf("\"%s\"\n", name);
printf("\"%20s\"\n", name);
printf("\"%-20s\"\n", name);
printf("%*s", strlen(name) + 3, name);
getchar();getchar();
return 0;
}

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

  1. Выводом является 21.3 или 2.1e+001.
  2. Вводом является +21.290 или 2.129Е+001.

#include <stdio.h>
int main(void)
{
float num1;
printf("Enter floating-point number:");
scanf("%f", &num1);
printf("You entered: %.1f or %.1e\n", num1, num1);
printf("which is also: %+.3f or %.3E\n", num1, num1);
getchar();getchar();
return 0;
}

4. Напишите программу, которая запрашивает рост в дюймах и имя, после чего отображает полученную информацию в следующей форме:
Ларри, ваш рост составляет 6.208 футов
Используйте тип float, а также операцию деления /. Если хотите, можете запрашивать рост в сантиметрах и отображать его в метрах.

#include <stdio.h>
int main(void)
{
float cm, meters;
char name[20];
printf("Enter your name:\n");
scanf("%s", &name);
printf("Enter your height in cm:\n");
scanf("%f", &cm);
meters = cm / 100;
printf("%s, you height is %.2f meters", name, meters);
getchar();getchar();
return 0;
}

5. Напишите программу, которая запрашивает скорость загрузки в мегабитах в секунду и размер файла в мегабайтах. Программа должна вычислять время загрузки файла. Имейте в виду, что в данном случае один байт равен восьми битам. Используйте тип float, а также операцию деления /. Программа должна выводить все три значения (скорость загрузки, размер файла и время загрузки) с отображением двух цифр справа от десятичной точки, как в следующем выводе:
При скорости загрузки 18.12 мегабит в секунду файл размером 2.20 мегабайт
загружается за 0.97 секунд(ы).

#include <stdio.h>
int main(void)
{
float download_speed_MBits, filesize_MBytes, MBytes_to_Mbits, download_time;
printf("Enter your internet connection speed in Mbits (Mbs):\n", download_speed_MBits);
scanf("%f", &download_speed_MBits);
printf("Enter file size in Mbytes (MB):\n");
scanf("%f", &filesize_MBytes);
MBytes_to_Mbits = filesize_MBytes * 8;
download_time = MBytes_to_Mbits / download_speed_MBits;
printf("Your speed is %.2f Mbs, file size is:%.2f MB. \
It would be downloaded in %.2f seconds",
download_speed_MBits, filesize_MBytes, download_time);
getchar();getchar();
return 0;
}

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

6. Напишите программу, которая запрашивает имя пользователя и его фамилию.
Сделайте так, чтобы о на выводила введенные имена в одной строке и количество символов в каждом слове в следующей строке. Выровняйте каждое количество символов по окончанию соответствующего имени, как показано ниже:
Символьные строки и форматированный ввод-вывод 155
Иван Петров
        4              6

Затем сделайте так, чтобы программа выводила ту же самую информацию , но с
количеством символов, выровненным по началу каждого слова:
Иван Петров
4         6

#include <stdio.h>
#include <string.h>
int main(void)
{
char name[20], surname[20];
printf("Enter your name:\n");
scanf("%s", &name);
printf("Enter your surname:\n");
scanf("%s", &surname);
printf("%s %s\n", name, surname);
printf("%*d %*d\n", strlen(name), strlen(name), strlen(surname), strlen(surname));
printf("%s %s\n", name, surname);
printf("%-*d %-*d\n", strlen(name), strlen(name), strlen(surname), strlen(surname));
getchar();getchar();
return 0;
}

7. Напишите программу, которая присваивает переменной типа double значение 1.0/3.0 и переменной тина float значение 1.0/3.0. Отобразите каждый результат три раза: в первом случае с четырьмя цифрам и справа от десятичной точки, во втором случае с двенадцатью цифрами и в третьем случае с шестнадцатью цифрами. Включите также в программу заголовочный файл float.h и выведите значения FLT_DIG и DBL_DIG. Согласуются ли в введенные значения со значением 1.0/0.3?

#include <stdio.h>
#include <float.h>
int main (void)
{
float numf = 1.0/3.0;
double numd = 1.0/3.0;
printf("float: %.4f; double: %.4f \n", numf, numd);
printf("float: %.12f; double: %.12f \n", numf, numd);
printf("float: %.17f; double: %.17f \n", numf, numd);
printf("%d %d", FLT_DIG, DBL_DIG);
getchar();
return 0;
}

Я специально вывел в конце 17 символов, чтобы показать, что точность double – 16 символов, а дальше идет дичь 🙂

8) Напишите программу, которая предлагает пользователю ввести количество преодоленных миль и количество галлонов израсходованного бензина. Затем эта программа должна рассчитать и отобразить на экране количество миль, пройденных на одном галлоне горючего, с одним знаком после десятичной точки. Далее, учитывая, что один галлон равен приблизительно 3.785 литра, а одна миля составляет 1.609 километра, программа должна перевести значение в милях на галлон в литры на 100 километров (обычную европейскую меру измерения потребления горючего) и вывести результат с одним знаком после десятичной точки. Обратите внимание, что в США принято измерять пробег на единицу горючего (чем выше, тем лучше), в то время как в Европе принято измерять расход топлива на единицу расстояния (чем ниже, тем лучше). Применяйте для этих двух коэффициентов преобразования символические константы (определенные с помощью const или #define).

#include <stdio.h>
int main(void)
{
float miles, gas;
const float km_per_mile = 1.609;
const float litre_per_gallon = 3.785;
float km, litres;
float km_per_litre;
printf("Enter number of miles and number of gas (in gallons)\n");
scanf("%f" "%f", &miles, &gas);
printf("At one gallon of gas you passed %.1f miles\n", miles/gas);
km = miles * km_per_mile;
litres = gas * litre_per_gallon;
km_per_litre = km/litres;
printf("For EU users: at one litre of gas you passed %.1f km\n", km/litres);
printf("For EU users: at 100 litres of gas you passed %.1f km", 100/km_per_litre);
getchar();getchar();
return 0;
}

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

This entry was posted in С (Си). Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *