Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?
» » » Простые программы на языке Си++

Реклама


Простые программы на языке Си++

Просмотров: 3841 Автор: admin

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

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

В пособии приведены различные задачи для программирования. Определены 16 тем, в каждой более 30-ти заданий, которые одинаковы по уровню сложности. Уровень сложности постепенно возрастает от одной темы к другой. Так, первая тема, это знакомство с базовыми типами данных, вторая, это использование условного оператора, и так далее по возрастанию уровня. Такая методика позволяет выработать технику программирования для начинающих. Для тех, кто знаком с основными приемами программирования, можно рекомендовать эти задачи для закрепления и развития навыков. Большинство задач разработано авторами, но многие собраны из различных источников, в том числе известных задачников по программированию.

В каждой теме приводится минимум теоретических сведений, но большое количество примеров. В каждом примере назван типовой алгоритм, и приведен код программы с подробными комментариями. Все коды примеров протестированы в среде Borland С++ версии 3.0. Чтение текстов примеров и разбор типовых решений поможет начинающим в освоении практических приемов программирования и выработке стиля. Особый интерес представляют содержательные задачи, в которых постановка задачи выполнена на вербальном уровне, то есть, не формализована. Здесь студент должен самостоятельно осмыслить задачу, выбрать модель, предложить структуру данных и выбрать или разработать алгоритм ее решения. Опыт показывает, что часто именно этот процесс является наиболее трудным.

Учебное пособие консолидирует многолетний опыт работы авторов в преподавании различных курсов программирования на различных языках различному контингенту учащихся.

Пособие предназначено, в первую очередь, для студентов специальности ??? «», изучающих программирование на С (С++). Будет очень полезно для самостоятельного освоения программирования, и, безусловно, будет интересно преподавателям, ведущим различные дисциплины программирования.

Простые программы на языке Си++

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

·          Ввести исходные данные.

·          Выполнить вычисления по формулам.

·          Вывести результат.

Последовательность решения должна складываться из следующих этапов:

1.       Анализ условия задачи.

2.       Определение необходимых входных данных: сколько их будет, какого типа каждое данное, какое имя следует присвоить переменной, обозначающей данное. Тип переменной должен быть определен в объявлении, а имя должно быть значимое, то есть подчеркивать назначение переменной, ее логический смысл.

3.       Определение выходных данных программы: сколько их, какие их типы, как назвать переменные для обозначения результатов.

4.       Определение списка рабочих переменных, если необходимо.

5.       Определение необходимых формул вычисления, их последовательности и правил записи.

6.       Кодирование алгоритма.

При кодировании необходимо:

1.       Объявить все переменные программы.

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

3.       Правильно записать формулы вычислений.

4.       Грамотно оформить вывод результата. Вывод следует дополнить необходимыми заголовками и пояснениями, числовые данные форматировать.

Пример №1. Пусть требуется вычислить длину окружности, площадь круга и объем шара одного и того же радиуса.

1.       Анализ алгоритма показывает, что он линейный.

2.       Входная переменная одна, это значение радиуса, в общем случае величина вещественная. Обозначим его именем r.

3.       Выходных данных три. Обозначим их именами l, s, v. Все имеют вещественный тип.

4.       Формулы вычислений общеизвестны.

// Код программы примера №1.

#include <stdio.h>                  // Библиотека стандартного ввода-вывода.

#include <math.h>                 // Библиотека математических функций.

#define           PI        3.1415926     // Значение константы π.

void main (void)

