книги / Язык Си
..pdfn = |
strlen(str); |
//определяем длину строки |
s=0; |
//пока символ |
в строку не входит ни разу |
for(i=0;i<n;i++) |
//перебираем все элементы |
|
|
|
//строки |
if(str[i]==а) //если элемент массива равен //искомому символу
s++; //подсчитываем вхождение
printf("\пБуква %с входит в строку %d раз", a, s) ;
getch(); return 0;
}
Задача 3. Определить, является ли заданная символьная строка палиндромом, т.е. читается одинаково справа налево и слева направо.
ttinclude <stdio.h> #include <conio.h> #include <string.h> main()
{char str[50];
int I , j,n, palindrom=l; //1 - палиндром, 0 - нет
puts("Введите строку:"); gets(str);
n = strlen(str);
j = n-1; //индекс последнего элемента в строке
//перебираем элементы сначала и с конца строки //до середины
for(i=0;i<n/2;i++, j
if(str [i] !=str[j]) //если есть хотя бы одно //несовпадение,
{palindrom = 0; //то это не палиндром
break; //прерываем цикл - нет смысла искать //дальше
}
if(palindrom == 1) printf("Это палиндром"); else
printf("НЕТ"); getch() ;
return 0;
}
Здесь мы ввели переменную palindrom, анализируя которую, в конце определяем, является слово палиндромом или нет.
Задача 4. Обменять в строках фамилии.
#include<conio.h>
#include<stdio.h>
#include<string.h> main ()
{char si[20] = "Ivan Ivanov"; char s2[] = "Petr Petrov";
char s3[20]; //массив для временного хранения //строки
strcpy(s3,si); |
//s3="Ivan |
Ivanov" |
strcpy(sl+5,s2+5); //sl="Ivan |
Petrov" |
|
strcpy(s2+5,s3 +5); //s2="Petr |
Ivanov" |
puts(si); puts(s2);
getch(); return 0;
}
Если просто обратиться к массиву по имени, например, s\, то оно будет указывать на нулевой элемент массива (в нашем приме
ре это символ / в слове Ivan), Следовательно, s 1 + 5 будет указы вать уже на / в фамилии Ivanov, Аналогично s2 + 5 будет указы вать на Р в слове Petrov, Таким образом, при работе функции strcmp вставка в массив $1 начнется с позиции s 1 + 5, а копирова ние из массива s2 начнется с позиции s2 + 5,
Задача 5, Удалить из строки все пробелы.
#include<conio.h> |
|
|
|
#include<stdio.h> |
|
|
|
main() |
|
|
|
{int |
i,k,n; |
1 |
//строка c |
char |
a [50] =M3q2 d 12 |
||
|
|
|
//пробелами |
n = strlen(a); //определяем длину строки k=0;
for(i=0; i<n; i++) //перебираем все элементы //строки
if(a[i]!=' f) //если элемент НЕ пробел, {a[k]=a[i]; //копируем его влево к++;
}
a[k]=f\0f; //отмечаем конец строки puts(а); //печатаем строку
getch(); return 0;
}
Решим данную задачу с применением функции strcpy,
#include<conio.h>
#include<stdio.h>
#include<string.h>
main()
{int i,n;
char a[50]="3q2 d 12 |
1 |
//строка c |
//пробелами
for(i=0;i<n;i++)
if(a[i]==' •) {strcpy(a+i,a+i+1)
i— ;
}
puts(a);
getch(); return 0;
}
ДОМАШНЕЕ ЗАДАНИЕ
1.Выучить функции обработки строк.
2.Заменить в задаче 4 копирование через функции strcmp на посимвольное копирование в циклах через оператор присваивания
3.Написать программу, печатающую самое длинное слово текста (слова в тексте отделяются друг от друга одним пробелом).
4.Написать программу, удаляющую из заданной строки все запятые и точки.
5.Написать программу, определяющую число слов в строке (слова в тексте отделяются друг от друга одним пробелом).
ЛЕКЦИЯ 9. ФУНКЦИИ
Ранее мы с вами обходились только одной функцией main, однако в программе функций может быть сколько угодно, в зави симости от числа решаемых задач. Таким образом, функции - это самостоятельные единицы программы, спроектированные для ре шения конкретных задач. Выполнение программы ВСЕГДА начи нается (и заканчивается) в функции main.
9.1. Задание функций
Форма задания (определения) функции имеет вид
тип имя функции (список параметров)
{■ тело функции
}
Тип определяет тип (char, int,float, double, void) значения, ко торое возвращает функция с помощью оператора return. Если тип не указан, то по умолчанию предполагается, что функция возвра щает целое значение (int). Если тип функции void (от англ, пус той), то функция не возвращает никакого значения.
Имя функции задается по тем же правилам, что и любая пере менная (см. лекцию 1).
Список параметров состоит из перечня типов и имен пара метров, разделенных запятыми. Функция может не иметь парамет ров, но круглые скобки ( ) после имени функции необходимы в любом случае. В списке параметров для каждого параметра дол жен быть указан тип.
float f(int х, int у, float z) //Правильно
float f (int x ,y, float z) |
//ОШИБКА |
Внутри функции оператор return имеет два варианта исполь зования. Во-первых, этот оператор вызывает немедленный выход из текущей функции и возврат в вызывающую программу. В таком варианте оператор return может быть даже у функции типа void.
_ |
2х3 - х2 +1 |
Пример. Вычислить выражение у = |
-------------- при задан- |
НОМ X . |
х - \ |
|
Для вычисления данного выражения напишем свою функцию. В функции необходимо предусмотреть вариант, что при х = 1 зна менатель обращается в нуль. В этом случае напечатаем сообщение, что решения нет, и оператором return осуществим немедленный выход из функции.
#include<stdio.h>
#include<conio.h>
#include<math.h>
void f(float x) {float y;
if(x==l) {printf("Решения нет");
return; //немедленно выходим из функции
}
у = (2*pow(х,3)-х*х+1)/(х-1); print f (пу=%fп,у );
}
main() {float х;
printf("Введите х: "); scanf("%£",&х);
f (х) ; getch(); return 0;
}
Второе применение оператора return - возврат из функции значения типа char, int, float или double. В теле функции может быть несколько операторов return, но может и не быть ни одного.
Пример. Вычислить выражение у ={х + 2)5 - \1 х +Зх4 без
использования стандартной функции pow.
Создадим свою функцию возведения в степень ту_pow, кото рая будет иметь два параметра: а - основание (число с плавающей точкой); b - степень (целое число).
#include<stdio.h>
#include<conio.h>
float my_pow(float a,int b) {float p=l;
int i;
if(b==0)
return 1; //если степень О, то результат 1 if(а==0)
return 0; //если основание 0, то результат 0
if(b<l) //если степень меньше 1
{Ь*=-1;
for(i=0; i<b; i++)
р*=а; //накапливаем произведение return 1/р;
}
else // если степень больше 1 {for(i=0; i<b; i++)
р*=а; return р;
}
}
main() {float y,x;
puts("Введите x :"); scant("%f",&x);
//Вычисляем выражение
у = my_pow(x+2,5)-17*x+3*my_pow(x,4);
printf("y=% f",y); getch();
return 0;
}
Еще раз отметим, что оператор return выполняет НЕМЕДЖННЫИ возврат в точку вызова. Если в функции туj)ow сработает, например, условие if(a==0), то return вернет управле ние программой в точку вызова функции ту_pow, подставив туда нуль, при этом остальные строки функции ту_pow выполнены не будут.
Как правило, функции уместно применять там, где при реше нии задачи многократно требуется решать какие-то подзадачи. В предыдущем примере задачей являлось вычисление выражения у=(х+2)5-\1х+ЪхА, а подзадача была одна - возведение некоторых частей выражения в заданные степени.
Если тип функции void, то оператор return может использо ваться только для выхода из функции, возвращать значение опера тором return в этом случае нельзя. Исходя из этого вызов функции, имеющей тип void, не может происходить из выражений или из позиций аргументов других функций. В этом случае функция должна вызываться только отдельной строкой.
Пример. Нахождение минимального и максимального чисел.
#include<stdio.h>
#include<conio.h>
float min(float x,float y)
{
return x<=y?x:y;
}
{
printf("MAX=%f",x>=y?x:y);
}
main()
{float a=4.5,b=-6.7; printf("MIN=%f\n",min(a,b)); //Правильно! printf(MMAX=%f\nM,max(a,b)); //ОШИБКА!
max(a,b); //правильный вызов функции типа void
getch(); return 0;
}
Ошибка вызвана тем, что в поле аргумента функции printf должна находиться либо переменная, либо константа (именован ная, неименованная). Функция min возвращает значение - у нее есть оператор return, который в точку вызова подставит результат выражения х<=у?х:у, т.е. неименованную константу, поэтому ошибки нет. Функция max имеет тип void и не может вернуть в точку вызова значение, поэтому ее вызов в поле аргумента функ ции printf ошибочен.
9.2. Прототипы функций
Поскольку одни функции вызываются из других функций, до первого вызова функции компилятору нужно сообщить имя функции, тип возвращаемого значения, количество и типы аргу ментов. Для этой цели используется прототип функции. Прото тип функции является объявлением функции и задается следую щим образом:
тип имя функьщи (списокпараметров);
■ Прототип функции полностью совпадает с заголовком функции и заканчивается точкой с запятой.