Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

n =

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. Прототипы функций

Поскольку одни функции вызываются из других функций, до первого вызова функции компилятору нужно сообщить имя функции, тип возвращаемого значения, количество и типы аргу­ ментов. Для этой цели используется прототип функции. Прото­ тип функции является объявлением функции и задается следую­ щим образом:

тип имя функьщи (списокпараметров);

Прототип функции полностью совпадает с заголовком функции и заканчивается точкой с запятой.