{

float    r;                                 // Объявление всех переменных.

float    l, s, v;

// Вывод заголовка.

printf ("\nНаходим значение длины окружности, площади круга и объема шара \

указанного радиуса: \n");

printf ("\nВведите значение радиуса:\n");        // Приглашение для ввода данных.

scanf ("%f", &r);                                       // Ввод исходного данного.

// Вычисления по формулам:

           l = 2.*PI*r;

           s = PI*r*r;

           v = 4.*PI*r*r*r / 3.;

// Вывод результатов

printf ("r=%6.2f, l=%6.2f, s=%6.2f, v=%6.2f\n ", r, l, s, v);

}

Распространенными ошибками начинающих программистов являются ошибки, связанные с незнанием информации о типах данных. Объявление переменной в программе указывает ее имя и тип. Тип переменной определяет способ хранения переменной, а именно, сколько памяти выделено для переменной и как ее значение размещено в этом объеме. Также известно, каков диапазон значений, которые может принять переменная, и какие операции можно к ней применить. Способ сохранения переменных вещественного типа (double, float) радикально отличается от способа хранения данных целых типов (int, char). Тип констант, если они есть в тексте программы, определяется их записью, так константа 2 будет целочисленной, а константы 2.0 или 2. будут вещественными. При вычислении значений выражений, в которых смешаны данные разных типов, выполняется преобразование (приведение) типов. Например, если в программе объявлены целочисленные переменные:

int a = 1, b = 2;

float f;

и выполнено деление с присваиванием значения переменной вещественного типа:

f = a / b;

то результат будет равен 0.0, потому что сначала выполняется целочисленное деление, а потом присваивание. Чтобы результат был равен 0.5, нужна запись с использованием явного преобразования типов:

f = (float) a / float (b);

Пример №2. Особенности, связанные с преобразованием типов, рассмотрим на следующем примере. Дано значение угла, измеренное в градусах, минутах и секундах. Требуется перевести значение угла в радианную меру. Формула вычисления .

 

// Код программы примера №2. Программа имеет скрытую ошибку.

#include <stdio.h>

#include <math.h>

void main(void)

{

int       Grad, Min, Sec;                              // Исходные данные всегда целые.

float    GRAD;                                          // Новая переменная для

// вычисления полного значения угла.

float    Rad;                                               // Итоговое значение.

printf ("Введите значение угла в градусах, минутах и секундах:\n");

scanf ("%d%d%d", &Grad, &Min, &Sec);

// Полное значение угла:

           GRAD = Grad + Min / 60 + Sec / 3600;

// Перевод в радианы:

           Rad = Grad * M_PI / 360;             // Константа M_PI объявлена в <math.h>.

printf ("Значение угла в радианах: %12.6f\n",Rad);

}

Для проверки стоит выполнить два тестовых примера, вот их результаты:

 

Введите значение угла в градусах, минутах и секундах:

2 0 0

Значение угла в радианах:                  0.017453

Введите значение угла в градусах, минутах и секундах:

1 59 59

Значение угла в радианах:                  0.008727

 

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

// Код программы примера №2.

// Для устранения ошибки используется явное преобразование типов.

#include <stdio.h>

#include <math.h>

void main(void)

{

int       Grad, Min, Sec;

float    Rad;

float    GRAD;

printf ("Введите значение угла в градусах, минутах и секундах\n");

scanf ("%d%d%d", &Grad, &Min, &Sec);

// Полное значение угла:

           GRAD = (float) Grad + (float) Min /60. + (float) Sec / 3600.;

// Перевод в радианы:

           Rad = GRAD * M_PI/ 360;

printf ("Значение угла в радианах = %12.6f\n",Rad);

}

Пример №3. Рассмотрим особенности вычислений с использованием данных целого типа. Сформулируем содержательную задачу. Пусть для покупки подарков выделена некоторая сумма в рублях. Узнать, сколько можно купить подарков, если известна цена одного подарка, и определить, сколько денег останется. Наоборот, если нужно купить N подарков, то найти наибольшую стоимость одного подарка, и сколько останется денег.

// Код программы примера №3. Решение в целых числах.

#include <stdio.h>

void main (void)

{

int       Sum;                           // Выделена сумма денег.

int       Cost;                           // Стоит один подарок.

int       Cou;                            // Количество, которое можно купить на эту сумму.

int       N;                                // Количество, которое хочется купить.

int       Rest;                            // Останется денег.

printf ("Введите сумму, которой Вы располагаете, и стоимость одного подарка\n");

scanf ("%d%d", &Sum, &Cost);

// Найдем количество и остаток:

           Cou = Sum / Cost;     // Целочисленное деление.

           Rest = Sum % Cost;  // Остаток от деления.

printf ("Можно купить %d подарков, останется %d рублей.\n", Cou, Rest);

// Найдем стоимость и остаток.

printf ("Введите число подарков, которое хочется купить\n");

scanf ("%d", &N);

           Cost = Sum / N;

           Rest = Sum % N);

printf ("Наибольшая стоимость подарка %d, останется %d рублей.\n", Cost, Rest);

}

Замечание. Операции целочисленного деления и вычисления остатка от деления можно применять только к данным целых типов. Если такие операции нужно выполнить для данных вещественных типов, используются функции ceil, floor, fmod библиотеки <math.h>. Функция ceil округляет вещественное число вверх, функция floor округляет вниз, а функция fmod находит остаток деления по модулю. Все эти функции имеют аргументы типа double и возвращают значение типа double. Приведение типа при переходе к float не обязательно. Рассмотрим тот же пример с использованием вещественного типа данных, а именно, все, что касается денег, будем вычислять в рублях и копейках.

// Код программы примера №3. Решение в вещественных числах.

#include <stdio.h>

#include <math.h>

void main(void)

