Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа № 3
Цель работы - изучить процесс построения алгоритмов ветвящихся вычислительных процессов и операторы, используемые при организации программ такого рода, получить практические навыки в составлении программ.
2 Общие сведения
Часто при программировании нужно провести анализ обстановки и выбор варианта действия в зависимости от результата анализа. Указанной цели служат условные операторы.
В С# существует два вида операторов ветвления: условный оператор if и оператор выбора switch.
Формат записи if-инструкции принимает такой вид:
if (условие) {
последовательность инструкций
}
else {
последовательность инструкций
}
Если элемент условие, который представляет собой условное выражение, при вычислении даст значение истина, будет выполнена if-инструкция; в противном случае - else-инструкция (если таковая существует). Обе инструкции одновременно никогда не выполняются. Условное выражение, управляющее выполнением if-оператора, должно иметь тип bool. Схема алгоритма условного оператора представлена на рис. 1.
Вложенные if-операторы образуются в том случае, если в качестве элемента инструкция используется другой if-оператор. Вложенные if-операторы очень популярны в программировании. Главное здесь - помнить, что else-инструкция всегда относится к ближайшей if-инструкции, которая находится внутри того же программного блока, но еще не связана ни с какой другой else-инструкцией.
Оператор switch обеспечивает многонаправленное ветвление. Он позволяет делать выбор одной из множества альтернатив. Хотя многонаправленное ветвление можно реализовать и с помощью последовательности вложенных if-операторов, для многих ситуаций оператор switch оказывается более эффективным решением.
Рисунок 2- Схема алгоритма ветвящегося процесса с оператором switch
Общий формат записи оператора switch имеет вид:
Switch (выражение)
{
case константа1:
последовательность инструкций
break;
case константа2:
последовательность инструкций
break;
case константаЗ:
последовательность инструкций
break;
default:
последовательность инструкций
break;
}
Элемент выражение оператора switch должен иметь целочисленный тип (например, char, byte, short или int) или тип string. Выражения, имеющие тип с плавающей точкой, не разрешены. Очень часто в качестве управляющего switch-выражения используется просто переменная; case-константы должны быть литералами, тип которых совместим с типом заданного выражения. При этом никакие две case-константы в одной switch-операторе не могут иметь идентичных значений. Последовательность инструкций default-ветви выполняется в том случае, если ни одна из заданных case-констант не совпадет с результатом вычисления switch-выражения.
Ветвь default необязательна. Если она отсутствует, то при несовпадении результата выражения ни с одной из case-констант никакое действие выполнено не будет. Если такое совпадение все-таки обнаружится, будут выполнены инструкции, соответствующие данной case-ветви до тех пор, пока не встретится инструкция break или любой другой оператор перехода (goto, return). Оператор switch может быть использован как часть case-последовательности внешнего оператора switch. В этом случае он называется вложенным оператором switch. Необходимо отметить, что case-константы внутренних и внешних операторов switch могут иметь одинаковые значения, при этом никаких конфликтов не возникнет.
Пример 1
Переменные X,Y,Z имеют положительные значения. Присвоить переменной Р значение 1, если можно построить треугольник с длинами сторон X,Y,Z, и О в противном случае.
Решение
В любом треугольнике сумма любых двух сторон всегда больше третьей стороны.
(x+y>z) и
(x+z>y) и
(z+y>x)
Рисунок 3- Схема алгоритма к примеру 1
Листинг к примеру 1
using System;
class lab3z1
{
public static void Main()
{
double x,y,z;
int p;
Console.Write("Enter X ");
x=Convert.ToDouble(Console.ReadLine());
Console.Write("Enter Y ");
y=Convert.ToDouble(Console.ReadLine());
Console.Write("Enter Z ");
z=Convert.ToDouble(Console.ReadLine());
if (((x+y)>z) & ((x+z)>y) & ((z+y)>x)) p=1;
else p=0;
Console.WriteLine("P={0}",p);
}
}
Пример 2
Даны вещественные числа a,b,c. Найти наибольшее из них.
Рисунок 4 - Схема алгоритма к примеру 2
На этой схеме показано, что после ввода трех исходных чисел выполняется сравнение первых двух: a и b. Наибольшее из них присваивается переменной Max. После чего переменная Max сравнивается с переменной c. В том случае, если Max<c, значение Max корректируется заменой его на значение с. В заключении найденное наибольшее значение из трех исходных чисел выводится на экран монитора.
Листинг к примеру 2
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Main()
{
double a, b, c, max;
Console.Write("Enter A: ");
a = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter B: ");
b = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter C: ");
c = Convert.ToDouble(Console.ReadLine());
if (a < b) max = b;
else max = a;
if (c > max) max=c;
Console.WriteLine("{0},{1},{2},{3}", a, b, c, max);
}
}
}
Следует напомнить, что в классе Console существует несколько вариантов методов с именами Write и WriteLine, предназначенных для вывода значений различных типов.
Методы с одинаковыми именами, но разными параметрами называются перегруженными. Компилятор определяет, какой из методов вызван, по типу передаваемых в него величин. Методы вывода в классе Console перегружены для всех встроенных типов данных, кроме того, предусмотрены варианты форматного вывода. В листинге к текущему примеру содержится два наиболее употребительных варианта вызова методов вывода. Первый из них использован в строках:
Console.Write("Enter A: ");
Console.Write("Enter B: ");
Console.Write("Enter C: ");
Это один из способов вывода пояснений, которые представляют собой строковые литералы. Если метод WriteLine вызван с одним параметром, он может быть любого встроенного типа, например, числом, символом или строкой. Если же требуется вывести в каждой строке не одну, а две величины: текстовое пояснение и значение переменной, то прежде чем передавать их для вывода, их требуется «склеить» в одну строку с помощью операции +. Перед объединением строки с числом надо преобразовать число из его внутренней формы представления в последовательность символов, то есть в строку. Преобразование в строку определено во всех стандартных классах С# для этого служит метод ToString( ). Его можно вызвать явным образом:
Console.WriteLine ( "i = " + i.ToString( ) );
Но он также может выполняется и неявно.
В строке:
Console.WriteLine("{0},{1},{2},{3}", a, b, c, max);
используется другой вариант метода WriteLine, который содержит более одного параметра. Параметры нумеруются с нуля, перед выводом они заменяются значениями соответствующих переменных в списке вывода: нулевой параметр заменяется значением первой переменной (в данном примере a), первый параметр второй, переменной (в данном примере b) и т. д.
Из управляющих последовательностей чаще всего используются символы перевода строки (\n) и горизонтальной табуляции (\t).
Простейшие способы ввода с клавиатуры
В классе Console определены методы ввода строки и отдельного символа, но нет методов, которые позволяют непосредственно считывать с клавиатуры числа. Ввод числовых данных выполняется в два этапа:
1. Символы, представляющие собой число, вводятся с клавиатуры в строковую переменную.
2. Выполняется преобразование из строки в переменную соответствующего типа.
Преобразование можно выполнить либо с помощью специального класса Convert, определенного в пространстве имен System, либо с помощью метода Parse, имеющегося в каждом стандартном арифметическом классе. Ниже приведены примеры организации ввода для различных типов данных:
Ввод строки:
Console.WriteLine ( "Введите строку" );
string s = Console.ReadLine ( );
Ввод символа:
Console.WriteLine ( "Введите символ" );
char с = (char) Console.Read ( );
Console.ReadLine( );
Ввод символа выполняется с помощью метода Read, который считывает только один символ из входного потока (оператор 2). Метод возвращает значение типа int, представляющее собой код символа, или -1, если символов во входном потоке нет (например, пользователь нажал клавишу Enter). Поскольку нам требуется не int, а char, а неявного преобразования от int к char не существует, приходится применить операцию явного преобразования типа.
Метод Read, в отличие от ReadLine, не очищает буфер, и, если оператор 3 будет отсутствовать, то следующий после него ввод будет выполняться с того места, на котором закончился предыдущий. Поэтому за оператором 2 записан оператор 3, выполняющий вспомогательные функции. Он считывает остаток строки, тем самым очищая буфер.
Ввод целого числа:
string buf;
Console.WriteLine ( "Введите целое число" );
buf = Console.ReadLine();
int i =Convert.ToInt32( buf );
В приведенном варианте ввода целого числа введеная информация помещается в строковую переменную buf,а затем ее значение с помощью метода Convert.ToInt32 преобразуется в целый тип.
Ввод вещественного числа (при вводе вещественных чисел дробная часть отделяется от целой с помощью запятой, а не точки):
Console.WriteLine ( "Введите вещественное число" );
buf = Console.ReadLine( );
double х = Convert.ToDouble( buf );
или
Console.WriteLine ( "Введите вещественное число" );
buf = Console.ReadLine( );
double у = double.Parse( buf );
Допускается задавать числа с порядком, например, 1,95е-8.
При вводе целых и вещественных чисел используются или методы класса Convert, или метод Parse класса Double библиотеки .NЕТ, который используется здесь через имя типа С# double.
Пример 3
Переменная целого типа I определяет порядковый номер месяца невысокосного года. Оператор Switch по порядковому номеру месяца выводит количество дней в данном месяце.
Листинг к примеру 3
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string buf;
Console.Write("Введите номер месяца: ");
buf = Console.ReadLine();
int a = Convert.ToInt32(buf);
switch (a)
{
case 1: Console.WriteLine ("В месяце 31 день"); break;
case 3: Console.WriteLine ("В месяце 31 день"); break;
case 5: Console.WriteLine ("В месяце 31 день"); break;
case 7: Console.WriteLine ("В месяце 31 день"); break;
case 8: Console.WriteLine ("В месяце 31 день"); break;
case 10: Console.WriteLine ("В месяце 31 день"); break;
case 12: Console.WriteLine ("В месяце 31 день"); break;
case 2: Console.WriteLine ("В месяце 28 дней"); break;
default: Console.WriteLine ("В месяце 30 дней");break;
}
}
}
}
В программе, решающей сформулированную задачу, введенное значение I используется для отыскания требуемого оператора вывода. Выбирается такой оператор Console.WriteLine, перед которым за словом case есть введенное значение I. Поскольку в данной программе нет защиты от некорректной работы пользователя, то любое введенное значение I>12 или I<1 также приведет к выводу следующего сообщения: 'В месяце 30 дней', так как именно оно помещено в ветвь default.
В данном примере I это переменная целого типа, но вместо нее может быть использовано и выражение, выдающее порядковое значение.
Подчеркнем, что значения констант селектора, помещенные в любую ветвь выбора, не следует смешивать с метками операторов для работы с операторами перехода Goto.
3. Варианты заданий для самостоятельной работы
1. Даны целые числа X, Y, Z. Если числа не равны, то заменить каждое из них одним и тем же числом, равным меньшему из исходных, а если равны, то заменить большим из исходных.
2. Даны произвольные числа А, В и С. Если нельзя построить треугольник с такими длинами сторон, то напечатать 0, иначе напечатать 3,2 или 1 в зависимости от того, равносторонний это треугольник, равнобедренный или какой-либо иной.
3. Для заданного а найти корень уравнения f(x)=0, где
2*a*x+abs(a-1) при а>0
f(x)= ex
(1+a2)-1 иначе.
4. Даны числа А, В, С (А<>0). Найти вещественные корни уравнения a*x2+b*x+c=0. Если корней нет, то сообщить об этом.
5. По номеру y (y>0) некоторого года определить с номер его столетия (учесть, что, к примеру, началом 20-го столетия был 1901, а не 1900 год).
6. Вычислить
(max(x,y,z))2-2x*min(x,y,z)
u=
max (x,y,z)/min(x,y,z)
x,y,z- заданы.
7. Считая, что стандартные функции SIN и COS применимы только к аргументам на отрезке [0,PI/2], вычислить y=sin(x) для произвольного числа х.
Формулы приведения:
sin(x)=sin(pi-x)
sin(x)=cos(pi/2-x)
sin(x)=sin(2*pi*n+x)
n-произвольное целое число.
8. Значения переменных А, В, С поменять местами так, чтобы оказалось А>=В>=С. Переменные А, В, С заданы.
9. Даны числа а,b,с,d,e,f. Напечатать координаты точки пересечения прямых, описываемых уравнениями a*х+b*y=c и d*х+e*y=f, либо сообщить, что эти прямые совпадают, не пересекаются или вовсе не существуют.
10. Даны координаты точки (x,y). Определить, в каком квадранте находится точка, и напечатать номер квадранта.
11. Определить, являются ли значения целочисленных переменных N и М кратными 3. Если оба значения кратны 3, то вычислить их сумму, в противном случае разность.
12. Вычислить
а1, если х<в1
Q = а2, если в1<=х<в2
а3, если в2<=х<в3
а4, если в3<=х
____
а1= - \/х+в1
а2=-1/(х+b2);
a3=-b3*b2 ;
a4=b1+b3; , если x, b1, b2, b3 заданы.
13. Определить, являются ли значения целочисленных переменных N и М кратными 3. Если оба значения кратны 3, то вычислить их сумму, в противном случае разность.
14. Даны значения a, b, c (a2<>0). Определить, имеет ли уравнение a*x2+b*x+c действительные корни. Если нет, то выдать соответствующее сообщение.
15. Даны вещественные числа a,b,c и m. Если a<b<c>m, то каждое число заменить наибольшим из них.
16. Даны вещественные x и y. Если x и y отрицательны, то каждое значение заменить его модулем. Если отрицательно одно из них, то оба значения увеличить на 0.5.
17. Даны вещественные x и y. Если оба значения неотрицательны и одно из них не принадлежит отрезку [0.5;2.5], то оба значения уменьшить в 10 раз. В остальных случаях x и y оставить без изменения.
18. Даны значения x, y и z. Выбрать те из них, которые принадлежат интервалу (1;3).
19. Даны значения a и b. Меньшее из двух заменить их полусуммой, а большее их удвоенным произведением.
20. Даны значения a, b и c. Возвести в квадрат те из них, значения которых неотрицательны.
21. Даны значения a, b и c. Проверить, выполняются ли неравенства a>b>с или a<b<c. Выдать соответствующие сообщения.
22. Даны значения a, b и c. Удвоить эти числа, если a>b>c, и заменить их абсолютными значениями, если это не так.
23. Даны действительные числа a1,b1,c1, a2,b2,c2. Проверить условие a1*b2 a2*b1> 0.0001, при котором система совместна и имеет единственное решение. Найти это решение.
24. Даны действительные числа x1,x2,x3, y1,y2,y3. Принадлежит ли начало координат треугольнику с вершинами (x1,y1), (x2,y2), (x3,y3)?
25. Даны действительные числа a, b, c и x, y. Выяснить, пройдет ли кирпич с ребрами a,b,c в прямоугольное отверстие со сторонами x и y.
26. Определить, является ли данное целое число к четным?
27. Даны числа a, b, c, d, составляющие четырехзначное число. Определить, все ли четыре цифры различны.
28. Даны целые числа K, L. Если числа не равны, то заменить каждое из них одним и тем же числом, равным большему из исходных, а если равны, то заменить нулями.
29. Даны значения переменных x,y. Выяснить, принадлежит ли точка (x,y) кругу единичного радиуса с центром в начале координат.
30. Выяснить, принадлежит ли точка с координатами (x,y) квадрату со стороной единица и с центром в начале координат.
31. Выяснить, принадлежит ли точка с координатами (x,y) пересечению окружности x2+y2=1 и параболы y=x2 .
32. Выяснить, принадлежит ли точка с координатами (x,y) пересечению окружности x2+y2=1 и прямой y=x/2 в своей нижней части.
33. Если значение переменной W не равно О и котангенс от W меньше 0.5, то поменять знак W. В противном случае W присвоить 1.
34. Даны значения x, y и z. Выбрать те из них, которые принадлежат интервалу (1;3).
35. Даны значения a и b. Меньшее из двух заменить их полусуммой, а большее их удвоенным произведением.
36. Даны значения a,b и c. Проверить, выполняются ли неравенства a>b>с или a<b<c. Выдать соответствующие сообщения.
37. Даны значения a,b и c. Удвоить эти числа, если a>b>c, и заменить их абсолютными значениями, если это не так.
38. Определить, будет ли остаток при делении целых чисел i и j, равен одному из заданных значений a и b.
39. Дано четырехзначное число. Определить, все ли четыре цифры различны.
40. Даны целые числа K,L. Если числа не равны, то заменить каждое из них одним и тем же числом, равным большему из исходных, а если равны, то заменить нулями.
41. Даны действительные числа x,y,z. Вычислить
max(x,y,z)2-min(x,y,z).
42. Даны действительные числа a,b,c.
Max(a,b,c) при a>b;
Вычислить: z= min(a,b,c) при b<c;
min(a,b)*max(a,c) иначе.
43. Даны значения переменных x,y. Выяснить, принадлежит ли точка c координатами (x,y) кругу единичного радиуса с центром в точке с координатами (v,z).
44. Выяснить, принадлежит ли точка с координатами (x,y) квадрату со стороной единица и с центром в точке с координатами (v,z).
45. Даны действительные числа a,b,c,d. Если a>b>c>d, то числа оставить без изменения. В противном случае значение a должно стать максимальным из всех значений.
46. Определить, является ли данное целое число X нечетным?
47. Дано пятизначное число. По признаку деления определить, делится ли число на 3.
48. Даны целые числа X, Y, Z. Если числа не равны, то заменить каждое из них одним и тем же числом, равным меньшему из исходных, а если равны, то заменить большим из исходных.
49. Даны действительные числа x,y,z.
Вычислить min(x,y,z)/(max(x,y,z)*3).
50. Дана точка с координатами (X,Y,Z). Определить, находится ли она внутри сферы с центром (2,3,4) и радиусом 3.
51. Даны точки A и B с координатами (X1,Y1) и (X2,Y2). Найти тангенс угла, образованного прямой AB и осью Y.
52. Дана точка с координатами (X,Y,Z). Определить длину окружности, проходящей через эту точку и начало координат.
4. Содержание отчета
4.1. Наименование и цель работы.
4.2. Индивидуальное задание на лабораторную работу.
4.3. Схема алгоритма решения задачи.
4.4. Текст программы на алгоритмическом языке.
4.5. Результаты вычислений.
Литература
PAGE \* MERGEFORMAT 25