Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Краткий справочник.rtf
Скачиваний:
3
Добавлен:
22.07.2019
Размер:
516.8 Кб
Скачать

Описание двумерных массивов

Описание массива имеет следующий вид

<тип элементов> <имя массива>[<кол-во строк>][<кол-во стоблцов>];

Например,

float a[3][5];

int c[7][8];

Доступ к элементам матрицы осуществляется через имя матрицы и номера строки и столбца, на пересечении которых стоит этот элемент

<имя матрицы>[<номер строки>][<номер столбца>],

номерами строки и столбца могут быть константы или выражения целого типа в диапазоне от 0 до <кол-во строк (столбцов)> - 1. Например, x[0][0], a[2][4], y[2*i-1][0].

Ввод матриц.

Рассмотрим два сценария ввода матриц;

1) 1 сценарий – ввод каждой строки матрицы в отдельной строке

#include <stdio.h>

#include <conio.h>

void main()

{float x[5][7];

int i,j;

clrscr();

for (i=0; i<5; i++)

{printf(“введите элементы %d строки матрицы\n”,i)

for (j=0; j<7; j++)

scanf(“%f”,&x[i][j]);

}

getch();

}

2) 2 сценарий – ввод элементов по одному в строке с приглашением к вводу элемента;

#include <stdio.h>

#include <conio.h>

void main()

{ float x[5][7];

int i,j;

clrscr();

printf(“введите матрицу x\n”);

for (i=0; i<5; i++)

for (j=0; j<7; j++)

{ printf(“x[%d][%d]=”,I,j);

scanf(“%f”,&x[i][j]);

}

getch();

}

Вывод матриц.

Схема алгоритма вывода матрицы имеет вид

#include <stdio.h>

#include <conio.h>

const int n=5;

const int m=7;

void main()

{float x[n][m];

int i,j;

clrscr();

printf(“матрица x\n”);

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

{ for (j=0; j<m; j++)

printf(“%5.3f “,x[i][j]);

printf(“\n”);

}

getch();

}

Пример1.

Ввести с клавиатуры матрицу B[3][4]. Вывести ее.

#include <stdio.h>

#include <conio.h>

void main()

{ float B[3][4];

int i,j;

clrscr();

for (i=0; i<3; i++)

{ printf(“введите с клавиатуры %d строку матрицы B|n”);

for (j=0; j<4; j++)

scanf(“%f”,&B[i][j]);

}

printf(“Матрица B\n”);

for (i=0; i<3; i++)

{ for (j=0; j<4; j++)

printf(“%5.3f “,B[i][j]);

printf(“\n”);

}

getch();

}

  1. Формирование матриц с помощью датчика случайных чисел.

Схема алгоритма формирования матрицы с помощью датчика случайных чисел имеет вид

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

const int n=6;

const m=8;

void main()

{int x[n][m],i,j;

clrscr();

randomize();

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

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

x[i][j]=random(100)-50;

printf(“матрица x\n”);

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

{for (j=0;j<m;j++)

printf(“%5d “,x[i][j]);

printf(“\n”);

}

getch();

}

Пример2.

С помощью датчика случайных чисел сформировать матрицу D[7][9]. Вывести ее на экран. Определить сумму всех ее элементов.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

const int n=7;

const m=9;

void main()

{int D[n][m],i,j;

float s;

clrscr();

randomize();

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

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

D[i][j]=random(100)-50;

printf(“матрица D\n”);

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

{for (j=0;j<m;j++)

printf(“%5d “,D[i][j]);

printf(“\n”);

}

s=0;

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

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

s=s+D[i][j];

printf(“s=%f”,s);

getch();

}

Массивы символов в C++

Стро­ки в C++ представляются как массивы элементов типа char, за­канчивающиеся терминатором строки - символом с кодом нуль ('\0').

Описание, определение строк

char <имя строки>[<кол-во элементов>];

При объявлении строкового массива необходимо принимать во внимание наличие нуль‑символа в конце строки, отводя тем самым под строку на один байт больше:

Пример.

char s[10]

// 10= 9 символов + 1 терминатор;

// s[0], s[1], …s[8] – символы; s[9] - терминатор

Строковый массив может при объявлении инициализировать­ся начальным значением.

char s1[20]=”это первая строка”;

При определении строк можно не указывать количество элементов. При этом компилятор автоматически вычислит размер будущей строки и добавит в конец нуль-символ:

char s2[]=”это вторая строка”;

Для задания длины массива компилятор определяет количество символов в строковой константе (в примере - 17 символов) и увеличивает его на 1 (для нуль-символа). Затем под строку резервируется полученное число байт (18). После чего строке s1 присваивается значение “это вторая строка”.

