- •Введение
- •Блок-схема алгоритма
- •Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Основные понятия языка С(С++)
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Структура программы на языке С(С++)
- •Операции и выражения
- •sizeof
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Операторы языка С(С++)
- •Понятие пустого и составного операторов
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Примеры программ
- •Массивы
- •Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели
- •Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Передача массива в функцию
- •inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Вершина стека
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Стек
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Файлы
- •Примеры программ
- •Литература
void main() |
// функция определения длины строки |
{ char s[5]; |
|
char *st; |
// вариант 1 ввода строки s |
|
|
gets(s); |
// ввод строки s |
st=s; |
// st указывает на строку s |
printf("\n s=%s *st=%s",s,st); |
|
|
// вариант 2 ввода строки s |
st=gets(s); |
// ввод строки s и указателя st на нее одновременно |
printf("\n s=%s *st=%s",s,st);
}
Во втором варианте ввода сроки gets возвращает не только символьную строку s, но и инициализирует указатель на нее st. В первом варианте для получения адреса строки s в st выполняли st=s. Если в приведенном примере использовать в качестве аргумента в функции gets() указатель st, то он должен быть до этого инициализирован, например:
st=(сhar *) malloc(sizeof(char)*5);
При этом указатель st уже будет указывать на зарезервированные 5 байт памяти, отведенные под строку.
Кроме того, функция gets() включает разряд проверки ошибки. То есть если произошла ошибка ввода или gets() встретила символ EOF, она возвращает нулевой адрес (NULL). Это упрощает контроль на EOF:
char s[10]; while(gets(s)!=NULL);
по сравнению с тем, как это выполняется при использовании функции getchar():
char s; while((s=getchar())!=EOF);
При работе с функцией gets() необходимо помнить, что она не выполняет контроль на переполнение символьной строки, в некоторых случаях это может иметь неприятные последствия (порча памяти).
Функция puts() предназначена для вывода символьной строки. В качестве единственного аргумента является указатель на выводимую строку:
char st[5]; |
|
. . . |
( тело функции ) |
puts(st); |
|
Функции работы со строками.
К числу наиболее часто используемых функций работы со строками можно отнести следующие: strlen(), strcat(), strcmp(), strcpy() и другие [3,10,11].
Примеры программ
Пример . Удалить из строки символов подстроку заключенную в [ ].
#include<stdio.h>
#include<stdlib.h>
#include<conio.h> void main()
{char *ss; int i,j,k,n;
scanf("%d",&k); ss=(char *)malloc(k);
printf("введите строку символов "); fflush(stdin); // чистка входного буффера gets(ss);
printf("\nИсходная строка символов : %s",ss);
j=-1; |
// позиция открывающей скобки '[' в строке |
for(i=0;*(ss+i);i++) |
// цикл прохода по строке до ее конца |
{ if (*(ss+i)=='[') |
// скобка найдена |
{ j=i; |
|
while(*(ss+ ++j)!=']' && *(ss+j)!='[' && *(ss+j));
if (*(ss+j)=='[') i=j-1; // позиция вложенной скобки [ (теперь
//основной)
//во внешнем цикле по i увеличится значние i
else if(*(ss+j++)==']') // позиция закрывающей скобки
{n=i;
while(1)
if(!(*(ss+n++)=*(ss+j++))) break; // сжатие строки (удаление
//подстроки)
i--; // после сжатия надо проверить первый из символов // сдвинутых на [...] не является ли он сам [
}
}
}
printf("\nCжатая строка символов : %s",ss);
}
Пример . Ввести символьную строку и выполнить в ней удаление предпоследнего слова. Слова в строке разделены одним пробелом.
#include <stdio.h> #include <stdlib.h> main()
{int kk,k,n; char *s;
puts("введите длину строки "); scanf("%d",&n);
s=(char*)malloc(n); |
|
|
if(!s) return 0; |
// |
ошибка выделения памяти |
fflush(stdin); |
// |
чистка входного потока |
puts("введите строку: ");
gets(s);
puts("исходная строка: ");
puts(s); |
|
|
|
k=0; |
|
|
|
while(*(s+k)) |
k++; |
// переход в конец строки. k – позиция ‘\0’ |
|
while(*(s+k)!=' ') k--; // позиция пробела перед последним словом |
|||
kk=k--; |
|
// запоминаем в kk позицию пробела и сдвиг на |
|
|
|
// последний символ предпоследнего слова в строке |
|
while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом |
|||
while(*(s+ ++k)=*(s+ ++kk)); // удаление предпоследнего слова (запи- |
|||
|
|
|
// сываем на его место последнее слово) |
puts("преобразованная строка: "); |
|||
puts(s); |
|
|
|
} |
|
|
|
Пример |
. |
Ввести |
символьную строку и выполнить в ней замену |
местами последнего и предпоследнего слов. |
|||
#include <stdio.h> |
|
||
#include <stdlib.h> |
|
||
main() |
|
|
|
{ int kk,k,n; |
|
|
|
char *s,*s1,t; |
|
|
|
scanf("%d",&n); |
|
||
s=(char*)malloc(n); |
// выделение памяти без инициализации |
||
s1=(char*)calloc(n,1); |
// выделение памяти с инициализацией |
||
if(!s||!s1) return 0; |
|
||
fflush(stdin); |
|
|
|
gets(s); |
|
|
|
k=0; |
|
|
|
while(*(s+k)) k++; |
// переход в конец строки. k – позиция ‘\0’ |
||
while(*(s+k)!=' ') k--; // позиция пробела перед последним словом |
k--;
while(*(s+k)!=' ') k--; // позиция пробела перед предпоследним словом
kk=++k; |
// запоминаем позицию первого символа этого слова |
n=0; |
// перезапись в строку s1 предпоследнего слова |
while(*(s+k)!=' ') *(s1+n++)=*(s+k++); |
|
k++; |
// запись последнего слова на предпоследнее |
while(*(s+k)) *(s+kk++)=*(s+k++); |
|
*(s+kk++)=' '; |
// вставка пробела после слова |
n=0; |
// дозапись слова из строки s1 |
while(*(s+kk++)=*(s1+n++)); |
|
printf("%s",s); |
|
free(s); free(s1); |
// освобождение памяти |
} |
|
Пример . Создать массив указателей на слова для каждой вводимой строки. Строка может содержать до 10 слов. Используя массив указателей исключить из каждой строки cлово с максимальной длинной.
#include <stdio.h> #include <stdlib.h> #define size 2
void fff(char *,char *); void main()
{char *st[size][10],*mst,*pst; int i,j,n=0,k=0,kk=0;
n=0; do
{ st[n][0]=(char *)malloc(20); // выделение памяти под строку gets(st[n][0]); // ввод строки
} while(*st[n++][0]); n--;
for(i=0;i<n;i++)
{k=0;
for(j=0; *(st[i][0]+j); j++)
if(*(st[i][0]+j)==' ') |
// найден пробел - конец слова |
st[i][++k]=st[i][0]+j+1; // адрес начала слова |
|
st[i][++k]=st[i][0]+j+1; |
// адрес ’\0’ (для последнего слова) |
for(; k<9; ) |
|
st[i][++k]=NULL; |
// остальные адреса для слов в строке |
} |
|
for(i=0; i<n; i++) |
// перебор строк |
for(j=0; st[i][j]; j++) |
// перебор слов в строке |
fff(st[i][j],st[i][j+1]); |
// сравнение 2 слов для поиска max |
for(i=0; i<n; i++) puts(st[i][0]);
}
void fff(char *st1,char *st2)
{int i; static j;
static char *k;
j=(st2-st1>j) ? k=st1,j=st2-st1 : j;
//j - длина максимального слова
//k - указатель на начало этого слова
if (!st2) |
// передано не одно слово |
{for(; j>0; j--)
{ for(i=0; *(k+i+1); i++)
*(k+i)=*(k+i+1); // сдвиг строки на позицию max слова
*(k+i)='\0';
}
}
}
Пример . Ввести символьную строку и найти в ней слово максимальной
длины. |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <conio.h> |
|
main() |
|
{ char *st; |
|
int i,k,kk=0,i1,i2,i3,size; |
|
printf("Введите длину строки"); |
|
scanf("%d",&size); |
|
st=(char *)malloc(size); |
|
fflush(stdin); |
|
gets(st); |
|
i=i1=i2=0; |
|
while(*(st+i)) |
|
{ i3=i; |
// индекс начала слова в втроке |
for(k=0; *(st+i)!=' ' && *(st+i); i++,k++); |
|
if(kk<k) { kk=k; i1=i3; i2=i; } |
// координаты max слова |
if(*(st+i)==' ') while(*(st+(++i))==' '); //удаление повторных пробелов
}
puts("\nслово max длины "); for(i=i1; i<i2; printf("%c",*(st+i++)));
}
Пример . Ввести строку и выполнить в ней замену слова с минимальной и максимальной длинной.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
main()
{ char c,*s,*s1,*s2;
int i,n,nn,min,max,i1,i2,l,i3,i4; clrscr();
puts("");
scanf("%d",&nn);
s=(char*)malloc(nn);
s1=(char*)calloc(nn,1);
s2=(char*)calloc(nn,1); if(!s||!s1||!s2) return 0; fflush(stdin);
gets(s);
i=i1=i2=0; min=nn; max=0; while(*(s+i))
{ for(n=0;*(s+i)!=' ' && *(s+i); i++,n++); if(max<n) { max=n; i1=i-n; }
if(min>n) { min=n; i3=i-n; }
if(*(s+i)==' ') while(*(s+(++i))==' ');
}
l=0; i=i1;
while(*(s+i)!=' ' && *(s+i)) *(s1+l++)=*(s+i++);
l=0; i=i3;
while(*(s+i)!=' ' && *(s+i)) *(s2+l++)=*(s+i++);
l=0;
if(i1<i3)
{ i2=i1+max;
while(*(s2+l)) *(s+i1++)=*(s2+l++); while(i2<i3) *(s+i1++)=*(s+i2++); l=0;
while(*(s1+l)) *(s+i1++)=*(s1+l++);
}
else
{ i=i1+max-min;
while(*(s2+l)) *(s+i++)=*(s2+l++); i2=i-min-1; i1--; while(i1>=i3+min) *(s+i2--)=*(s+i1--);
l=0;
while(*(s1+l)) *(s+i3++)=*(s1+l++);
}
puts(s);
free(s);
free(s1);
free(s2);
}
Пример . Ввести строки. Определить, какие строки из введенных читаются из начала в конец и наоборот
#include <stdio.h> #include <conio.h>