Вопрос 1:Структура языкат c.Примеры:
Программа на языке Си состоит из одной или более подпрограмм, называемых функциями. Язык Си является блочно-структурированным. Каждый блок заключается в фигурные скобки {}. Основным блоком в программе консольного приложения на языке Си является главная функция, имеющая имя main(). Каждое действие в языке Си заканчивается символом "точка с запятой" - ;. В качестве действия может выступать вызов функции или осуществление некоторых операций. Имя функции — это коллективное имя группы описаний и операторов, заключенных в блок (фигурные скобки). За именем функции в круглых скобках указываются параметры функции.
Комментарии в языке Си
В языке Си для комментариев используются символы /* - начало комментария; */ - конец комментария. Вся последовательность, заключенная между этими символами, является комментарием. Это удобно для написания многострочных комментариев:
int a; /* целая переменная */
Многострочные комментарии также удобно использовать при отладке для сокрытия от выполнения части кода. В дополнение к этому, для написания коротких комментариев могут использоваться символы //. При этом комментарием является все, что расположено после символов // и до конца строки:
float b; // вещественная переменная
Главная функция
При выполнении консольного приложения, написанного на языке Си, операционная система компьютера передаёт управление функции с именем main(). Функцию main() нельзя вызывать из других функций программы, она является управляющей. Следующие за именем функции круглые скобки предназначены для указания параметров (аргументов), которые передаются в функцию при обращении к ней. В данном случае операционная система не передаёт в функцию main() никаких аргументов, поэтому список аргументов в круглых скобках пустой. Главную функцию можно записать по-разному:
int main()
void main().
Перед именем функции указывается тип возвращаемого значения. При обращении к главной функции значение возвращается операционной системе. Последняя запись не будет возвращать значения. Однако void main() - не совсем корректная запись, так как сообщает компилятору, что функция main() не возвращает никакого значения. При этом запись int main() сообщает компилятору о возвращении целочисленного значения, которое необходимо операционной системе и сообщает ей о том, что программа завершилась корректно. Если же это значение не возвращено, то операционная система понимает, что программа завершилась в аварийном режиме. Для возврата целочисленного значения перед завершением функции добавляется строка
return 0; // вещественная переменная
В фигурные скобки заключены описания и операторы. В общем случае программа может содержать несколько функций. Каждая функция имеет список передаваемых в нее параметров, указанный в круглых скобках, и набор операций, заключенных в блок, ограниченный фигурными скобками. Пример: Вывод на экран сообщения "Hello, world!".
#include <stdio.h> // Подключение библиотеки ввода-вывода int main() // Главная функция { printf("Hello, world!"); // Вывод сообщения getchar(); // Задержка окна консоли return 0; }
Результат
работы программы:
Теперь
попробуем написать текст на русском
языке.
#include <stdio.h> int main() { printf("Здравствуй, мир!"); getchar(); return 0; }
Результат
работы программы:
Проблема
русского языка в консольных приложениях
заключается в том, что консоль и редактор
кода Microsoft Visual Studio поддерживают разные
кодовые страницы. Для того, чтобы увидеть
русские символы в консоли необходимо
поменять кодовую страницу в консоли,
чтобы она соответствовала кодовой
странице редактора (1251). С этой целью
вызывается функция system("chcp
1251") с
соответствующей командной строкой.
Прототип функции system() содержится
в библиотеке <stdlib.h>.
При
этом текст программы будет выглядеть
следующим образом:
#include <stdio.h> #include <stdlib.h> int main() { system("chcp 1251"); // Текущая кодовая страница 1251 system("cls"); // Очистка консоли printf("Здравствуй, мир!"); // Вывод сообщения getchar(); return 0; }
Результат
работы программы:
Вопрос 2 :Дружественные функции в C++.Пример
Иногда требуется, чтобы функция – не член класса, имела доступ к скрытым членам класса. Основная причина использования таких функций состоит в том, что некоторые функции нуждаются в привилегированном доступе более, чем к одному классу. Такие функции получили название дружественных.
Для того, чтобы функция – не член класса имела доступ к private-членам класса, необходимо в определение класса поместить объявление этой дружественной функции, используя ключевое слово friend. Объявление дружественной функции начинается с ключевого слова friend и должно находиться только в определении класса.
void func() {...} class A { ...
friend void func(); };
Дружественная функция, хотя и объявляется внутри класса, функцией-членом не является. Поэтому не имеет значения, в какой части тела класса (private, public) она объявлена.
Функция-член одного класса может быть дружественной для другого класса.
class A {...
int func(); }; class B {...
friend int A :: func(); };
Функция-член func() класса A является дружественной для класса B. Если все функции-члены одного класса являются дружественными функциями второго класса, то можно объявить дружественный класс: friend class ИмяКласса;
class A { ... }; class B {...
friend class A; };
Все функции-члены класса А будут иметь доступ к скрытым членам класса В.
Пример Рассмотрим классы
vect – одномерный массив;
matrix – двумерный массив.
Необходимо написать функцию умножения вектора на матрицу. Такая функция должна иметь доступ к закрытым членам обоих классов. Это будет функция, дружественная обоим классам. Так как объявление дружественной функции появляется в обоих классах, и в качестве типов аргументов используется каждый класс, необходимо предварительное объявление (прототип) одного из классов перед определением другого.
Например класса matrix перед vect.
#include <iostream> using namespace std; class matrix; // прототип класса matrix class vect {
int *p;
int size; public:
vect(int s=0) {
p = new int[s];
for(int i=0;i<s;i++)
p[i] = 0;
size = s;
}
void in(void) {
for(int i=0;i<size;i++)
{
cout << "vect[" << i << "]=";
cin >> p[i];
}
}
void out(void) {
cout << "vect: ";
for(int i=0; i<size; i++)
cout << p[i] << " ";
}
friend vect mult(const vect &, const matrix &); }; class matrix {
int **base;
int column_size, row_size; public:
matrix(int col=0, int row=0) {
base = new int*[row];
for(int i=0; i<row; i++) {
base[i] = new int[col];
for(int j=0;j<col;j++)
base[i][j] = 0;
}
column_size = col;
row_size = row;
} void in(void) {
for(int i=0;i<row_size;i++)
for(int j=0;j<column_size;j++)
{
cout << "matrix[" << i << "][" << j << "]= ";
cin >> base[i][j];
} } void out(void) {
cout << "matrix: " << endl;
for(int i=0;i<row_size;i++) {
for(int j=0;j<column_size;j++)
cout << base[i][j] << " ";
cout << endl;
} } friend vect mult(const vect &, const matrix &); };
vect mult(const vect &v, const matrix &m) {
int i, j;
vect rez(m.column_size);
if(v.size!=m.row_size) {
cout << "No rezult " << endl;
return(rez);
}
for(j=0; j<m.row_size; j++) {
rez.p[j]=0;
for(i=0; i<m.row_size; i++)
rez.p[j]+=v.p[i]*m.base[i][j];
}
return(rez); } int main() {
vect v(3);
matrix m(2,2);
v.in();
m.in();
v.out();
cout << endl;
m.out();
vect r= mult(v,m);
r.out();
cin.get(); cin.get();
return 0;
}
Результат
выполнения
