Читайте также: |
|
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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Определение по карте расстояний и координат точек | | | Взаимодействие с семьей и социальными партнерами. |