- •1. Понятие информации и алгоритма. Формы представления алгоритма.
- •2. Блок-схемы разветвляющихся алгоритмов.
- •3. Блок-схемы циклических алгоритмов.
- •5. Определение переменных. Переменные и константы.
- •6. Операции присваивания. Особенности выполнения.
- •8. Потоковый и форматированный ввод-вывод.
- •9. Использование манипуляторов при вводе и выводе данных.
- •10. Строковый и символьный ввод-вывод информации.
- •12. Особенности синтаксиса и выполнения операторов перехода continue, break.
- •13. Оператор перехода goto. Оператор return.
- •17. Пространство имен. Ключевое слово using как директива.
- •18. Средства отладки программ в ms vs.
- •19. Выполнение приложения с использованием средств интерактивной отладки.
- •20. Выполнение приложения с использованием средств планируемой отладки.
- •21. Создание исполняемого файла.
- •24. Алгоритм метода дихотомии для решения уравнений.
- •27. Побитовые логические операции (конъюнкция, дизъюнкция, сдвиги, инвертирование).
- •28. Символы, строки (объявление, инициализация).
- •Void main()
- •Void main()
- •29. Алгоритмы работы со строками (подсчет дины строки, объединение строк, удаление заданного символа).
- •30. Стандартные функции работы со строками.
- •31. Логические переменные и примеры их использования в программах.
- •32. Понятие указателя.
- •33. Операции над указателями.
- •34. Массивы и указатели. Понятие индекса. Инициализация. Доступ к компонентам.
- •35. Указатели и строки. Примеры работы (объединение строк, поиск заданного символа).
- •36. Матрицы. Инициализация, ввод, вывод.
- •Void main()
- •Int b[nstr][nstb];
- •37. Связь между указателями и элементами матриц. Алгоритмы поиска минимума и суммы элементов матрицы (через указатели).
- •38. Указатели на указатели.
- •39. Динамические переменные. Функции и операторы работы с динамическими переменными. Основ-ные свойства.
- •40. Динамические массивы. Понятие статического и динамического объекта, массива.
29. Алгоритмы работы со строками (подсчет дины строки, объединение строк, удаление заданного символа).
Работа со строкой
Обычно для перебора символов строки применяется адресная арифметика. Поскольку строка всегда заканчивается нулевым символом, можно увеличивать указатель на 1, пока очередным символом не станет нуль.
Например: while (*st1++) (…)
Здесь st1 разыменовывается, и получившееся значение проверяется на истинность. Любое отличное от нуля значение считается истинным, и, следовательно, цикл заканчивается, когда будет достигнут символ с кодом 0. Операция инкремента ++ прибавляет 1 к указателю st1 и таким образом сдвигает его к следующему символу.
Подсчет длины строки может выглядеть следующим образом:
#include <stdio.h>
void main()
{ char st[ ] = "Text"; int c = 0; char *pst;
pst = &st[0];
if (st) while (*pst++) ++c;
printf("%dn", c);
}
Поскольку указатель может содержать нулевое значение (ни на что не указывать), перед операцией разыменования его следует проверять.
Строка встроенного типа может считаться пустой в двух случаях: если указатель на строку имеет нулевое значение (строки нет) или указывает на массив, состоящий из одного нулевого символа (строка не содержит ни одного значимого символа).
При работе со строкой можно, также как и в массивах, использовать нотацию индексов:
for(int i = 0; (s1[i] – s2[i] != ‘’; i++); //копирование строки
и нотацию указателей:
for(; (*s1 = *s2) != ‘’; s1++, s2++); //копирование строки
Использование строк встроенного типа чревато ошибками из-за слишком низкого уровня реализации и невозможности обойтись без адресной арифметики. Рассмотрим типичные ошибки.
Например:
const char *ste = “STRING ”;
int len = 0;
while (str++) ++len; //ошибка str не разыменовывается и не изменяется
Указатель str не разыменовывается, следовательно, на равенство 0 проверяется не символ, а сам указатель. Поскольку изначально этот указатель имел ненулевое значение (адрес строки), то он никогда не станет равным нулю, и цикл будет выполняться бесконечно.
Строка представляет собой последовательность символов. Большинство программ, обрабатывающих строки, используют последовательный или посимвольный просмотр строки. Если же в процессе обработки строки предполагается изменение ее содержимого, то проще всего (но не всегда эффективно) организовать его в виде посимвольного переписывания входной строки в выходную. При этом каждой строке требуется отдельный индекс, если для входной строки он может изменяться в заголовке цикла посимвольного просмотра, то для выходной строки он меняется только в моменты добавления очередного символа. Кроме того, не нужно забывать «закрывать» выходную строку символом конца строки.
Пример. Удаление лишних пробелов из строки:
#include <stdio.h>
void main()
{ char s1[] = "Te x t";
char s2[8]; int i, j;
for(j = 0, i = 0; s1[i] != 0; i++) // != -не равно
if(s1[i] != ' ') s2[j++] = s1[i];
s2[j] = 0;
puts(s2);
}
Пример проверки правильности расстановки круглых скобок в строке:
#include <stdio.h>
void main()
{ char s[256]; int i, c;
printf("Enter string: ");
gets(s);
for(c=i=0;s[i] != 0; i++) //не равно
{ if(s[i]=='(') c++;
if(s[i]==')') c--; }
if(!c) printf("Ok "); //c==0
else
printf("Not Ok ");
}