Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты 6-10.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
312 Кб
Скачать
☆

Вопрос 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;

}

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