Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Plan_pervogo_zanyatia (1).doc
Скачиваний:
4
Добавлен:
26.03.2016
Размер:
113.66 Кб
Скачать

Int main() {

setlocale(LC_ALL, "rus");

printf("Привет!\n");

return 0;

}

Для разнообразиявместоputsиспользована функцияprintf(printformatted– форматная печать). Автоматического перевода на новую строку эта функция не делает, поэтому в строку введён специальный символ\n– перевод на новую строку (newline).

Второй проект – решение квадратного уравнения

алгоритм

дано

a,b,c– коэффициенты квадратного уравнения

надо

действительные корни или сообщение «корней нет».

действия

вычислить дискриминант

еслито

сообщение «корней нет»

иначе

вывод .

Это плохой алгоритм. Например, если , то он работает неверно. Хорошо бы выделить случай. Хорошо бы выводить комплексные корни. Есть и более тонкие недостатки, связанные с выбором формул для вычисления корней. Как ни странно, но формулы, приводимые в школьных учебниках, не лучший выбор для численного решения квадратного уравнения! Но это относится к дисциплине «Методы вычислений». Не будем усложнять!

5. Элементарные типы данных

int– целое число (4 байта),

char– символ,

float– плавающее число одинарной точности (4 байта),

double– плавающее число двойной точности (8 байтов)

Принимаем решение: все переменные имеют тип double. Никогда не выбирайтеfloat! Из-за малого количества разрядов вычисления сfloatбыстро становятся катастрофически неточными.

6. Создание проекта

Создаём новый проект с именем quadeq.

Новый элемент создавать не будем, хотелось бы воспользоваться файлом greeting.c.

Выполним, например, такую последовательность действий.

  • Открыть файл greeting.c

  • Сохранить его с именем quad.cв папкеquadeq\quadeq(File→Saveas).

  • Хотя файл в нужной папке, в проект он ещё не включён.

  • Project → Add Existing Item

  • В диалоговом окне щёлкаем файл quad.c. Он подключается к проекту. Это видно в левом окнеSolutionExplorer.

7. Форматный ввод и вывод

Скорректируем нашу первую программу

#include <stdio.h>

#include <locale.h>

Int main() {

double a, b, c, discriminant, x1, x2;

setlocale(LC_ALL, "rus");

setlocale(LC_NUMERIC, "eng");

printf("Решение квадратного уравнения ax^2 + bx + c = 0\n"

"Введите коэффициенты\n"

"a = ");

scanf("%lf", &a);

printf("b = ");

scanf("%lf", &b);

printf("c = ");

scanf("%lf", &c);

printf("\nКвадратное уравнение %fx^2 + %fx + %f = 0\n",

a, b, c);

return 0;

}

Пока вычислений нет. Прокомментируем строки.

Для того чтобы вводить коэффициенты с десятичной точкой, а не запятой, используем

setlocale(LC_NUMERIC, "eng");

В команде

printf("Решение квадратного уравнения ax^2 + bx + c = 0\n"

"Введите коэффициенты\n"

"a = ");

длинная форматная строка разбита на три. На этапе компиляции они склеятся в одну строку.

Команда

scanf("%lf", &a);

осуществляет ввод с клавиатуры числа (scan formatting – форматное сканирование строки ввода). Первый аргумент – как вводить: lf – long float – плавающее число с двойной точностью. Второй аргумент – что вводить: переменную a. На самом деле, не переменную a, а её адрес &a. Этот тонкий момент будет детально разъяснён намного позже, когда будем изучать указатели. Сейчас придётся запомнить, что перед простыми переменными в функции scanf нужно ставить амперсенд.

Команда

printf("\nКвадратное уравнение %fx^2 + %fx + %f = 0\n",

a, b, c);

выводит квадратное уравнение. Первый аргумент: каквыводить, остальные –чтовыводить. На этот раз спецификатор вывода%f. Можно было и%lf поставить с тем же эффектом.

Нажимем F7. Получаем 6 предупреждений. С ними всегда надо внимательно разбираться.

Начнём с последних трёх предупреждениям:

warning C4101: 'x2' : unreferenced local variable

warning C4101: 'discriminant' : unreferenced local variable

warning C4101: 'x1' : unreferenced local variable

Эти переменные действительно не используются, потому что мы прервали написание программы, чтобы проверить, как работает её первая часть. Поэтому эти предупреждения игнрируем.

Первые три предупреждения относятся к функции scanf.

warning C4996: 'scanf' was declared deprecated

c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : see declaration of 'scanf'

Message: 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

Функция scanfдействительно небезопасна.Microsoftрекомендует использоватьscanf_s. Но мы хотим оставаться в рамках стандартного Си. Чтобы избавиться от этих предупреждений, нужно поместить в программу строку:

#define _CRT_SECURE_NO_WARNINGS

Эта строка должна быть самой первой строкой в файле с исходным текстом. До #include!

Допишем программу

discriminant = b * b - 4.0 * a * c;

if (discriminant < 0.0) {

printf("Корней нет.\n");

return 1;

}

x1 = (-b - sqrt(discriminant)) / (2.0 * a);

x2 = (-b + sqrt(discriminant)) / (2.0 * a);

printf("x1 = %f\nx2 = %f\n", x1, x2);

Обратите внимание на расстановку фигурных скобок в условном операторе. Это стиль Кернигана и Ричи (создателей языка Си). Сокращённо этот стиль называется стиль K&R. Его преимущество ­– на экране помещается больше строк. Другой стиль – стильGNU– требует следующую расстановку:

if (discriminant < 0.0)

{

printf("Корней нет.\n");

return 1;

}

Получаем предупреждение:

warning C4013: 'sqrt' undefined; assuming extern returning int

Нужно поместить в программу прототип функции вычисления квадратного корня sqrt. Для этого в начале поместим директиву

#include <math.h>

Как об этом узнать? Списки функций надо смотреть в справочнике. Help содержит примеры, откуда можно взять необходимую информацию.

И ещё одно важное замечание: те, кто владеет какими-либо системами компьютерной математики, могут написать:

discriminant = b ^ 2 - 4.0 * a * c;

а не

discriminant = b * b - 4.0 * a * c;

Нужно запомнить: Оператор ^ – это не возведение в степень, а битовая операция «исключающее ИЛИ».

После запуска получаем вывод:

1-й тест

Решение квадратного уравнения ax^2 + bx + c=0

Введите коэффициенты

a = 1

b = -5

c = 6

Квадратное уравнение 1.000000x^2 + -5.000000x + 6.000000=0

x1 = 2.000000

x2 = 3.000000

2-й тест

Решение квадратного уравнения ax^2 + bx + c=0

Введите коэффициенты

a = 1

b = 1

c = 1

Квадратное уравнение 1.000000x^2 + 1.000000x + 1.000000=0

Корней нет.

8. Условная компиляция.

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

Программа принимает окончательный вид:

#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>

#include <locale.h>

#include <math.h>

#define DEBUG 1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]