начало комментария; */ - конец комментария.

Вся последовательность, заключенная между этими символами, является комментарием.

Это удобно для написания многострочных комментариев:


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;

}

Результат выполнения