WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 8 | 9 || 11 |

int a=1; //определение внешней переменной int b=2; //определение внешней переменной static int c=4;//т.к. static, то это внутренняя переменная void func_file2(); // прототип функции из другого файла int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "rus"); // русификация консоли int a=10;// локальная переменная cout<<"\n Адреса переменных из file1:\n";

cout<<"&a="<<&a<<" &b="<<&b<<" &c="<<&c;

cout<<"\n Значения переменных из file1:\n";

cout<<"a="<

cout<<"\n Значения глобальных переменных:\n";

cout<<"::a="<<::a<<" ::b="<<::b<<" ::c="<<::c;

cout<<"\n";

func_file2();

cout<<"\n";

return 0;

} // file2.cpp:

// #include "stdafx.h" #include using namespace std;

extern int a; // переменная из другого файла extern int b; // переменная из другого файла static int c=40;//т.к. static, то это внутренняя переменная void func_file2() // определение функции { int a=100; // локальная переменная cout<<"\n Адреса переменных из file2:\n";

cout<<"&a="<<&a<<" &b="<<&b<<" &c="<<&c;

cout<<"\n Значения переменных из file2:\n";

cout<<"a="<

cout<<"\n Значения глобальных переменных:\n";

cout<<"::a="<<::a<<" ::b="<<::b<<" ::c="<<::c;

} Пространства имен Технология пространства имн (Namespace) используется в большинстве современных языков программирования. Пространство имн группирует некоторое множество идентификаторов и используется как средство исключения конфликта имн.

Пространства имн можно рассматривать как механизм отражения логического группирования (см., напр., Стауструп Б. Язык программирования C++).

Пространства имн определяются либо на глобальном уровне, либо внутри других пространств имн. Нельзя создавать пространства имн в блоке. Имя, объявленное в пространстве имн, обладает внешним связыванием.

Пример. Демонстрация пространства имн. В программе имеется глобальная переменная с именем i, локальная переменная с тем же именем, а также переменная i в пространстве имн firstNS. Символьные массивы с именем str определены как в пространстве имн firstNS, так и в secondNS. Все эти имена используются в программе. В самом начале программы с помощью директивы using namespace firstNS;

импортированы все имена из пространства имен firstNS. Поэтому в main() обращение str относится к переменной из пространства имн firstNS. Однако запись i означает обращение к локальной переменной – локальные переменные сильнее остальных переменных с тем же именем.

Квалифицированные имена (т.е. с явным указанием пространства имн) позволяют добраться до переменных из различных пространств имн. Для вызова глобальной переменной используется запись ::i, а обращение firstNS::i обозначает доступ к переменной из пространства имн firstNS.

#include "stdafx.h" #include using namespace std;

// определение первого пространства имен namespace firstNS { int i, k, counter;

char str[] = "Простанство имен firstNS\n";

} // определение второго пространства имен namespace secondNS { int x, y;

char str[] = "Простанство имен secondNS\n";

} int i=2;// глобальная переменная using namespace firstNS; /* подключаем все имена из firstNS */ int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "rus"); // русификация консоли int i=0;

firstNS::i=1;

cout<<" i="<

std::cin >> val;

val*=100;

std::cout << "Poluchili: ";

std::cout << val;

return 0;

} Пример. Введение в глобальное пространство только нескольких имен.

#include // обеспечение доступа к потокам cin и cout using std::cout;

using std::cin;

int main() { double val;

cout << "Vvodim chislo: "; cin >> val;

val *=100;

cout << "Poluchili: ";

cout << val;

return 0;

} Объявление using вводит локальный синоним для отдельного имени, например, using Sunday::str;

Далее в программе для доступа к переменной Sunday::str можно использовать запись str.

Такие синонимы следует делать как можно более локальными во избежание конфликтов имн (см., напр., Стауструп Б. Язык программирования C++).



Например, в следующем примере, объявление using Saturday::str;

приведет к ошибке (повторное объявление переменной). Устранить ошибку можно только путем включения этого объявления, а также операторов, использующих str, в блок с помощью фигурных скобок.