char Wednesday [] = "Среда";

// что равносильно:

//char Wednesday[] ={'С', 'р','е','д','а','\0'};

Ввод, вывод строк.

Ввод строки осуществляется с помощью функции gets(s) библиотеки stdio. Последовательность символов, набранная на клавиатуре, завершается нажатием Enter. Все набранные символы записываются в строку, код клавиши Enter в строку не записывается, в конце строки дописывается нуль-символ. При этом количество введенных символов не должно превышать максимально допустимого.

Вывод строки осуществляется с помощью функции puts(s) библиотеки stdio. После вывода строки на экран, функция puts(s) переводит курсор в начало следующей строки.

Вывод строки на экран можно осуществлять также с помощью функции printf с форматной спецификацией %s, например:

printf(“%s”,s1)

В этом случае вывод осуществляется по правилам работы функции printf.

Определение длины строк

Функция strlen(s) вычисляет количество символов строки, исключая нуль-символ, и возвращает полученное целое число.

char S[] = "ABCDEFGHIJK" ;

int i;

i = strlen(S) ;

В программе со строкой можно работать как с массивом символов.

s[i] – это i-ый символ строки (i = 0, 1, …, <длина строки>-1);

c s[i] допустимы все операции, определенные для символьных переменных.

Пример.

Ввести строку, содержащую буквы, цифры и пробелы. Определить количество цифр в строке.

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{char s[100]; // объявление строки из 100 символов

int i, // параметр цикла

k=0; // количество цифр

clrscr();

printf(“введите строку “);

gets(s); // ввод строки с клавиатуры

for (i=0;i<strlen(s);i++)

if ((s[i]>=’0’)&&(s[i]<=’9’)) // если символ является цифрой

k++; // подсчет количества цифр

printf(“k=%d”,k); // количество цифр выводится на экран

getch();

}

Пример.

Ввести с клавиатуру строку, состоящую из нескольких предложений. Каждое предложение заканчивается точкой. Определить количество предложений в строке. (Количество предложений равно количеству точек)

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{char s[100];

int i,k=0;

clrscr();

printf(“введите строку “);

gets(s);

for (i=0;i<strlen(s);i++)

if (s[i]==’.’)

k++;

printf(“k=%d”,k);

getch();

}

Разделение строк на слова.

Пример.

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

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{char s[100], //вводимая строка

w[100]; //выделяемые слова

int i, //номер символа в строке

j, //номер символа в слове

k; //количество слов

clrscr();

printf("введите строку ");

gets(s);

k=0; //обнуляем количество слов

j=0; //обнуляем номер символа в строке для первого слова

for (i=0;i<strlen(s);i++)

if (s[i]!=' ') //если символ в строке не равен пробелу

{ w[j]=s[i]; //записываем символ в слово

j++; //увеличиваем на 1 номер символа в слове

}

else // символ в строке равен пробелу

if (j>0) //в слово были записаны символы

{ w[j]=0; //записываем в конец слова нуль-символ

puts(w); //выводим слово на экран

k++; //увеличиваем на 1 количество слов

j=0; //обнуляем номер символа в слове для следующего слова

}

if (j>0) //в слово были записаны символы -

// строка кончается не пробелом

{w[j]=0; //записываем в конец слова нуль-символ

puts(w); //выводим слово на экран

k++; //увеличиваем на 1 количество слов

}

printf("k=%d",k);

getch();

}

Сравнение двух строк.

Пример.

Ввести с клавиатуры две строки s1 и s2. Определить равны ли эти строки друг другу.

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{char s1[100], s2[100];

int i, //параметр цикла

p; //признак: p==0, если строки равны; p==1, если строки не равны

clrscr();

printf(“введите первую строку “);

gets(s1);

printf(“введите вторую строку “);

gets(s2);

if (strlen(s1)!=strlen(s2))

p=1; //строки имеют разную длину – значит они не равны

else //строки имеют одинаковую длину

{p=0; //предполагаем, что строки s1 и s2 равны

for (i=0; i<strlen(s1);i++)

if (s1[i]!=s2[i])

p=1; //символы не равны – значит не равны и строки

}

if (p==0)

printf(“строки s1 и s2 равны друг другу “);

else

printf(“строки s1 и s2 не равны друг другу”);

getch();

}

