Начало комментария; */ - конец комментария.
Вся последовательность, заключенная между этими символами, является комментарием.
Это удобно для написания многострочных комментариев:
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;
}
Результат выполнения