Если одно и то же имя определено как в пространстве имн, так и в области объявлений программы, то при попытке применить using– объявление оба имени вступят в конфликт, и будет выдано сообщение об ошибке. Если же использовать using–директиву, то локальная версия переменной перекроет версию из пространства имн.

Пример. Переменная i объявлена в пространстве имн firstNS и в области глобальных переменных – это привело к конфликту имн.

#include using namespace std;

// определение пространства имен namespace firstNS { int i=10;

} int i=100;

using namespace firstNS;

int main() { cout<<" i= "<

return 0;

} Конечно же, использование квалифицированных имн решит проблему.

#include using namespace std;

// определение пространства имен namespace firstNS { int i=10;

} int i=100;

using namespace firstNS;

int main() { cout<<" ::i= "<<::i<<'\n';

cout<<" firstNS::i= "<

return 0;

} Пример. Три пространства имн содержат переменные с одинаковыми именами. С помощью using-директивы импрортируются имена одного из пространств имн – Week. Поэтому первый оператор вывода обращается к переменным из этого пространства. Далее, с помощью using-объявления в локальную область объявлений добавляется имя Sunday::str и, поэтому следующий оператор cout рассматривает str как Sunday::str, но переменную t как Week::t.

#include "stdafx.h" #include using namespace std;

namespace Sunday { char str[] = "Вот и воскресенье";

int t=7;

} namespace Saturday { char str[] = "Пришла суббота";

int t=6;

} namespace Week { char str[] = "День обычный";

int t=1;

} using namespace Week;

int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "rus"); // русификация консоли cout << "str= "< using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { cout<<"\n MyFirstProject";

return 0;

} Компиляция и запуск программы выполняется с помощью меню Отладка – Запуск без отладки или командой Ctrl+F5.

Приложение. Русификация консольного ввода-вывода При выполнении консольных приложений тексты, содержащие символы кириллицы, отображаются неправильно – в виде знаков псевдографики printf("\nПрограммирование на C\n");

cout<<"\nПрограммирование на C++\n";

Это связано с различием кодировок, используемых в среде подготовки программ и консольном окне. В редакторе среды программирования (например, MS Visual Studio) используется кодировка cp(Кириллическая Windows), а в окне консоли – кодировка cp866 (иначе DOS-кодировка).

Есть несколько способов решить вопрос.

Первый, самый простой – перейти на латиницу и записывать все поясняющие тексты при выводе латинскими буквами.





Следующий вариант решения – перекодировка сообщений перед их выводом.

// Изменение кодировки cp1251 на cp#include using namespace std;

char * AnsiToOem(char *stroka);

int _tmain(int argc, _TCHAR* argv[]) { printf("\nПрограммирование на C\n");

cout<<"\nПрограммирование на C++\n";

char s1[]="\nПрограммирование на C\n";

char s2[]="\nПрограммирование на C++\n";

printf(AnsiToOem(s1));

cout<

return 0;

} char * AnsiToOem(char *stroka) { int cnt,i=0;

char ch;

while((ch=stroka[i])!='\0') { cnt=ch;

if ((ch>='а') && (ch<='п')) cnt-=64;

else if ((ch>='р') && (ch<='я')) cnt-=16;

else if (ch=='') cnt=241;

else if (ch=='Ё') cnt=240;

else if ((ch>='А') && (ch<='Я')) cnt-=64;

stroka[i]=cnt; i++;

} return stroka;

} Можно также установить кодовую страницу с помощью функции setlocale(), объявленную в файле locale.h. Этот способ, в большинстве случаев, наиболее оптимальный.

#include #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "rus");

printf("\nПрограммирование на C\n");

cout<<"\nПрограммирование на C++\n";

char month[10];

cout<<"\n Месяц = ";cin>>month;

cout<<"\n month ="<

return 0;

} Однако, вывод символов, записанных в строку с клавиатуры (в примере ввели Май как значение строки month), по-прежнему, не дружит с кириллицей.