{

float    Sum;                           // Выделена сумма денег.

float    Cost;                           // Стоит один подарок.

int       Cou;                            // Количество, которое можно купить на эту сумму.

int N;                                      // Количество, которое хочется купить.

float Rest;                               // Останется денег.

printf ("Введите сумму, которой Вы располагаете, и стоимость одного подарка\n");

scanf ("%f%f", &Sum, &Cost);

// Найдем количество и остаток:

           Cou = (int) floor (Sum/Cost);        // Целое число получено округлением вниз.

           Rest = fmod (Sum, Cost);     // Остаток от деления.

printf ("Можно купить %d подарков, останется %6.2f рублей.\n", Cou, Rest);

// Найдем стоимость и остаток.

printf ("Введите число подарков, которое хочется купить\n");

scanf ("%d", &N);

           Cost = Sum / (float) N;

           // Точность вычислений должна быть 0,01.

           Cost = floor (Cost * 100) / 100.;

           Rest = fmod (Sum, Cost);

           // Rest = SumCost * N;     // Аналог предыдущей строки без функции fmod.

printf ("Наибольшая стоимость подарка %6.2f, останется %6.2f рублей.\n", Cost, Rest);

}

Важное замечание. Если этот пример получить как точную копию первого, то хорошо будет работать только первая формула вычислений. Вторая даст ошибку, вызванную наличием погрешности вычислений, которая должна быть менее одной копейки. Для устранения погрешности добавлена строка Cost = floor (Cost * 100)/100.; о смысле которой предлагается подумать читателю.

Варианты заданий

Задание 1. Даны длины катетов прямоугольного треугольника. Найти его острые углы, вывести в градусной мере с точностью до минут. Указание: функция arctg объявлена в библиотеке math.h.

Задание 2. Даны длины катетов прямоугольного треугольника. Найти его периметр и площадь. При выводе округлить до двух знаков.

Задание 3. Дан положительный угол в радианах. Найти, сколько градусов и минут содержит данный угол.

Задание 4. Дано вещественное число. Найти и напечатать его целую, дробную части и округленное значение. Указание: функции округления объявлены в библиотеке math.h.

Задание 5. Камень бросили вверх со скоростью V. Определить расстояние от земли в некоторые моменты времени t1 и t2. Вывести с точностью два знака.

Задание 6. Даны координаты точек A(x1,y1) и B(x2,y2) гиперболы y=k/x+b. Найти и напечатать значения k, b.

Задание 7. Даны значения переменных A и B. Найти частное от деления А на В и частное от деления В на А. Найти остаток от деления А на В и остаток от деления В на А. Найти вещественные значения дробей  и .

Задание 8. От полуночи минутная стрелка описала угол K градусов (целочисленное значение). Определить, какое время (часы, минуты) показывают часы. Указание: использовать операции целочисленного деления.

Задание 9. Даны координаты левой верхней и правой нижней вершин квадрата. Найти длину стороны квадрата, найти длину диагонали, найти координаты точки пересечения диагоналей квадрата.

Задание 10. Две прямые на плоскости проходят через начало координат и точки A(x1,y1) и В(x2,y2). Найти в градусной мере с точностью до градусов угол наклона биссектрисы угла, образованного прямыми.

Задание 11. Дано натуральное четырехзначное число. Найти сумму его цифр. Указание: использовать операции целочисленного деления.

Задание 12. Определить, как наименьшим числом купюр можно выдать сумму К рублей (K<9999), если есть купюры достоинством 1000 руб., 500 руб., 100 руб., 50 руб. и 10 руб. Оставшуюся мелочь выдать рублями.

Задание 13. Камень бросили в колодец, и через t секунд послышался всплеск. Определить расстояние от сруба до воды.

Задание 14. Две прямые на плоскости заданы своими уравнениями. Известно, что они пересекаются. Найти координаты точки пересечения заданных прямых.

Задание 15. Дано натуральное число N , в записи которого ровно пять знаков. Определить цифры, составляющие число. Указание: учесть, что диапазон целочисленных значений (int) 32767.

Задание 16. На плоскости задан треугольник координатами своих вершин. Найти длины сторон треугольника.

Задание 17. Найти скорость камня, брошенного под углом λ к горизонту и пролетевшего b метров за t секунд.

Задание 18. На плоскости заданы два луча, выходящие из начала координат под углами λ и β к оси 0х. Найти в градусной мере с точностью до градусов углы наклона биссектрисы угла, образованного лучами, а также угол между лучами.

Задание 19. Квадрат задан длиной стороны. Найти радиус окружности, площадь которой равна площади этого квадрата.

Задание 20. На плоскости заданы две окружности своими радиусами. Найти процентное соотношение площади первой окружности к площади второй.



Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП