Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры.docx
Скачиваний:
69
Добавлен:
10.01.2016
Размер:
297.09 Кб
Скачать
  1. Fortran (В 1954 году компания IBM создала язык Fortran (formula translator) , его основу составляли арифметические операторы мат. выражений. Программировать на нем было не просто.)

COBOL (был изобретен в конце 1959 года. Этот язык был ориентирован на задачи бизнеса, также был аппаратно независим)

АЛГОЛ (Изобретен в 1958 году, это алгометрический язык программирования , в нем была доведена до завершения сама концепция операторных алгометрических языков программирования)

BASIC (. Сначала не имел ни кампилятора ни интерпритатора , они появились только в 1975 году. Самым популярным был М-BASIC – первый успех Microsoft)

PASCAL (Создан в 1970 году, был придуман для обучения студентов)

C++ (Разработан в 1971 году, главные преимущества – скорость и удобство, центральная идея – указатели)

  1. Программа на языке С++ состоит из директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций.

  Язык Си – компилирующего типа. Текст программы на Си, для получения объектного модуля обрабатывается компилятором, причем компиляция выполняется в два проходаПри первом проходе обрабатываются строки директивы, начинающиеся со знака #, при втором - транслируется текст программы и создается объектный (машинный) код. Для получения загрузочного модуля необходимо подсоединить к нему соответствующие библиотечные модули.

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

Типы данных: целый ( int , short , long, unsigned int). Вещественный : ( double , float) char- символьный, bool- логический

  1. Прежде чем использовать в программе какую-то переменную, надо дать ей описание, то есть сказать, какое имя имеет переменная и каков её тип. Вначале указывается тип переменной, а затем её имя. Например:

int k; // это переменная целого типа int

Инициализация переменных double a=3

В языке C++ есть 2 способа задания констант:

  1. #define PI 3.14

  2. const double PI=3.14;

  1. Описание объектов для управления вводом-выводом содержится в дерективе предпроцессора <iostream>.

Операторы ввода вывода:

Cout – оператор вывода

<< - вывод в поток

Endl- перевод на новую строку

Cin – оператор ввода

>> - операция потокового ввода

Форматный вывод:

Int a=5, b=2;

Cout <<”a/b=”<<endl;

…………………………..

2-будет ответом т.к целый тип данных

Float c=5, d=2;

Cout<<”c/d=”<<endl;

……………………………………

2,5 будет ответом т.к. вещественный тип данных

Cout<<a%b<<endl;

……………………………

Ответом будет 1 т.к. это остаток от деления 5/2

Манипулятор

Назначение

Ввод/вывод

dec

Ввод/вывод данных в десятичной форме

ввод и вывод

endl

Вывод символа новой строки с передачей в поток всех данных из буфера

вывод

ends

Вывод нулевого символа

вывод

flush

Передача в поток содержи­мого буфера

вывод

hex

Ввод/вывод данных в шест­надцатиричной системе

ввод и вывод

oct

Ввод/вывод данных в восьме­ричной форме

ввод и вывод

resetiosflags(long f)

Сбрасывает флаги, указанные в f

ввод и вывод

setbase(int base)

Устанавливает базу счисле­ния равной параметру base

вывод

setfill(int ch)

Устанавливает символ заполнения равным ch

вывод

setiosflags(long f)

Устанавливает флаги, указанные в f

ввод и вывод

setprecision(int p)

Устанавливает число цифр после запятой

вывод

setw(int w)

Устанавливает ширину поля равной w

вывод

ws

Пропускает начальный символ-разделитель

ввод

  1. Управляющие последовательности: Манипуляторы:

Символ

Описание

\r

возврат каретки в начало строки

\n

новая строка

\t

горизонтальная табуляция

\v

вертикальная табуляция

двойные кавычки

\’

апостроф

\\

обратный слеш

\0

нулевой символ

\?

знак вопроса

\a

сигнал бипера (спикера) компьютера

  1. Арифметические операции:

+ — сложение;- — вычитание;* — умножение;/ — деление;% — остаток от деления.

Операторы:

Составной оператор –  {...}

===================================

  • Оператор обработки исключений

  • try { <операторы> }

  • catch (<объявление исключения>) { <операторы> }

  • ...

  • catch (<объявление исключения>) { <операторы> }

===================================

Условный оператор

if (<выражение>) <оператор 1> [else <оператор 2>]

Оператор-переключатель

switch (<выражение>)

{ case <константное выражение 1>: <операторы 1>

case <константное выражение 2>: <операторы 2>

...

case <константное выражение N>: <операторы N>

[default: <операторы>]

}

Оператор цикла с предусловием

while (<выражение>) <оператор>

Оператор цикла с постусловием

do <оператор> while <выражение>

Оператор пошагового цикла

for ([<начальное выражение>];

[<условное выражение>];

[<выражение приращения>])

<оператор>

Операции увеличения ++ и уменьшения --. Привести примеры реализации.

for(i=0; i<n; i++) –например проход по строке

for(i=0; i<n; --i)- например проход по строке с конца для поиска последнего отрицательного элемента

  1. Операции сравнения: >, >= больше, больше равно; <, <= меньше , меньше равно; == равно ( не присваивание); != не равно; = присваивание

Логические операции:

Лог. Операция И: &&;Лог. Операция ИЛИ: ||; Лог. Операция Не: !

Примеры:

for(i=0; i<n; i++); if(f[i]==0); w++;

Приоритеты:

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

  1. sqrt(a)

    корень квадратный из а, причём а не отрицательно

    sqrt(9.0)=3.0

    pow(a, b)

    возведение  а в степень b

    pow(2,3)=8

    exp(a)

    вычисление экспоненты еа

    exp(0)=1

    sin(a)

    a задаётся в радианах

    cos(a)

    a задаётся в радианах

    log(a)

    натуральный логарифм a(основанием является экспонента)

    log(1.0)=0.0

Double x,y;

Cout<<”x=”;

Cin>>x;

Y=pow(x,3);

Cout<<”y=”<<y<<endl;

  1. Структу́рное программи́рование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков.

Одиночный выбор:

For(i=0; i<n; i++)

If(f[i]==0)

Break;

Двойной выбор:

For(i=0; i<n; i++)

If(f[i]==0)

Break;

Else

K++;

Множественный выбор (switch):

// форма записи оператора множественного выбора switch

switch (/*переменная или выражение*/)

 {

 case /*константное выражение1/*:

 {

 /*группа операторов*/;

 break;

 }

 case /*константное выражение2*/:

 {

 /*группа операторов*/;

 break;

 }

 //.    .    .

 default:

                {

                 /*группа операторов*/;

                }

 }

На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default. После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch.

  1. Как уже было отмечено выше, любую программу можно составить только из структур трех типов: следования, ветвления и цикла (это базовые конструкции).

  • Следованием называется конструкция, представляющая собой последовательное выполнение двух или более операторов (простых или составных).

  • Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия.

  • Цикл задает многократное выполнение оператора.

switch

Позволяет осуществить выбор среди нескольких фрагментов кода, в зависимости от значения целочисленного выражения.

Множественный выбор (switch):

// форма записи оператора множественного выбора switch

switch (/*переменная или выражение*/)

{

case /*константное выражение1/*:

{

 /*группа операторов*/;

break;

}

case /*константное выражение2*/:

{

 /*группа операторов*/;

break;

}

 //.    .    .

default:

{

 /*группа операторов*/;

}

}

=========или==============================================================================================================================

{

Case 1;

Case 2;

Do_something(x,a);

Break;

Case 3;

Do_something_else(a);

Case 4;

Do_nice_things(a,x);

Break;

Default;

Do_something_by_default;

}

  1. Есть два типа циклов: типа «пока» и типа «n-раз».

  2. Пример: увеличить число пока оно не станет равно 5ти.

  3. Int i=1;

  4. While (i<5)

  5. { cout<<i<<” “;

  6. I++;

  7. На экран выведет «1;2;3;4;»

  8. Int i=1;

  9. Do

  10. { i++

  11. Cout<<i<<” ”;

  12. } while(i<0);//пост проверка

  13. Такой цикл выполнится 1 раз

  14. На экран выведет «2»

  15. С пред условием(While)

  16. Int i=1;

  17. While (i<5)

  18. { cout<<i<<” “;

  19. I++;

  20. На экран выведет «1;2;3;4;»

  21. С пост условием(do … While)

  22. Int i=1;

  23. Do

  24. { i++

  25. Cout<<i<<” ”;

  26. } while(i<0);//пост проверка

  27. Такой цикл выполнится 1 раз

  28. На экран выведет «2»

  29. Различие состоит в том что на экран будет выводиться разное.

  1. #include <iostream>

  2.  

  3. using namespace std;

  4.  

  5. int main()

  6. {

  7.     int a, b, c, d, e, f;

  8.     cout << "Enter a: ";

  9.     cin >> a;

  10.     cout << "Enter b: ";

  11.     cin >> b;

  12.     cout << "Enter c: ";

  13.     cin >> c;

  14.     cout << "Enter d: ";

  15.     cin >> d;

  16.     cout << "Enter e: ";

  17.     cin >> e;

  18.     cout << "Enter f: ";

  19.     cin >> f;

  20.     int C(0);

  21.     while(true)

  22.     {

  23.         C++;

  24.  

  25.         if(C++ > 9000)

  26.         {

  27.             break;

  28.         }

  29.         else

  30.         {

  31.            cout << C << "\n";

  32.         }

  33.     }

  34.     cout << "a: " << a << " b: " << b << " c: " << c << " d: " << d << " e: " << e << " f: " << f << endl;

  35.     return 0;

  36. }

  1. Int n=0

  2. For(int i=0; i<3; i++){

  3. For(int j=0; j<5; j++){

  4. N=n+2;

  5. } }

  6. Здесь внешний цикл это тот, в котором перемещается I . Внутренний цикл с переменной j. сначала , при i=0, j пройдет по всем своим значениям от 0 до 4. Потом I перейдет на 1, а j опять будет нарезать круги с 0 до 4, и так пока не закончится внешний цикл. Т .е. всего будет 15 итераций , а n в конце будет 30.

  7. Итерационными (пошаговыми) алгоритмами называются алгоритмы, в которых на каждом шаге используется одна и та же формула, выраженная через значения, полученные на предыдущих шагах алгоритма.

  8. Задание: вычислить значение бесконечного выражения (прогрессии) с вводом с клавиатуры значения аргумента (х) и количества членов (N).

  1. #include <cstdlib>

  2. #include <iostream>

  3. #include <cmath>

  4. using namespace std;

  5. int main(int argc, char *argv[])

  6. {

  7.     double a, b=1, c=sqrt(3.), y=0, x, N, t;

  8.     cout << "x= ";

  9.     cin >> x;

  10.     cout << "N= ";

  11.     cin >> N;

  12.     a = cos(x);

  13.     cout<<a;

  14.     for (int i=1; i<=N; i++)

  15.         {

  16.              y = ((a+b)/c) + y;

  17.              b++;

  18.              t=i%2;

  19.              if (t==0)

  20.              {

  21.                       c=sqrt(3+c);

  22.              }

  23.              else

  24.              {

  25.                       c=sqrt(4+c);    

  26.              }

  27.         }

  28.         cout << "y= " << y << endl;

  29.                      

  30.     system("PAUSE");

  31.     return EXIT_SUCCESS;

  32. }

  1.  Пользовательская функция - Это функция, которая создана пользователем.

  2. void swap (int x, int y){    int z = x;    x = y;    y = z;  }

  3. Как вы, наверное, догадались - это пользовательская функция, которая меняет местами значения у элементов

  4. void GetError (){    pritnf ("Ошибка\n"); }

  5. Пользовательская функция, выбрасывающая сообщение об ошибке

  6. int max (int a, int b, int c){    if (a > b && a > c)       return a;    if (b > a && b > c)       return b;    if (c > a && c > b)        return c; }

  7. Эта созданная пользовательская функция определяет наибольшее число из трех.

  8. В языке С++ данные в подпрограмму можно передавать тремя способами: по значению, по адресу и по ссылке.

  9. Передача по значению эквивалентна операции присвоения.

  10. Адрес и ссылка используются в случае если нид получить от функции более одного результата.

  11. Пример:

  12. B=1;

  13. Cout<<cube(b++)<<endl;

  14. Cout<<b<<endl;

  15. Выведется на экран:

  16. 1

  17. 2

  18. Это соответствует выполнению операции присваивания x=b++;

  19. Функция должна быть определена до того, как использована.

  20. Прототип выполняет ту же роль, что и объявление для переменных: в нем перечисляется используемые типы.

  21. Тело функции – это блок, т.е. последовательность описаний переменных операторов, заключенных в фигурные скобки. Даже если функция не выполняет никаких действий тело функции должно присутствовать в определении. В этом случае тело функции будет состоять просто из скобок {}:void f(void){}

  22. Определения функций не должны быть вложенными. В отличие от определений, прототипы – объявления функций могут быть вложенными в другие функции, главное чтобы прототип был прописан для вызова соотв. Функции.

  23. Примеры объявления функций: int add (int, int) – это объявленная функция которая требует 2 аргумента типа int и возвращает величину типа int.

  24. Определение функций maximum:

  25. Int maximum (int x; int y; int z)

  26. Параметры со значениями по умолчанию должны объявляться последними параметрами в списке. При вызове функции такие параметры можно не указывать – используется значение, заданное по умолчанию.

  27. Пример:

  28. Void repch (char ch=’-’, int k=60)

  29. C++ разрешает такие вызовы функции

  30. Repch();//выводится 60 минусов

  31. Repch(+)//выводиться 60 плюсов

  32. Repcj(‘=’52)//выводится 52 равно

  33. Вызов функции считается корректным если не указывается самое правое параметры

  34. Рекурсивная функция – это функция которая может вызвать саму себя.

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

  36. Пример:факториал

  1. Include’s

  2. …………………..

  3. Unsigned int factor(unsigned int)//прототип функции

  4. Int man (void)

  5. {

  6. Unsigned unt n;// число факториал которого нид вычислить

  7. Unsigned int F;//факториал чилса n

  8. Cout<<”вычисление факториала:\n”;

  9. Cout<<”введите число, факториал которого нид вычислить”;

  10. Cin>>n;

  11. F=factor(n);

  12. Cout<<”факториал числа”<<n<<”равен”<<F;

  13. Return 0;

  14. }

  15. {if(k==1)

  16. Return 1;

  17. Else

  18. K*Factor(k-1);

  19. Return 0’

  1. Время жизни – это время существования переменной во время работы программы.

  2. Глобальные переменные – ее имя видно с момента объявления.

  3. За пределами функций имена объявленных внутри нее переменных не видны, т.е. имя переменной нельзя использовать вне тела функции . Говорят что область видимости локальных переменных – тело функции.

  4. Пример статических функции:

  1. Double average(double data)

  2. { static double summa =0;// инициализация статических переменных при первом вызове.

  3. Static int count=0;

  4. Cout++;

  5. Summa+=data;

  6. Return summa/cout;// возврат нового среднего значения

  7. }

  8. Int main()

  9. { double data=1, middle;

  10. While (data)

  11. {

  12. Cout<<”введите число:”;

  13. Cin>>data;

  14. Middle=average(data);//выражение очередного среднего

  15. Cout<<”среднее значение:”<<middle<<endl;

  1. Переменные, в которых сохраняются параметры, передаваемые функции, также являются локальными для этой функции. Эти переменные создаются при вызове функции и в них копируются значения, передаваемые функции в качестве параметров. Эти переменные можно изменять, но все изменения этих переменных будут "забыты" после выхода из функции. Рассмотрим это на примере следующей функции, "меняющей" значения двух переданных ей переменных:

  1.      #include<iostream>      using namespace std;      void swap(int a, int b)      {          int t;          t=b;          b=a;          a=t;      }      int main()      {          int p=3,q=5;          swap(p,q);          cout<<p<<" "<<q<<endl;          return 0;      }

  1. При вызове функции swap создаются новые переменные a и b, им присваиваются значения 3 и 5. Эти переменные никак не связаны с переменными p и q и их изменение не изменяет значения p иq. Такой способ передачи параметров называется передачей параметров по значению.

  2. void swap(int & a, int & b)

  3. Амперсанды перед именем переменной означают, что эта переменная является не локальной переменной, а ссылкой на переменную, указанную в качестве параметра при вызове функции. Теперь при вызове swap(p,q) переменные a и b являются синонимами для переменных p и q, и изменение их значений влечет изменение значений p и q. А вот вызывать функцию в видеswap(3,5) уже нельзя, поскольку 3 и 5 — это константы, и сделать переменные синонимами констант нельзя.

  4. Под перегрузкой функции понимается, определение нескольких функций (две или больше) с одинаковым именем, но различными параметрами.

  5. Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения. Например, следующая программа перегружает функцию с именемadd_values.

  1. #include <iostream.h>

  2. int add_values(int a,int b)

  3. { return(a + b); )

  4. int add_values (int a, int b, int c)

  5. ( return(a + b + c); )

  6. void main(void)

  7. { cout << «200 + 801 = » << add_values(200, 801) << endl; cout << «100 + 201 + 700 = » << add_values(100, 201, 700) << endl; }

  1. Как видите, программа определяет две функции с именами add_valuesПервая функция складывает два значения типа int, в то время как вторая складывает три значения. 

  2. Массивы – это группа однородных данных, имеющих один и тот же тип и одно и тоже имя.

  3. Объявление: ( тип_имя_кол-во. Элементов) int month [12] или double mas[32]

  4. Инициализация: int mas[5]={1, 2, 3, 4, 5} или с клавиатуры. For(int i=0; i<12; ++i) Cin>>mas[i]

  5. Обработка: Получение суммы элементов массива

  6. Поиск максимума, минимума и др. задаваемых значений.

  7. Сортировка массива.

  8. Выполнение однотипных действий над всеми элементами массива.

  9. Использование: Массивы используются для обработки большого количества однотипных данных.

  10. Одномерный массив — массив, с одним параметром, характеризующим количество элементов одномерного массива. Фактически одномерный массив — это массив, у которого может быть только одна строка, и n-е количество столбцов. Столбцы в одномерном массиве — это элементы массива.

  11. Индекс ячейки – это целое неотрицательное число, по которому можно обращаться к каждой ячейке массива и выполнять какие-либо действия над ней (ячейкой).

  12. Всегда сразу после имени массива идут квадратные скобочки, в которых задаётся размер одномерного массива, этим массив и отличается от всех остальных переменных.

  13. Инициализация одномерного массива выполняется в фигурных скобках после знака равно, каждый элемент массива отделяется от предыдущего запятой.

  14. // массивы могут быть инициализированы при объявлении:

  15. int a[16] = { 5, -12, -12, 9, 10, 0, -9, -12, -1, 23, 65, 64, 11, 43, 39, -15 }; // инициализация одномерного массива

  16. В данном случае компилятор сам определит размер одномерного массива. Размер массива можно не указывать только при его инициализации, при обычном объявлении массива обязательно нужно указывать размер массива. Разработаем простую программу на обработку одномерного массива.

  17. Int a[]={5,-12,-12,9,10,0,-9,-12,-1,23,65,64,11,43,39,-15};//инициализации массива без определения его размера.

  18. Алгоритм пузырьковой сортировки – это довольно простой в реализации алгоритм для сортировки массивов. Можно встретить и другие названия: пузырьковая сортировка, Buble sortили сортировка простыми обменами – но все они будут обозночать один и тот же алгоритм. Назван так, потому что большее или меньшее значение “всплывает” (сдвигается) к краю массива после каждой итерации, это будет видно в примере.

  19. Сложность этого алгоритма выражается формулой О(n^2) (n в степени 2). Алгоритм работает медленно с большими массивами, а поэтому малоэффективен и на практике используется редко, чаще всего в учебных целях. Для сортировки массивов на практике используют другие более быстрые алгоритмы, один из них –  QuickSort(быстрая сортировка). Функция для быстрой сортировки включена во многие стандартные библиотеки языков программирования, например в языке C функция qsort() из стандартной библиотеки.

  20. Алгоритм работает очень просто. Программа проходит по всем элементами массива по порядку. Каждый текущий элемент сравнивается с соседним и, если он меньше/больше(если сортируем по убыванию/возрастанию соответственно) меняется местами с соседним.

  21. Сортировка вставками (Insertion Sort) — это простой алгоритм сортировки. Суть его заключается в том что, на каждом шаге алгоритма мы берем один из элементов массива, находим позицию для вставки и вставляем. Стоит отметить что массив из 1-го элемента считается отсортированным. Словесное описание алгоритма звучит довольно сложно, но на деле это самая простая в реализации сортировка. Каждый из нас, не зависимо от рода деятельности, применял алгоритм сортировки, просто не осознавал это. Например когда сортировали купюры в кошельке — берем 100 рублей и смотрим — идут 10, 50 и 500 рублёвые купюры. Вот как раз между 50 и 500 и вставляем нашу сотню. Или приведу пример из всех книжек — игра в карточного «Дурака». Когда мы тянем карту из колоды, смотрим на наши разложенные по возрастанию карты и в зависимости от достоинства вытянутой карты помещаем карту в соответствующее место.

  22. Нумерация элементов массива начинается с 0 и заканчивается n-1. 

  23. for(int i=1;i<n;i++) for(int j=i;j>0 && x[j-1]>x[j];j--) // пока j>0 и элемент j-1 > j, x-массив int swap(x[j-1],x[j]); // меняем местами элементы j и j-1

  24. Сортировка вставками имеет сложность n2, количество сравнений вычисляется по формуле n*(n-1)/2.

  25. Итак при n=100 количество перестановок равно 4950, а не 10000 если бы мы высчитывали по формуле n2. Имейте это ввиду при выборе алгоритма сортировки.

  26. Двумерные массивы в С++

  27. Допустим, необходимо обработать некоторые данные из таблицы. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. То есть, визуально, двумерный массив — это обычная таблица, со строками и столбцами. Фактически двумерный массив — это одномерный массив одномерных массивов. Структура двумерного массива, с именем a, размером m на n показана ниже (см. Рисунок 4).

  28. где, m — количество строк двумерного массива; n — количество столбцов двумерного массива; m * n — количество элементов массива.

  29. В объявлении  двумерного массива, также как и в объявлении одномерного массива, первым делом, нужно указать:

  • тип данных;

  • имя массива.

  1. После чего, в первых квадратных скобочках указывается количество строк двумерного массива, во вторых квадратных скобочках — количество столбцов двумерного массива. Двумерный массив визуально отличается от одномерного второй парой квадратных скобочек.

  2. Рассмотрим пример объявления двумерного массива. Допустим нам необходимо объявить двумерный массив, с количеством элементов, равным 15. В таком случае двумерный массив может иметь три строки и пять столбцов или пять строк и три столбца.

  1. 1

  2. 2

  1. // пример объявление двумерного массива:

  2. int a[5][3];

  • a — имя целочисленного массива

  • число в первых квадратных скобках указывает количество строк двумерного массива, в данном случае их 5;

  • число во вторых квадратных скобках указывает количество столбцов двумерного массива, в данном случае их 3.

  1. 1

  2. 2

  1. // инициализация двумерного массива:

  2. int a[5][3] = { {4, 7, 8}, {9, 66, -1}, {5, -5, 0}, {3, -3, 30}, {1, 1, 1} };

  1. В данном массиве 5 строк, 3 столбца. после знака присвоить ставятся общие фигурные скобочки, внутри которых ставится столько пар фигурных скобочек, сколько должно быть строк в двумерном массиве, причём эти скобочки разделяются запятыми. В каждой паре фигурных скобочек записывать через запятую элементы двумерного массива. Во всех фигурных скобочках количество элементов должно совпадать. Так как в массиве пять строк, то и внутренних пар скобочек тоже пять. Во внутренних скобочках записаны по три элемента, так как количество столбцов — три. Графически наш массив будет выглядеть, как двумерная таблица

  2. Код программы на Visual C++ вода-вывода матрицы будет иметь примерно такой вид:

  1. #include "stdafx.h" #include <iostream> using namespace std; int main() { setlocale (LC_ALL, "RUS"); int i,j,N,M,a[20][20]; cout<<"N="; //ввод количества строк cin>>N; cout<<"M="; //ввод количества столбцов cin>>M; cout<<"Input matrix A \n"; //цикл по переменной i, в которой перебираем строки матрицы for (i=0; i<N; i++) //цикл по переменной j, в котором перебираем элементы внутри строки for (j=0; j<M; j++) cin>>a[i][j]; //ввод очередного элемента матрицы cout<<"matrix A \n"; for (i=0; i<N; i++) { //цикл по переменной i, в котором перебираем строки матрицы for (j=0; j<M; j++) cout<<a[i][j]<<"\t"; //вывод очередного элемента матрицы cout<<endl; //переход на новую строку после вывода всех элементов строки } system("pause"); return 0; }

  1. Теперь, давайте рассмотрим некоторые свойства матриц:

  • если номер строки элемента совпадает с номером столбца  (i = j), это означает , что элемент лежит на главной диагонали матрицы;

  • если номер строки превышает номер столбца (i > j), то элемент находиться ниже главной диагонали;

  • если номер столбца больше номера строки (i < j), то элемент находиться выше главной диагонали;

  • элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i+j+1=n;

  • неравенство i+j+1<n характерно для элемента, находящегося выше побочной диагонали;

  • соответственно, элементу, лежащему ниже побочной диагонали, соответствует выражение i+j+1>n.

  1. Найти сумму элементов матрицы, лежащих выше главной диагонали 

  1. #include "stdafx.h" #include <iostream> using namespace std; int main() { setlocale (LC_ALL, "RUS"); int S, i, j, N, M, a[20][20]; cout<<"N="; cin>>N; cout<<"M="; cin>>M; cout<<"Введите матрицу А \n"; for (i=0; i<N; i++) for (j=0; j<M; j++) cin>>a[i][j]; for (S=i=0; i<N; i++) for (j=0; j<M; j++) //если элемент лежит выше главной диагонали, то наращиваем сумму if (j>i) S+=a[i][j]; cout<<"S="<<S<<endl; system("pause"); return 0; }

  1. Многомерные массивы

  2. В языке Си могут быть также объявлены многомерные массивы. Отличие многомерного массива от одномерного состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном — несколькими. Примером многомерного массива является матрица.

  3. Общая форма объявления многомерного массива

  4. тип имя[размерность1][размерность2]...[размерностьm];

  5. Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор

  6. int matr [6][8];

  7. задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j], или более экзотическим способом: *(matr[i]+j) или *(*(matr+i)+j). Это возможно, поскольку matr[i] является адресом начала i-й строки массива.

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

  1. int mass2 [][2] = { {1, 1}, {0, 2}, {1, 0} }: int mass2 [3][2] = {1, 1, 0, 2, 1, 0}

  2. Пример. Программа определяет в целочисленной матрице номер строки, которая содержит наибольшее количество элементов, равных нулю.

  3. #include <stdio.h>

  4. int main(){

  5. const int nstr = 4, nstb = 5; // размерности массива

  6. int b[nstr][nstb]; // описание массива

  7. int i, j;

  8. for (i = 0; i<nstr; i++) // ввод массива

  9. for (j = 0; j<nstb; j++) scanf("%d", &b[i][j]);

  10. int istr = -1, MaxKol = 0;

  11. for (i = 0; i<nstr; i++){ // просмотр массива по строкам

  12. int Коl = 0:

  13. for (j = 0; j<nstb; j++) if (b[i][j] == 0) Kol++;

  14. if (Ko1 > MaxKol) {istr = i ; MaxKol = Kol;}

  15. }

  16. printf(" Исходный массив:\n");

  17. for (i = 0; i<nstr; i++){

  18. for (j = 0; j<nstb; j++) printf("%d ", b[i][j]);

  19. printf ("\n");}

  20. if (istr == -1) printf("Нулевых элементов нет");

  21. else printf("Hoмep строки: %d", istr);

  22. return 0;

  23. }

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

  1. #include "stdafx.h"

  2. #include <iostream>

  3. using namespace std;

  4. int main()

  5. {

  6. int i, j, n, m, mi(0), mj(0);

  7. cout<<"Vvedite n: ";

  8. cin>>n;

  9. cout<<"Vvedite m: ";

  10. cin>>m;

  11. cout<<"Vvedite massiv:";

  12. int** mas = new int* [n];

  13. for(i = 0; i < n; ++i)

  14. {

  15. mas[i] = new int [m];

  16. for(j = 0; j < m; ++j)

  17. cin>>mas[i][j];

  18. }

  19. for(i = 0; i < n; ++i)

  20. for(j = 0; j < m; ++j)

  21. if(mas[i][j] > mas[mi][mj])

  22. mi = i, mj = j;

  23. cout<<"Max - mas["<<mi<<"]["<<mj<<"] = "<<mas[mi][mj];

  24. cin.get();

  25. cin.get();

  26. system ("pause");

  27. return 0;

  28. }

  1. Функция ввода символов

  2. Для ввода символов может использоваться функция

  3. char getchar();

  4. которая возвращает значение символа, введенного с клавиатуры.

  5. Функция вывода символов

  6. Для вывода символов может использоваться функция

  7. char putchar(char);

  8. которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

  9. (пример)Посчитать количество введенных символов во введенной строке.

  1. #include "stdafx.h"

  2. #include <string>

  3. #include <iostream>

  4. using namespace std;

  5. int _tmain(int argc, _TCHAR* argv[])

  6. {

  7. setlocale(LC_ALL, "");

  8. char input[256];

  9. cout<<"Введите строку: ";

  10. cin>> input;

  11. cout <<"Строка"<<input<<"содержится"<<strlen(input)<<"символов \n";

  12. system ("pause");

  13. return 0;

  14. }

  1. Объявление и инициализация строк.                 Строкой называется массив символов, который заканчивается пустым символом ‘\0’. Строка объявляется как обычный символьный массив, например,           

  2.       char  s1[10];          

  3.     char  *s2;              // указатель на строку Различие между указателями s1 и s2 заключается в том, что указатель s1 является именованной константой, а указатель s2 – переменной.             

  4.     Строковые константы заключаются в двойные кавычки в отличие от символов, которые заключаются в одинарные кавычки. Например,                 “This is a string.” Длина строковой константы не может превышать 509 символов по стандарту..      При инициализации строк размерность массива лучше не указывать, это выполнит компилятор, подсчитав длину строки и добавив к ней единицу. Например,                 char  s1[ ] = “This is a string.”;       

  5.      #include <string>  .  .  {  getline(cin,stroka);(ввод строки с клавы)  n=stroka.lenght(); (считает колл символов в строке)

  6. Функции для работы со строками объявлены в заголовочном файле string.h. Приведем некоторые из них:

  7. char *strcpy(char *dest, const char *src);

  8. копирует второй аргумент в первый. Возвращает указатель на копию. Память для dest должна быть заранее зарезервирована.

  9. char *strdup(const char *s);

  10. копирует строку во вновь создаваемую функцией malloc() область памяти. Возвращает указатель на созданную копию или 0 при неудаче. Программист ответственен за освобождение памяти функцией free();

  11. size_t strlen(const char *s);

  12. подсчитывает размер строки. Возвращает количество символов строки без нулевого символа. Тип size_t определен в файле string.h и других заголовочных файлах как целое без знака: typedef unsigned size_t;

  13. char *strcat(char *dest, const char *src);

  14. присоединяет вторую строку к первой. Возвращает указатель на начало нарощенной строки.

  15. char *strchr(const char *s, int c);

  16. сканирует строку s в поисках первого вхождения заданного символа с. Нулевой символ можно искать наряду с другими. Возвращает указатель на найденный символ или 0, если символа нет.

  17. char *strrchr(const char *s, int с);

  18. то же, что strchr, но находит последнее вхождение символа с в строку s.

  19. char *strstr(const char *s1, const char *s2);

  20. находит первое вхождение подстроки s2 в строку s1. Возвращает указатель на место первого вхождения или 0, если такового нет.

  21. int strcmp(const char *s1, const char*s2);

  22. сравнивает две строки. Возвращает целое меньше нуля, если s1 < s2, равное нулю, если s1 == s2, и большее нуля, если s1 > s2.

  23. char *strpbrk(const char *s1, const char *s2);

  24. сканирует первую строку в поисках первого вхождения любого символа из второй строки. Возвращает указатель на найденный символ или 0 при неудаче.

  25. char *strtok(char *s1, const char *s2);

  26. сканирует первую строку в поисках первого участка, не содержащего символов из s2.

  27. strcpy() (от слова copy – копирование)

  28. Реализуем копирование одной строки и её вставку на место другой строки.

  1. #include <iostream>

  2. using namespace std;

  3. int main()

  4. {

  5. setlocale(LC_ALL, "rus");

  6. char someText1[64] = "Сaйт purecodecpp.com!";

  7. char someText2[] = "Основы С++";

  8. cout << "Строка someText1 - \"" << someText1 << "\" \n";

  9. cout << "Строка someText2 - \"" << someText2 << "\" \n\n";

  10. int count = 0;

  11. while (true) // запускаем бесконечный цикл

  12. {

  13. someText1[count] = someText2[count]; // копируем посимвольно

  14. if (someText2[count] == '\0') // если нашли \0 у второй строки

  15. {

  16. break; // прерываем цикл

  17. }

  18. count++;

  19. }

  20. cout << "Строка someText1 после копирования someText2 -\n\"" << someText1 << "\" \n\n";

  21. return 0;

  22. }

  1. char *s

  2. char c

  3. char *strchr (s,c)

  4. поиск первого вхождения символа (с) в строке (s) В случаи удачного поиска возвращает указатель на место первого нахождения символа (с) а если не находит то возвращает NULL(пустой указатель)

  5. char *s1,*s2

  6. char *strstr(s1,s2)

  7. функция ищет в строке s1 подстроку s2 и возвращает на нее указатель или NULL если не найдено

  1. Функции сравнения строк.

  2. Пример 1:

  3. {char s1[]=”строчка”;

  4. Char s2[]=”строчка”;

  5. Cout<<”s1==s1->”<<setw(2)<<strcmp(s1,s1)<<endl;

  6. Cout<<”s1<s2->”<<setw(2)<<strcmp(s1,s2)<<endl;

  7. Cout<<”s2>s1->”<<setw(2)<<strcmp(s2,s1)<<endl;

  8. System (“pause”);

  9. Return 0;

  1. функция конкатенации строк.

  2. Конкатенация- Объединение строк.

  3. {char str[100];

  4. Strcpy(str,”эти”);

  5. Strcpy (str,”строки”);

  6. Strcpy (str,”объединены”);

  7. Cout<<str<<endl;

  8. Char *s1,*s2;

  9. Char *strcat(s1,s2) //присоединяет к строке s1 строку s2

  10. Char *s1,*s2;

  11. Int n;

  12. Char *strcat(s1,s2,n); // присоединяет n-символов строки s2 к строке s1.

Соседние файлы в предмете Программирование на C++