Для сравнения строк в заголовочном файле <string.h> описана функция strcmp(s1,s2).

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{char s1[100], s2[100];

int i, //параметр цикла

p; //признак: p==0, если строки равны; p<>0, если строки неравны

clrscr();

printf(“введите первую строку “);

gets(s1);

printf(“введите вторую строку “);

gets(s2);

p=strcmp(s1,s2); // p == 0, если строки s1 и s2 равны между собой;

// p < 0, если s1 меньше s2,

// т.е. если расположить строки s1 и s2 в алфавитном порядке,

// строка s1 будет расположена ближе к началу списка, чем строка s2;

// p > 0, если s1 больше s2

if (p==0) printf(“строки s1 и s2 равны друг другу “);

else printf(“строки s1 и s2 не равны друг другу”);

getch();

}

Эта функция производит сравнение, различая прописные и строчные буквы. Следующий пример иллюстрирует работу функции strcmp(s1,s2):

char s1[]="Moscow";

char s2[]="MOSCOW" ;

int i;

i = strcmp(s1, s2);

В результате переменной i будет присвоено положительное значение, так как строка из s1 больше, чем строка из s2, по той причине, что строчные буквы имеют код символов больше, чем те же прописные буквы.

Функция stricmp(s1,s2) из библиотеки <string.h> также используется для сравнения строк, но при этом не различает регистра символов.

char s1[]="Moon";

char s2[]="MOON";

int i;

i = stricmp(s1, s2) ;

В данном случае переменной i будет присвоено значение 0, сигнализируя тем самым совпадение строк, так как s1 и s2 отличаются только регистром.

Функция strncmp(s1,s2,n) проводит сравнение n первых символов двух строк. Регистр символов при этом учитывается.

char s1[]«"Ошибка открытия базы";

char s2[]"Ошибка Открытия базы";

int i;

i = strncmp (s1, s2, 12);

В результате сравнения первых 12-ти символов обеих строк переменная i получит положительное значение, так как подстро­ки "Ошибка откры" и "Ошибка Откры" отличаются одним символом и в первом случае код символа больше, чем во втором.

Функция strnicmp(s1,s2,n) производит сравнение n первых символов двух строк, не обращая внимания на ре­гистр символов. В следующем примере производится сравнение заданного числа символов подстрок:

char s1[]="Opening error";

char s2[]="Opening Error...";

int i;

i " strnicmp(s1, s2, 13);

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

Копирование строк

Функция strcpy(s1,s2) выполняет побайтное копирование символов строки s2 в строку s1. Перед копированием необходимо удосто­вериться, что длина s2 меньше или равна длине s1. В про­тивном случае возможно возникновение ошибок.

Например, следующий фрагмент копирует в строку Str зна­чение строки "Проверка копирования":

char Str[20] ;

