Форум программистов, компьютерный форум CyberForum.ru

Как правильно оформлять модули? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ sort_array http://www.cyberforum.ru/cpp-beginners/thread241009.html
Всем форумчанам доброго времени суток!!Есть такая задача:реализовать меню,дающее пользователю выбрать сортировку массива по желанию(выбор,вставка или обмен) и направление(возрастание или убывание).,т.е.в программе нужно отобразить все три сортировки.Как это лучше сделать,через оператор switch?Зараннее благодарен за помощь.
C++ Решить уравнение с точностю Е и указать необходимое число итераций Нужно решить уравнение с точностю Е и указать необходимое число итераций. Ниже все даные, што у меня есть. Язык С, не С++. Буду очень благодарен если поможете. немного ошибся в формулє, в знаменателе должно быть 10+(!)e^Xn http://www.cyberforum.ru/cpp-beginners/thread241007.html
C++ Определить, является ли введенная с клавиатуры строка вещественным числом
Написать программу, которая проверяет, является ли введенная с клавиатуры строка вещественным числом. Если является, то программа должна сообщить в какой форме записано данное число, в фиксированной или экспоненциальной.
C++ Квадратная матрица
//Дана квадратная матрица порядка n (n строк, n столбцов). //Найти наибольшее из значений элементов, расположенных в тёмно-синих частях матриц. //и вывести на экран его расположение в матрице. //рисунок во вложенных файлах PLS!!! #include <iostream> #include<iomanip> #include <time.h> using namespace std; void main(){
C++ Debugging symbols Visual C++ 6 http://www.cyberforum.ru/cpp-beginners/thread240990.html
При отладке пишет Loaded 'ntdll.dll', no matching symbolic information foundи т. д. только с другими библиотеками. Отладочные символы скачал от сюда, 2008 студии показал папку с символами и почти все работает... А в шестой утилита Windows NT Symbols Setup, пишет "The directory name specified is not valid Windows NT system directory" и тут напсано что она только для NT4, может есть какие-то...
C++ Буква или цифра? Как на с++ определить вводится буква или цифра? пробывал так : while(n<0 && n>9) cin>>n; подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.02.2011, 10:39     Как правильно оформлять модули?
Заголовочные файлы - *.h (или *.H, *.hpp) - предназначены для определения интерфейса модуля. Он содержит объявления функций, констант, типов данных, которые будет предоставлять модуль.
Без них, в общем-то, можно было бы и обойтись. Допустим, у нас есть некоторый файл foo.c, который предоставляет фукцию magnitude для определения длины вектора:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <math.h>
 
struct vector
{
    double x, y;
};
 
double sumOfSquares(double x, double y)
{
    return x * x + y * y;
}
 
double magnitude(struct vector vector)
{
    return sqrt(sumOfSquares(vector.x, vector.y));
}
Мы не сможем просто так использовать эту функцию в файле main.c, который будет содержать главную функцию, т.к. при компиляции этого файла компилятор ничего не знает о функции magnitude и о структуре vector. Поэтому нам нужно явно поместить объявление функции magnitude и структуры vector в файл main.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
struct vector
{
    double x, y;
};
 
double magnitude(struct vector);
 
int main()
{
    struct vector v = {15.5, -8.9};
    printf("Vector v = {%.2f, %.2f}, |v| = %.2f\n", v.x, v.y, magnitude(v));
        
    exit(0);
}
Такая программа скомпилируется и заработает. Но этот способ неудобен и подвержен ошибкам.
Поэтому мы создадим файл foo.h и поместим в него объявления magnitude и vector. Окончательная версия программы выглядит так:
foo.h:
C
1
2
3
4
5
6
7
8
9
10
11
#ifndef FOO_H
#define FOO_H
 
struct vector
{
    double x, y;
};
 
double magnitude(struct vector);
 
#endif
foo.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <math.h>
 
#include "foo.h"
 
static double sumOfSquares(double x, double y)
{
    return x * x + y * y;
}
 
double magnitude(struct vector vector)
{
    return sqrt(sumOfSquares(vector.x, vector.y));
}
main.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
#include "foo.h"
 
int main()
{
    struct vector v = {15.5, -8.9};
    printf("Vector v = {%.2f, %.2f}, |v| = %.2f\n", v.x, v.y, magnitude(v));
        
    exit(0);
}
Если вспомнить, как работает директива #include, то станет понятно, что после работы препроцессора содержимое файла foo.h будет находиться в начале файлов main.c и foo.c, что практически соответствует первоначальному варианту. Связка директив препроцессора #ifndef-#define-#endif в foo.h нужна для предотвращения ошибок компиляции, которые могут возникнуть при повторном включении заголовочного файла (вместо нее можно было бы использовать директиву #pragma once, но она поддерживается не всеми компиляторами). Так же стоит отметить, что мы не собираемся "экспортировать" функцию sumOfSquares, т.к. она является вспомогательной для функции magnitude. Поэтому мы не поместили ее объявление в заголовочный файл и определили ее с спецификатором static (которая говорит о том, что функция видна только в текущей единице трансляции).
 
Текущее время: 12:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru