Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. Be of ... pattern: All contactorsare of the double break pattern
  2. Double dubFuelCell2Amperes();
  3. Double-bind relationship between the source text and the target text
  4. Etymological Doublets
  5. Find the etymological doublets in the sentences.
  6. GRAMMATICAL DOUBLETS

Return 0;

}

 

Сначала препроцессору (на это указывает # в первой позиции) даётся команда: включить в текст нашей программы содержимого заголовочного файла stdio.h. Этот файл содержит прототипы стандартных функций ввода/вывода (st andar di nput/ o tput). Зачем? Увидим дальше, при выполнении упраженений. Нельзя говорить, что этой инструкцией подключется стандартная библиотека. Она подключается всегда!

Далее описывается главная (main) функция. Она возвращает целое число (int) в операционную систему. В нашем примере возвращается 0 (return 0;). Это число могут анализировать командные файлы и в зависимости от его значения принимать решение о вызове других программ. Обычно 0 означет нормальное завершение, а ненулевое число свидетельствет об аномалих в работе программы (например, программа должна открыть файл для чтения, а файла на диске нет). Функция main должна присутствовать всегда. С неё начинается выполнение программы.

Единственная содержательная строка в нашей простейшей программы, вызов функции puts (puts tring – вывести строку). Эта функция стнадартной библиотеки. Она выводит на экран строку и осуществляет переход на новую строку.

 

6) Этапы обработки программы: препроцессорная обработка (выполняются директивы, которые начинаются с #), компиляция – compiling (получение объектного файла greeting.obj), компоновка – linking (в частности, присоединение кода библиотечных функций, в нашем случае puts). В результате получаем hello.exe.

Build → Build hello (Можно и Build → Build Solution, т.к. наше «решение» состоит из одного проекта).

Появляется сообщение

------ Build started: Project: hello, Configuration: Debug Win32 ------

Compiling...

Greeting.c

Compiling manifest to resources...

Linking...

Embedding manifest...

Build log was saved at "file://d:\projects\hello\hello\Debug\BuildLog.htm"

Hello - 0 error(s), 0 warning(s)

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

 

В нашем случае нет ни ошибок, ни предупреждений.

 

7) Запуск программы на выполнение

Debug → Start Without Debugging

Появляется консольное окно. В нём

Hello, world!

Для продолжения нажмите любую клавишу...

 

3. Как делать копии экранов для отчёта

Установить мышь на заголовке консольного окна.

Нажать правую кнопку мыши.

Появляется контекстное меню.

Выбираем Изменить → Пометить

Красим мышью и нажимаем Enter (вывод помешается в буфер)

Вставляем в документ Word (Ctrl+V).

 

4. Понимание роли заголовочного файла.

Выполним серию заданий

1) Закомментируем первую строку программы

//#include <stdio.h>

Build → Build hello. Можно коротко F7.

----- Build started: Project: hello, Configuration: Debug Win32 ------

Compiling...

Greeting.c

d:\projects\hello\hello\greeting.c(5): warning C4013: 'puts' undefined; assuming extern returning int

Linking...

Embedding manifest...

Build log was saved at "file://d:\projects\hello\hello\Debug\BuildLog.htm"

Hello - 0 error(s), 1 warning(s)

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

 

Мы получили предупреждение: функция puts не определена. Всё равно запускаем программу

Debug → Start Without Debugging. Можно коротко Ctrl+F5.

Программа работает правильно. Вывод: и при отсутствии заголовочного файла стандартная библиотека подключается.

 

2) Сделаем ошибку: вызовем puts с двумя аргументами

puts("Hello", "world!");

Сообщения при компиляции те же. Но выводится только первое слово. Это ошибка!

 

3) Вернём строку #include <stdio.h> (снимем символ комментария – два слэша)

warning C4020: 'puts': too many actual parameters

слишком много аргументов.

Как компилятор узнал об этом? Для этого надо в папке Include найти файл stdio.h и посмотреть его содержимое. Но мы поступим проще: поставим курсор на вызов функции puts и нажмём правую кнопку мыши. Выберем пункт контекстного меню Go to definition. В отдельной вкладке открывается файл stdio.h. Мы видим прототип функции puts.

_CRTIMP __checkReturn_opt int __cdecl puts(__in_z const char * _Str);

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

 

4. Как выводить русские сообщения

1) Попробуем вывести на экран русский текст

puts("Привет!");

на экране:

╧ЁштхЄ!

Только восклицательный знак выводится правильно.

Научное объяснение такое. При вводе текста программы используется кодировка cp1251 (Windows), а при выводе на экран кодировка cp866 (MS DOS). Английские буквы там кодируются одинаково, а русские – нет.

 

2) Первое решение: перенаправление вывода в файл

Project → hello Properties, раскрыть Configuration Properties → Debugging → Command Arguments. Вводим > out.txt. Символ > означает перенаправление вывода на экран в файл. Имя файла, разумеется, любое. Расширение.txt.

F7, Ctrl+F5

File → Open → File. Выбираем в окне out.txt. В файле всё отображается

Но это решение не подходит для программ, которые проводят диалог с пользователем.

Уберём перенаправление вывода в файл.

 

3) Использование локализации

#include <stdio.h>

#include <locale.h>

int main() {

setlocale(LC_ALL, "rus");

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

Return 0;

}

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

 

 

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

алгоритм

дано

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 → Save as).

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

– Project → Add Existing Item

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

 

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);

осуществляет ввод с клавиатуры числа (scanf ormatting – форматное сканирование строки ввода). Первый аргумент – как вводить: lf – l ong f loat – плавающее число с двойной точностью. Второй аргумент – что вводить: переменную 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


Дата добавления: 2015-10-26; просмотров: 74 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Определение по карте расстояний и координат точек| Взаимодействие с семьей и социальными партнерами.

mybiblioteka.su - 2015-2024 год. (0.021 сек.)