strcpy(Str, "Проверка копирования";

Можно производить копирование не всей строки, а лишь от­дельного ее фрагмента.

Функция strncpy(s1,s2,n) копирует первые n символов строки s2 в s1. Недостающие символы заполняются пробелами, лишние символы отбрасываются.

Конкатенация строк

Конкатенация (или присоединение) строк ис­пользуется для образования новой строки символов.

Функция strcat(s1,s2) приписывает строку s2 в конец строки s1.

В следующем примере строка s1 инициализируется с помо­щью функции копирования strcpy() и дополняется подстро­кой, используя функцию strcat():

// ………

char s1[80] ;

strcpy(s1, "Для продолжения ");

strcat(s1, "нажмите клавишу") ;

// ………

Функция strncat(s1,s2,n) приписывает первые n символов строки s2 в конец строки s1:

// ………

char s1[80] ;

strcpy(s1, "Для продолжения ");

strncat(s1, "нажмите клавишу", 7) ;

puts(s1);

// ………

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

Преобразование строк

Функция strlwr(s) преобразует буквы верхнего регистра в строке s в соответствующие буквы нижнего регистра.

Функция strupr(s) преобразует буквы нижнего регистра в строке s в соответствующие буквы верхнего регистра.

// ………

char s1[] = "ABRACADABRA";

char s2[]="pacific ocean";

strlwr(s1);

strupr(s2);

puts(s1);

puts(s2);

// ………

В результате будет выведено:

abracadabra

PACIFIC OCEAN

Обращение строк

Функция strrev(s) меняет порядок сле­дования символов в строке s на обратный.

// ………

char s[ ]="Привет" ;

strrev(s);

puts(s);

// ………

В результате на экране будет выведана строка "тевирП".

Поиск символов

Функция strchr(s,c) ищет в строке s первое вхождение символа c. Возвращает указатель на место первого вхождения символа в строку s. Если указанный сим­вол не найден, функция возвращает null.

char s[] - "Унылая пора, очей очарованье ";

char *p;

p = strchr(s, 'ч');

В результате работы программы указатель p будет указы­вать на подстроку "чей очарованье" в строке s.

Функция strrchr(s,c) ищет в строке s последнее вхождение символа c. Возвращает указатель на место последнего вхождения символа в строку s. Если указанный сим­вол не найден, функция возвращает null.

char s[] - "Унылая пора, очей очарованье ";

char *p;

p = strrchr(s, 'ч');

В результате работы программы указатель p будет указы­вать на подстроку "чарованье" в строке s.

Функция strspn(s1,s2) проводит сравнение символов строк и возвращает позицию (начиная с нуля), в которой строки перестают совпадать. В результате рабо­ты функции возвращается число совпавших символов.

char s1[]= "Загрузка параметров";

char s2[]= "Загрузка параметррррр" ;

int n=0;

n = strspn(s1, s2) ;

В результате работы программы переменная n получит значение 17, так как символы строк s1 и s2 совпадают вплоть до 17-й позиции. Приведенная функция различает регистр символов.

Функция strcspn(s1,s2) определяет длину первого сегмента строки s1, содержащего только символы, не входящие в строку s2.

char s1[] = "abcdefg";

int n;

n = strcspn(s1, "help");

Переменная n получит значение 4, так как в этой пози­ции строки имеют первый общий элемент.

Функция strpbrk(s1,s2) ищет в строке s1 первый символ, совпадающий с одним из символов строки s2. Если символ найден, функция возвра­щает указатель на первый символ строки s1, совпадающий с одним из символов строки s2. Если символов строки s2 в строке s1 нет - функция возвращает NULL.

char s1[] = "abcde";

char s2[] = "dub";

char *p;

p = strpbrk(s1, s2);

puts(p);

В результате будет выведена подстрока "bcde", так как символ 'b' из строки s2 встречается в строке s1 раньше других.

Поиск подстрок

Функция strstr(s1,s2) ищет в строке s1 место первого вхождения подстроки s2 в строку s1. В случае успешного поиска функция возвращает указатель на первый символ строки s1, с которого начинается подстрока s2. Если подстрока s2 не найдена в s1, функция возвращает NULL.

char s1[]="Производится поиск элемента";

char s2[]="поиск";

char *p;

p=strstr(s1, s2);

puts(p);

На экран будет выведено "поиск элемента", так как ­строка s2 находится внутри строки s1, и функция strstr(s1,s2) установит указатель p на первый символ подстроки "поиск" строки s1.

Функция strtok(s1,s2) выделяет в строке s1 первый сегмент, расположенный до любого из символов строки s2. Если символов строки s2 в строке s1 нет, то искомым сегментом является вся строка s1. Если строка s1 пустая, то функция strtok(s1,s2) имеет значение NULL.

Функция strtok(NULL,s2) – выделяет в заданной ранее строке следующий сегмент, ограниченный любым из символов строки s2.

Предположим, необходимо разбить имеющееся в строковом массиве предложение по словам и вывести каждое из них на экран.

char s[]="Язык программирования C++";

char *p;

p = strtok(s," .,");

while(p!=NULL)

{puts(p);

p= strtok(NULL," .,");

}

В результате работы программы на экран будет выведено:

Язык

Программирования

C++

Т.к. функция strtok() модифици­рует исходную строку , рекомендуется предварительно сохранять ее копию.

Пример.

Ввести с клавиатуры строку, состоящую из слов разделенных любым числом пробелов. В начале и в конце строки может быть также любое число пробелов. Сформировать массив из слов этой строки. Определить количество слов. Вывести каждое слово на отдельной строке экрана. Определить самое короткое слово. Отсортировать слова в алфавитном порядке.

#include <string.h>

#include <stdio.h>

#include <conio.h>

void slowa(char s[], char w[][10], int &k)

//s - исходная строка, w - массив слов, k - количество слов

{char *p; //указатель на выделяемое слово

k=0; // количество слов = 0

p=strtok(s," .,"); //выделяем первое слово

while (p!=NULL)

{if (strlen(p)>0) //было выделено непустое слово

{strcpy(w[k],p); //копируем выделенное слово в массив

k++; //увеличиваем на 1 количество выделенных слов

}

p=strtok(NULL," .,"); //выделяем следующее слово

}

}

void print_slowa(char w[][10], int k)

{int i;

for (i=0;i<k;i++)

puts(w[i]);

}

void MIN_slowo(char w[][10], int k, char min_slowo[])

{int i;

strcpy(min_slowo,w[0]);

for (i=1;i<k;i++)

if (strlen(w[i])<strlen(min_slowo))

strcpy(min_slowo,w[i]);

}

void sort_slowa(char w[][10], int k)

{int i,j;

char s[80];

for (i=0;i<k-1;i++)

for (j=i+1;j<k;j++)

If (strcmp(w[i],w[j])>0)

{strcpy(s,w[j]);

strcpy(w[j],w[i]);

strcpy(w[i],s);

}

}

void main()

{char s[100], w[10][10], min_slowo[10];

int k;

clrscr();

printf("введите строку ");

gets(s);

slowa(s,w,k);

printf("выделенные слова\n");

print_slowa(w,k);

printf("количество слов = % d", k);

MIN_slowo(w,k,min_slowo);

printf("min_slowo = %s", min_slowo);

getch();

}

Функции преобразования типа

Функция atoi(s) преобразует строку s в число типа int. Если в строке встречается символ, который не мо­жет быть преобразован, данная функция возвращает 0. В случае ес­ли преобразуемое число превышает диапазон представления типа int, возвращается только два младших байта числа.

Функция atol(s) преобразует строку s в число типа long. Если преобразуемое число превышает диапазон значений типа long, функция возвратит непредсказуемое значение.

Функция atof(s) преобразует строку s в вещественное число типа double. Преобразование символов прекращается, как только найден первый неконвертируемый символ или достигнут конец строки.

Функция itoa(v,s,baz) преобразует целое v в строку s. Число в строке записывается в системе счисления с основанием baz (2<=baz<=36). Для отрицательного числа в десятичной системе счисления первый символов строки - знак “минус”

Функция ltoa(v,s,baz) преобразует длинное целое v в строку s. Число в строке записывается в системе счисления с основанием baz (2<=baz<=36).

Пример.

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

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <math.h>

void main()

{ char s[80], //вводимая строка

p[80], //рабочая строка для сохранения введенной информации

*s1, //указатель на строку – первый операнд

*s2; //указатель на строку – второй операнд

float x, //первый операнд

y, //второй операнд

c; //результат

int n; // номер знака операции в строке

clrscr();

printf(“введите строку “);

gets(s);

strcpy(p,s); //копируем введенную строку в p для сохранения информации

s1=strtok(s,”+-*/”); //выделение подстроки – первого операнда

s2=strtok(NULL,”+-*/”); //выделение подстроки – второго операнда

x=atof(s1); //перевод первого операнда из строки в число

y=atof(s2); //перевод второго операнда из строки в число

n=strcspn(p,”+-*/”); //определение количества символов в строке до знака

switch (p[n])

{ case ‘+’: c=x+y; break;

case ‘-‘: c=x-y; break;

case ‘*’: c=x*y; break;

case ‘/’: c=x/y;

}

printf(“c=%f”,c);

getch();

}

Функции работы со строками.

В таблице приведены некоторые функции, содержащиеся в библиотеке <string.h>

Наименование

Краткое описание

strlen

возвращает длину строки в байтах, исключая нуль-символ

strcmp

сравнивает строки, различая про­писные и строчные буквы

stricmp

сравнивает строки, не различая прописные и строчные буквы

strncmp

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

strnicmp

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

strcpy

копирует строку2 в строку1

strncpy

копирует заданное число символов строки2 в строку1

strcat

присоединяет строку2 в конец строки1

strncat

присоединяет заданное число символов строки2 в конец строки1

strlwr

преобразует все символы строки в строчные буквы

strupr

преобразует все буквы строки в прописные буквы

strrev

меняет порядок следования символов в строке на обратный

strchr

возвращает указатель на место первого вхождения сим­вола в строку

strrchr

возвращает указатель на место последнего вхождения сим­вола в строку

strspn

возвращает позицию, с которой строки перестают совпадать

strcspn

определяет длину первого сегмента строки1, содержащего только символы, не входящие в строку2

strpbrk

возвращает указатель на первый символ строки1, совпадающий с одним из символов строки2

strstr

возвращает указатель на место первого вхождения строки2 в строку1

strtok

выделяет в строке1 первый сегмент, расположенный до любого из символов строки2

atoi

преобразует строку символов в строку типа int

atol

преобразует строку символов в число типа long

atof

преобразует строку символов в число с пла­вающей точкой

itoa

преобразует число типа int в строку символов

Itoa

преобразует число типа long в строку сим­волов

strset

заполняет строку заданным символом

strnset

заполняет заданное число первых позиций строки заданным символом

strdup

выделяет память и переносит в нее копию строки