.:: Категории каталога ::. |
Разное
[5]
Различные темы по программированию
|
Пакет SWT
[4]
Практикуемся в написании оконных приложений на Java
|
Среды разработки, компиляторы и т.п
[3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
|
Java
[8]
Объектно-ориентированные соображения.
|
Си++
[19]
Коротко и ясно
|
Ассемблер
[6]
Машинные коды, побитно :)
|
|
|
.:: Коментируем ::. |
 |
Лабораторная работа №4
Code #include <iostream> #include <locale.h>
/* strlen() strcat() strcpy() strcmp() */
int dlina1(char* a) { char *p=a; for (;*a++;); return (a-p-1); };
int dlina2(char* b) { int c=0; for (; *b; b++,c++); return c; };
int dlina3 (char* c) { char* p=c; while(*c++); return (c-p-1); };
void kopir (char* a, char* b) { do { *a=*b; a++; } while(*b++); };
char* sravn (char* a, char* b) { do { if (*a!=*b) return ("Строки различаются"); } while ((!*a)&&(!*b)); return "Строки эквивалентны"; };
void konkat (char* a, char* b) { int dl = dlina2(a); do { *(a+dl)= *b; dl++; } while(*b++); };
void main (void) { setlocale(LC_ALL,"Rus");
char str1[15] = "qwerty", str2[15]="1234567890"; std::cout << "Исходная строка str1= " << str1 << ", str2= "; std::cout << str2 << std::endl; // std::cout << "Длина str1= " << dlina1(str1) << ", str2= "; std::cout << dlina1 (str2) << std::endl; std::cout << "Длина2 str1= " << dlina2(str1) << ", str2= "; std::cout << dlina2 (str2) << std::endl; std::cout << "Длина3 str1= " << dlina3(str1) << ", str2= "; std::cout << dlina3 (str2) << std::endl;
obmen (str1, str2); std::cout << "Обмен: str1= "<< str1 <<", str2= " << str2 << std::endl; kopir (str1, str2); std::cout << "Результат копирования: str1= " << str1; std::cout << ", str2= " << str2 << std::endl;
std::cout << "Результат сравнения str1 и str2: " << sravn (str1,str2) << std::endl; konkat (str1, str2); std::cout << "Результат соединения строк: str1= " << str1; std::cout << ", str2= " << str2 << std::endl; system ("PAUSE"); } Функцию strlen() заменяем аж 3-мя самописными. Все функции умещаются в три строки. Рассмотрим первую. Code int dlina1(char* a) { char *p=a; for (;*a++;); return (a-p-1); }; Принимаемым параметром функции является указатель на символ. В теле функции создаём локальный указатель на символ и присваиваем ему принимаемый параметр функции. Создаём хитрый цикл (такое описание цикла выглядит впечатляюще, особенно для начинающих программистов), в котором увеличивается значения указателя + проверяется детерминирующее условие. Напомню что указатель хранит адрес памяти по которому хранится переменная, т.е. увеличивая значение указателя мы проходим по символам строки. Как только мы дойдём до конца строки, цикл прерывается. Возвращаемое значение целочисленного типа. Адрес a увеличивался, если из него вычесть начальное значение адреса p и минус 1, то получится размер строки. Code int dlina2(char* b) { int c=0; for (; *b; b++,c++); return c; }; Эта функция попроще. Создаём счётчик, обнуляем. Увеличиваем значение адреса, увеличиваем значение счётчика, проверяем что находится по адресу, если дошли до конца строки то возвращаем значение счётчика. Code int dlina3 (char* c) { char* p=c; while(*c++); return (c-p-1); }; Этот код похож на первую функцию, заменён цикл, логика та же. Копирование. Code void kopir (char* a, char* b) { do { *a=*b; a++; } while(*b++); }; В этой функции мы копируем данные с одного адреса в другой, пока не дойдём до конца строки b. Сравнение. Code char* sravn (char* a, char* b) { do { if (*a!=*b) return ("Строки различаются"); } while ((!*a)&&(!*b)); return "Строки эквивалентны"; }; Сравнение тоже просто, значения адресов сравнивается, если хоть одно значение не совпадёт, значит строки не равны (эквивалентны, если по научному). Конкатенация (слияние строк) Code void konkat (char* a, char* b) { int dl = dlina2(a); do { *(a+dl)= *b; dl++; } while(*b++); }; Определяем длину строки к которой будем присоединять, создаём переменную смещения, увеличиваем смещение и записываем значения адреса b приращиваемой строки, цикл закончится при достижении конца приращиваемой строки. (В этой функции уже пользуемся своей собственной функцией dina2 (можно и 1 и 3 использовать)) Ну и напоследок обмен строк, используем так же свою ранее созданную функцию. Code void obmen (char* a, char *b) { char c[15];
kopir (c,b); kopir (b,a); kopir (a,c); }; Массив c должен быть фиксированной длины (у нас это 15, так как мы работаем со строками именно такой длины, смотрите в функции main), иначе работать не будет. Копируем вторую строку в промежуточный буфер, затем первую во вторую и наконец из буфера в первую. Обмен произведён. Удачных экспериментов.
|
Категория: Си++ | Добавил: C0demaker (14.10.2009)
|
Просмотров: 1622
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|