Еще один способ русификации консольного вывода заключается в настройке сеанса командной строки (см., напр., CppStudio.

Программирование на С++. – http://cppstudio.com/).

Прежде всего, выберем для окна консоли шрифт, поддерживающий кириллицу. Для этого откроем системное меню консольного окна (щелкнув правой кнопкой мыши по заголовку окна) и выберем пункт Свойства.

Перейдем на вкладку Шрифт и поменяем шрифт Consolas, установленный по умолчанию на Lucida Console.

Эти настройки достаточно выполнить один раз, а в каждой программе нужно устанавливать кодовые страницы с помощью функций SetConsoleCP() и SetConsoleOutputCP(), объявленных в файле windows.h.

#include #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP(1251);// установка cp1251 для ввода SetConsoleOutputCP(1251);//установка cp1251 для вывода printf("\nПрограммирование на C\n");

cout<<"\nПрограммирование на C++\n";

return 0;

} Символы кириллицы, введенные с клавиатуры, также правильно отобразятся функцией printf() и оператором cout.

#include #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP(1251);// cp1251 - для потока ввода SetConsoleOutputCP(1251);//cp1251 - для потока вывода char month[10];

cout<<"\n Месяц = ";cin>>month;

cout<<"\n month ="<

printf("\n month=%s\n",month);

return 0;

} Литература 1. Керниган Б.В., Ричи Д.М. Язык программирования C. – М.:

Издательский дом «Вильямс», 2009. – 304 с.

http://www.intuit.ru/department/pl/cpl/ 2. Керниган Б.В., Пайк Р. Практика программирования. – М.:

Издательский дом «Вильямс», 2004. – 288 с.

3. Prata S. C Primer Plus. – SAMS, 2004. – 984 p.

4. Прата С. Язык программирования C++ (C++11). Лекции и упражнения, 6-е издание. — М.: «Вильямс», 2012. — 1248 с.

5. Шилдт Г. Полный справочник по C. – http://cpp.com.ru/shildt_spr_po_c/index.html 6. Дейтел Х. М., Дейтел П. Дж.. Как программировать на С. – М.: ЗАО «Издательство БИНОМ», 2000. – 1008 с.

7. Deitel P., Harvey Deitel H.. C: How to Program. – Prentice Hall, 2009. – 1008 p.

8. Голуб А. И. Веревка достаточной длины, чтобы... выстрелить себе в ногу. Правила программирования на Си и Си++. – http://emaxx.ru/bookz/files/golub_cord.pdf.

9. Штерн В. Основы C++. Методы программной инженерии. – М.:

Издательство «Лори», 2003. – 860 с.

10. Хэзфилд Р., Кирби Л., Корбит Д. и др. Искусство программирования на C: Фундаментальные алгоритмы, структуры данных и примеры приложений. – К.: Изд-во ДиаСофт, 2001. – 736 с.

11. Саттер Г., Александреску А. Стандарты программирования на C++.

101 правило и рекомендация. – М.: Издательский дом "Вильямс", 2005.— 224 с.

12. Фридман А., Кландер Л., Михаэлис М., Шильдт Х. C/C++. Архив программ. – М.: ЗАО «Издательство БИНОМ», 2001. – 640 с.

13. Динман М.И. C++. Освой на примерах. – СПб.: БХВ-Петербург, 2006. – 384 с.

14. Кетков Ю.Л. Введение в языки программирования C и C++. – Интернет Университет Информационных технологий.

http://www.intuit.ru/department/pl/ccpp/ 15. Ворожцов А.В., Винокуров Н.А. Лекции Алгоритмы: построение, анализ и реализация на языке программирования Си. - М.: МФТИ, 2007. - 452 с.

16. Стауструп Б. Язык программирования C++. – М.: Издательство «Бином», 2011. – 1136 с.

17. Samuel P. Harbison III, Guy L. Steele Jr. C A Reference Manual. Fifth Edition. – Prentice-Hall, Inc., 2002. – 533 p.

18. Savitch W. Problem Solving C++. – Addison-Wesley, 2008. – 1048 p.

19. Scheinerman E. C++ for Mathematicians. An Introduction for Students and Professionals. - Chapman & Hall/CRC, 2006. – 521p.

20. Хабибуллин И.Ш. Программирование на языке высокого уровня.

C/C++. – СПб.: БХВ-Петербург, 2006. – 512 с.

Pages:     | 1 |   ...   | 8 | 9 || 11 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.