Опубликовано 2 года назад по предмету
Информатика
от mari528
-
Ответ
Ответ дан
utisВ операторе вывода write должны стоять ковычки.
write(‘Текст’)
write(‘Привет, Вася!’)
-
Ответ
Ответ дан
mari528К какому типу относится эта ошибка?
-
Ответ
Ответ дан
mari528Спасибо
-
Не тот ответ, который вам нужен?
Найди нужный
Самые новые вопросы
![]()
Математика — 2 года назад
Сколько здесь прямоугольников
![]()
История — 3 года назад
Какое управление было в древнейшем риме? как звали первого и последнего из царей рима?
![]()
Литература — 3 года назад
Уроки французского ответе на вопрос : расскажите о герое по следующему примерному плану: 1.почему мальчик оказался в райцентре ? 2.как он чувствовал себя на новом месте? 3.почему он не убежал в деревню? 4.какие отношения сложились у него с товарищами? 5.почему он ввязался в игру за деньги? 6.как характеризуют его отношения с учительницей ? ответе на эти вопросы пожалуйста ! сочините сочинение пожалуйста
![]()
Русский язык — 3 года назад
Помогите решить тест по русскому языку тест по русскому языку «местоимение. разряды местоимений» для 6 класса
1. укажите личное местоимение:
1) некто
2) вас
3) ни с кем
4) собой
2. укажите относительное местоимение:
1) кто-либо
2) некоторый
3) кто
4) нам
3. укажите вопросительное местоимение:
1) кем-нибудь
2) кем
3) себе
4) никакой
4. укажите определительное местоимение:
1) наш
2) который
3) некий
4) каждый
5. укажите возвратное местоимение:
1) свой
2) чей
3) сам
4) себя
6. найдите указательное местоимение:
1) твой
2) какой
3) тот
4) их
7. найдите притяжательное местоимение:
1) самый
2) моего
3) иной
4) ничей
8. укажите неопределённое местоимение:
1) весь
2) какой-нибудь
3) любой
4) этот
9. укажите вопросительное местоимение:
1) сколько
2) кое-что
3) она
4) нами
10. в каком варианте ответа выделенное слово является притяжательным местоимением?
1) увидел их
2) её нет дома
3) её тетрадь
4) их не спросили
![]()
Русский язык — 3 года назад
Переделай союзное предложение в предложение с бессоюзной связью.
1. океан с гулом ходил за стеной чёрными горами, и вьюга крепко свистала в отяжелевших снастях, а пароход весь дрожал.
2. множество темноватых тучек, с неясно обрисованными краями, расползались по бледно-голубому небу, а довольно крепкий ветер мчался сухой непрерывной струёй, не разгоняя зноя
3. поезд ушёл быстро, и его огни скоро исчезли, а через минуту уже не было слышно шума
![]()
Русский язык — 3 года назад
помогите прошу!перепиши предложения, расставляя недостающие знаки препинания. объясни, что соединяет союз и. если в предложении один союз и, то во втором выпадающем списке отметь «прочерк».пример:«я шёл пешком и,/поражённый прелестью природы/, часто останавливался».союз и соединяет однородные члены.ночь уже ложилась на горы (1) и туман сырой (2) и холодный начал бродить по ущельям.союз и соединяет:1) части сложного предложенияоднородные члены,2) однородные членычасти сложного предложения—.поэт — трубач зовущий войско в битву (1) и прежде всех идущий в битву сам (ю. янонис).союз и соединяет:1) части сложного предложенияоднородные члены,2)
![]()
Физика — 3 года назад
Вокруг прямого проводника с током (смотри рисунок) существует магнитное поле. определи направление линий этого магнитного поля в точках a и b.обрати внимание, что точки a и b находятся с разных сторон от проводника (точка a — снизу, а точка b — сверху). рисунок ниже выбери и отметь правильный ответ среди предложенных.1. в точке a — «от нас», в точке b — «к нам» 2. в точке a — «к нам», в точке b — «от нас» 3. в обеих точках «от нас»4. в обеих точках «к нам»контрольная работа по физике.прошу,не наугад важно
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Что ты хочешь узнать на сайте Знания ком?
Задай вопрос
Все предметы
Математика
Литература
Алгебра
Русский язык
Геометрия
Английский язык
Химия
Физика
Биология
История
Обществознание
Окружающий мир
География
Українська мова
Информатика
Українська література
Қазақ тiлi
Экономика
Музыка
Право
Беларуская мова
Французский язык
Немецкий язык
МХК
ОБЖ
Психология
Оʻzbek tili
Кыргыз тили
Астрономия
Физкультура и спорт
Другие предметы
Удивлен что ещё проходит обучение по 2 версии питона. Скажи преподу чтобы на 3 переходил 😉
1) Python — Питон
print — Распечатать (Вывод на экран)
2) print «Привет, Вася!»
==1 задачка==
Входные данные мы задаём в коде, либо в ходе выполнения кода:
1)a = 2
b = 3
2)a = int(input(«Ввод:»)
b = int(input(«Ввод:»)
Я бы взял первый вариант.
Сложив 2 и 3,получим 5
«»»Код»»»
a = 2
b = 3
c = a+b
print(c) #Получим 5
Вопросы к заданию:
Типы входных данных:
В двух вариантах он будет один — int (тобишь числовой)
Входных значений у нашего алгоритма всего лишь два.
Третье значение, C, вычисляется уже исходя из предоставленных нами данных.
Результат так же относится к числовому типу int.
В примере который взял я, будет всего один ответ. Взяв второй вариант, вы можете подбирать самые разные числа.
(не особо понял какие стрелки)
==2 задачка==
Не знаю, эстетично ли это со стороны программистов, но я бы сделал так.
Итак, нам опять нужно задать входные данные, на этот раз это будет скорость, и изначальное расстояние(стартовая точка)
Можно разнообразить наш код, добавив обычный модуль рандомизации, для того чтобы скорость автомобиля не всегда была равна n-числу
В коде будут все комментарии, не запутаешься)
Просто вставь код ниже в свой текстовый редактор.
«»Код»»
import random #Для будущей рандомизации
import time #Для использования задержки времени.
clear = «/n»*500 #Переменная для очистки консоли, с помощью неё наш Навигатор будет красивее
total = 0 #В этой переменной у нас будут храниться данные об пройденном пути
counter = 0 #В этой переменной у нас будет пройденное время.
speed = int(input(«Введите скорость вашего автомобиля:») #В этой переменной мы спрашиваем пользователя об скорости его авто. Понадобиться чтобы сделать в будущем разброс.
while True: #Запускаем бесконечный цикл.
counter = counter + 1
speed_up = random.uniform(speed, speed+5) #Появились вопросы не так ли? Итак, эта функция позволяет нам рандомизировать нашу скорость. Приведу краткий пример random.uniform(1,5), эта функция, выдаст нам рандомное число в диапазоне от 1 до 5
to_total = speed_up / 60 / 60
total = to_total + total
print(clear) #очистка консоли
print(«Скорость автомобиля — » + str(speed_up) + «/nПройденный путь — » + str(total) + » м./nПройденное время — » + str(counter)
«»Конец кода»»
Ответы на вопросы:
Входные данные относятся к числовому типу данных.
3 входных значерия, не считая переменной для очистки, она у нас используется для украшения выводимой информации, чтобы все не было докучи.
Выводимые результаты у нас выводятся в строковом типе, числа мы заранее преобразовали в строку.
Результатов в моем алгоритме — будет бесконечно. Пока юзер не закроет консоль.
===Информация от меня===
Если возникли какие то проблемы по питону, пиши мне в телеграм — @imogokuru
Надеюсь выше написанный код будет работать,т.к писалось все на телефоне, в пол второго ночи, и без удобных условий редактора)
Практические работы по информатике по теме «Алгоритмизация и программирование»» Практическя работа №1. 1. Переведите слова Python и print с английского языка на русский. Python ¬ print ¬ 2. Вася решил дополнить программу так, чтобы она выводила сообщение с его именем. Он записал оператор вывода так: print ‘Привет’, Вася! Эта программа не работает. Запишите правильный вариант: В операторе вывода print должны стоять ковычки К какому типу относится эта ошибка? 3. Требуется написать программу, которая складывает два числа и выводит на экран их сумму. Определите входные данные и результат этого алгоритма. К какому типу относятся входные данные: Сколько входных значений у алгоритма? К какому типу относятся результаты: Сколько результатов у алгоритма? Обозначьте именами входные данные и результаты и напишите их на стрелках: Запишите формулу, которая связывает исходные данные и результат: Место для ввода текста. 4. Требуется написать программу, которая выводит скорость и время движения автомобиля и выводит на экран расстояние, которое он проехал. Определите входные данные и результат этого алгоритма. К какому типу относятся входные данные: Сколько входных значений у алгоритма? К какому типу относятся результаты: Сколько результатов у алгоритма? Обозначьте именами входные данные и результаты и напишите их на стрелках: Запишите формулу, которая связывает исходные данные и результат: Место для ввода текста. 5. В языке Python целые переменные относятся к типу (классу) int. Выясните, откуда произошло сокращение int в языках программирования: int – это сокращение от английского слова , которое переводится как . 6. Выделите красным фоном недопустимые имена переменных: 1 Vasya СУ-27 @mail_ru m11 Петя СУ_27 lenta.ru 1m Митин брат _27 «Pes barbos» m 1 Quo vadis СУ(27) <Ладья> 7. Что появится на экране после выполнения программы: c = 5 print( с ) print( ‘c’ ) Ответ: Чем отличаются два оператора вывода в программе? Место для ввода текста. 8. Что выведет на экран программма a = 1 print( a ) a = 5 print( a ) Ответ: Заполните пропуски: «Если переменной присваивается новое значение, то предыдущее значение .» Выберите правильный вариант: «Переменная в любой момент может иметь ». 9. Чему будут равны значения переменных a и b после выполнения программмы, если вначале они имели значения a = 4 и b = 7? Выполните ручную прокрутку программы. a b 4 7 a = a + 1 b = b + 1 a = a + b b = b + a a = a + 1 Ответ: a = b = 10. Что выведет эта программа при a = 4, b = 5 и c = 9? print( ‘a’, ‘+b’, =, c ) Место для ввода текста. 11. Исправьте ошибки в операторе вывода, print( ‘c’, ‘-b’, =, a ) чтобы при a = 4, b = 5 и c = 9 программа вывела 9–5=4: Место для ввода текста.
Другие вопросы по Информатике

Информатика, 28.02.2019 19:40, насвай4
:дискета вмещает 1,44 мб. рукопись содержит 450 страниц, на каждой странице 60 строк по 80 символов в каждой. поместится ли рукопись на дискету? если нет, то сколько потребуется. решите по действиям, и желательно с подписями едениц
измерения)
Ответов: 4

Информатика, 03.03.2019 01:10, MoonRiad
Составить программу на паскале, которая имитирует падение брошенного с башни яблока
Ответов: 2

Написать программу, которая запрашивает название животного и число а затем выводит на экран фразу типа»белка съест 10 грибов»(при вводе слова «белка»и число 10) на !
Ответов: 2

Какую группу действий и сколько раз следует повторить при решении следущей ? сорок солдат подошли к реке, по которой на лодке катаются двое мальчиков. как солдатам переправиться на другой берег, если лодка вмещает
только одного солдата либо двух мальчиков, а солдата и мальчиков уже не вмещает?
Ответов: 3

Информатика, 08.03.2019 09:20, Vlad010934
Можно ли отредактировать в текстовом редакторе отсканированный текст? если да, то что для этого необходимо?
Ответов: 3

1. на остановке стоит человек в ожидании автобуса №3.какое кол-во информации несет сообщение о том, что к остановке подъехал автобус №4? ( а) 1 бит; б) нулевая информация; в) ненулевая информация; г) 4 бита; д) 2 бита.)
2.как называют изменение поведения системы, направленное на достижение цели при её взаимодействии с внешним миром?
Ответов: 3
Знаешь правильный ответ?
2. Вася решил дополнить программу так, чтобы она выводила сообщение с его именем.Он записал оператор…
Вопросы по предметам

Алгебра, 07.04.2021 14:28


Другие предметы, 07.04.2021 14:28

Алгебра, 07.04.2021 14:28

Алгебра, 07.04.2021 14:28


Русский язык, 07.04.2021 14:28


Литература, 07.04.2021 14:29

Українська література, 07.04.2021 14:29
Похожие вопросы:

Информатика, 03.03.2019 16:30
Вопрос: на рисунке не белая скатерть.ответ: да или нет.(на рисунке белая скатерть)
Ответов: 3

Информатика, 08.03.2019 14:20
Сформировать массив у из 16 членов,где элементы массива вычисляются по формуле: у=х*2+3, а х=5; 5.2; 5.4; .
Ответов: 4

Информатика, 09.03.2019 13:30
Определить, сколько фамилий в списке состоят из 8 или 9 букв. (тема: строковый тип данных)
Ответов: 2

Информатика, 09.03.2019 21:10
Правило преобразования числовой информации 1-1; 2-1; 3-1; 4-1; 10-2; 11-2; 100-3.
Ответов: 3
У тебя есть свой ответ?
2. Вася решил дополнить программу так, чтобы она выводила сообщение с его именем.
Он записал оп…
Вопросы по другим предметам:

Алгебра, 12.02.2022 18:58

История, 12.02.2022 18:58


Қазақ тiлi, 12.02.2022 18:58

Алгебра, 12.02.2022 18:58

Геометрия, 12.02.2022 18:59

Математика, 12.02.2022 18:59

Математика, 12.02.2022 18:59


Математика, 12.02.2022 18:59

Қазақ тiлi, 12.02.2022 18:59

Геометрия, 12.02.2022 19:00

Геометрия, 12.02.2022 19:00

Другие предметы, 12.02.2022 19:00



Математика, 12.02.2022 19:01

Математика, 12.02.2022 19:01

Математика, 12.02.2022 19:01

Қазақ тiлi, 12.02.2022 19:01
Лекция.
Символьные
строки
План
лекции.
-
Символьные
массивы. -
Массив
или указатель. -
Различие
между массивом и указателем. -
Понятие
символьной строки. -
Объявление
и инициализация строк. -
Стандартный
ввод вывод строк. -
Функции
для работы со строками. -
Строки
в функциях и процедурах. -
Массивы
строк. -
Стандартная
библиотека обработки строк.
-
Cимвольные
массивы.
При
определении массива символьных литернеобходимо сообщитькомпиляторутребуемый размер памяти.
char
m[82];
Компилятор
также может самостоятельно определить
размер массива символов.
char
m2[]=»Горные вершины спят во тьме
ночной.»;
char
m3[]={‘Т’,’и’,’х’,’и’,’е’,’ ‘,’д’,’о’,’л’,’и’,’н’,’ы’,’
‘,’п’,’о’,’л’,’н’,’ы’,’ ‘,’с’,’в’,’е’,’ж’,’е’,’й’,’
‘,’м’,’г’,’л’,’о’,’й’,»};
Как
и для других массивов, m2 и m3 являются
указателями на первые элементы массивов.
m2
== &m2[0]
*m2
== ‘Г’
*(m2
+ 1) == ‘o’
m3
== &m3[0]
*(m3
+ 2) == ‘x’
Для
создания строки можно использовать
указатель.
char
*m4 = «Не пылит дорога, не дрожат
листы…»;
Это
почти то же самое, что и
char
m5[] = «Подожди немного, отдохнешь и
ты»; .
В
обоих случаях m4 и m5 являются указателями
на строки, и размеры массивов определяются
компилятором. Однако между m4 и m5 есть и
некоторая разница.
Во
втором случае объявление массива
вызывает создание в памяти массива из
32 элементов (по одному на каждый символ
плюс один на завершающий символ »).
Каждый элемент инициализируется
соответствующим символом. В дальнейшем
компилятор будет рассматривать имя m5
как синоним адреса первого элемента
массива, то есть &m5[0]. Следует отметить,
что m5 является константой—указателем.
Нельзя изменить m5, так как это
означало бы изменение положения (адреса)
массива в памяти. Можно использовать
операции, подобные m5 + 1, для идентификации
следующего
элементамассива, однако не разрешается выражение
++m5. Оператор увеличения можно использовать
с именами переменных, но не констант.
В
случае с указателем m4 в памяти создается
36 элементов для запоминания
строки.
Но, кроме того, выделяется еще одна
ячейка памяти для переменной m4,
являющейся
указателем. Сначала эта переменная
указывает на начало строки, но ее
значение может изменяться. Поэтому
можно использовать операцию
увеличения;
++m4 будет указывать на второй символ
строки — ‘е’.
3. Различия между массивами и указателями.
Рассмотрим
различия в использовании описаний
следующих двух видов:
char
heart [] = «Подожди немного, «; .
char
*reason = «отдохнешь и ты.»; .
Основное
отличие состоит в том, что указатель
heart является константой, в
то
время как указатель reason — переменной.
Посмотрим, что на самом деле дает эта
разница.
Во-первых,
и в том и в другом случае можно использовать
операцию сложения с указателем.
for
(i = 0; i < 17; i+ + )
putchar(*
(heart + i) );
putchar(‘n’)
for
(i = 0; i < 15; i+ + )
putchar(*
(reason + i) );
putchar(‘n’);
Результат
работы
Подожди
немного, отдохнешь и ты.
В
случае с указателем можно использовать
операцию увеличения.
/*
останов в конце строки */
while
( *( reason) != »
/*
печать символа и перемещение указателя
*/
putchar(
*( reason + + ) );
Результат
работы
отдохнешь
и ты.
Явное
задание размера памяти. При
объявлении массива можно указать:
char
ml[36] = «В полдневный жар в долине
Дагестана»;
вместо
char
ml[ ] = » В полдневный жар в долине
Дагестана»; .
Число
элементов по крайней мере на один нулевой
символ больше, чем длина строки. Как и
в других статических или внешних
массивах, любые неиспользо-ванныеэлементы автоматически инициализируются
нулем (который всимво-льном
виде является нулевым байтом »,
а не символом цифры
нуль).
-
Понятие
символьной строки.
Понятно,
что
символьная
строка
–
это
последовательность
символов.
Мы
будем
рассматривать
строки,
в
которых
на
каждый
символ
отводится
1 байт.
В
этом
случае
можно
использовать
28=256 различных
символов.
Каждый
символ
имеет
свой
код
(от
0 до
255), эти
коды
определяются
по
специальной
таблице.
Строка,
как
и
другие
переменные,
записывается
в
память,
причем
компьютеру
все
равно,какие
данные
записаны
–
для
него
это
набор
байтов.
Как
же
определить,
где
заканчивается
строка?
Есть
два
решения:
1)
хранить
длину
строки
в
отдельной
ячейке
(как
в
языке
Паскаль);
2)
выбрать
один
особый
символ,
который
будет
обозначать
конец
строки,
причем
в
середине
строки
этот
символ
не
может
встречаться.
В
языке
Си
принят
второй
подход.
Символьная
строка
–
это
последовательность
символом,
которая
заканчивается
символом
с
кодом
0.
Символ
с
кодом
ноль
не
имеет
никакого
изображения,
в
программе
его
записывают
как
».
Символ
с
кодом
ноль
(обозначается
как
»)
и
цифра
ноль
(обозначается
‘0’,
имеет
код
48) – это
два
разных
символа.
-
Объявление
и
инициализация.
Строка
представляет
собой
массив
символов,
поэтому
и
объявляется
она
имен-но
как
массив:
char
s[80];
Однако
строка
отличается
от
массива
тем,
что
она
заканчивается
символом
с
кодом
0 – признаком
окончания
строки,
поэтому,
если
массив
символов
будет
использоваться
как
строка,
надо
выделять
на
1 байт
больше
памяти.
При
выделении
памяти
глобальные
переменные
заполняются
нулями,
а
локальные
содержат
«мусор».
Начальное
значение
строки
можно
задать
при
объявлении
в
двойных
кавычках
после
знака
равенства:
char
s[80] = «Привет,
Вася!»;
Символы
в
кавычках
будут
записаны
в
начало
массива
s,
а
затем
–
признак
око-нчания
строки
».
Оставшиеся
символы
не
меняются,
и
в
локальных
строках
там
будет
«мусор».
Можно
написать
и
так
char
s[] = «Привет,
Вася!»;
В
этом
случае
компилятор
подсчитает
символы
в
кавычках,
выделит
памяти
на
1 байт
больше
и
занесет
в
эту
область
саму
строку
и
завершающий
ноль.
Аналогично
можно
выделить
память
на
указатель:
char
*s = «Привет,
Вася!»;
Результат
–
тот
же
самый,
что
и
в
предыдущем
случае,
но
теперь
s
–
это
указатель
(переменная,
в
которой
хранится
адрес
ячейки
в
памяти),
и
с
ним
можно
работать
так
же,
как
с
обычным
указателем
(присваивать,
изменять
и
т.п.).
Если
строка
не
будет
изменяться
во
время
работы
программы,
то
можно
объявить
константу
(постоянную
строку)
так:
const
char PRIVET[] = «Привет,
Вася!»;
6.
Стандартный
ввод
и
вывод.
Для
ввода
и
вывода
строк
с
помощью
функций
scanf
и
printf
спользуется
специальный
формат
«%s»:
#include
<stdio.h>
main()
{
char
Name[50];
printf(«Как
тебя
зовут?
«);
scanf(«%s»,
Name);
printf(«Привет,
%s!», Name);
}
Заметим,
что
в
функцию
scanf
надо
передать
просто
имя
строки
(без
знака
&),
ведь
имя
массива
является
одновременно
адресом
его
начального
элемента.
Однако
у
функции
scanf
есть
одна
особенность:
она
заканчивает
ввод,
встретив
первый
пробел.
Если
вы
на
вопрос
в
предыдущем
примере
ввели
«Вася
Пупкин«,
то
увидите
надпись
«Привет,
Вася!»
вместо
ожидаемого
«Привет,
Вася
Пупкин!».
Если
надо
ввести
всю
строку
целиком,
включая
пробелы
(то
есть
до
нажатия
на
клавишу
Enter),
придется
делать
иначе,
заменив
вызов
scanf
на
более
простой:
gets
( s );
Название
этой
функции
происходит
от
английских
слов
get
string – получить
строку.
Для
вывода
строки
на
экран
можно
(кроме
printf)
использовать
и
функцию
puts,
которая
после
вывода
строки
еще
и
дает
команду
перехода
на
новую
строку.
В
примере
значение
строки
Name
будет
напечатано
на
следующей
строчке
экрана.
#include
<stdio.h>
main()
{
char
Name[50] = «Вася!»;
puts(
«Привет,»
);
puts
( Name );
}
Задача.
Ввести
символьную
строку
и
заменить
в
ней
все
буквы
‘A’
на
буквы
‘Б‘.
Будем
рассматривать
строку
как
массив
символов.
Надо
перебрать
все
элементы
массива,
пока
мы
не
встретим
символ
»
(признак
окончания
строки)
и,
если
очередной
символ
–
это
буква
‘A’,
заменить
его
на
‘Б‘.
Для
этого
используем
цикл
while,
потому
что
мы
заранее
не
знаем
длину
строки.Условие
цикла
можно
сформулировать
так:«пока
не
конец
строки».
#include
<stdio.h>
main()
{
char
a[80];
int
i;
printf(
«n Введите
строку
n» );
gets
( s );
i
= 0; //
начать
с
первого
символа,
s[0]
while
( s[i] != » ) //
пока
не
достигли
конца
строки
{
if
( s[i] == ‘A’ ) //
если
очередной
символ
–
‘A’, …
s[i]
= ‘Б‘;
//
меняем
его
на
‘Б‘
i
++; //
переходим
к
следующему
символу
}
puts
( «Результат:n»
);
puts
( a );
}
Заметьтим,
что
одиночный
символ
записывается
в
апострофах,
а
символьная
строка
–
в
кавычках.
При
выводе
строк
с
помощью
функции
printf
часто
применяется
форматирование.
После
знака
%
в
формате
указывается
размер
поля
для
вывода
строки.
Перед
этим
числом
можно
также
поставить
знак
минус,
что
означает
«прижать
к
левому
краю
поля».
Пример
вывода
Результат
Комментарий
printf(
«[%s]», «Вася«);
[Вася]
Минимальное
число
позиций.
printf(
«[%6s]», «Вася«);
[ Вася]
6
позиций,
выравнивание
вправо.
printf(«[%-6s]»,
«Вася«);
[Вася
] 6
позиций,
выравнивание
влево.
printf(
«[%2s]», «Вася«);
[Вася]
Строка
не
помещается
в
заданные
2
позиции,
поэтому
область
вывода
расширяется.
7.
Функции
для
работы
со
строками
В
языке
Си
есть
достаточно
много
специальных
функций,
которые
работают
со
строками
–
последовательностями
символом
с
нулевым
символом
на
конце.
Для
использования
этих
функций
надо
включить
в
программу
заголовочный
файл
#include
<string.h>
Многие
из
этих
функций
достаточно
опасны
при
неправильном
использовании,
ведь
они
не
проверяют,
достаточно
ли
выделено
памяти
для
копирования,
перемещения
или
другой
операции,
единственным
признаком
окончания
строки
для
них
является
символ
».
Длина
строки
–
strlen
Это
самая
простая
функция,
которая
определяет,
сколько
символов
в
переданной
ей
строке
(несчитая
»).
Ее
имя
происходит
от
английских
слов
string
length
(длина
строки).
#include
<stdio.h>
#include
<string.h>
main()
{
int
len;
char
s[] = «Prodigy»;
len
= strlen(s);
printf
( «Длина
строки
%s равна
%d», s, len );
}
В
этом
примере
функция
определит,
что
длина
строки
равна
7.
Сравнение
строк
–
strcmp
Для
сравнения
двух
строк
используют
функцию
strcmp
(от
английских
слов
string
comparison
–
сравнение
строк).
Функция
возвращает
ноль,
если
строки
равны
(то
есть
«разность»
между
ними
равна
нулю)
и
ненулевое
значение,
если
строки
различны.
Сравнение
происходит
по
кодам
символов,
поэтому
функция
различает
строчные
и
заглавные
буквы
–
они
имеют
разные
коды.
#include
<stdio.h>
#include
<string.h>
main()
{
char
s1[] = «Вася«,
s2[]
= «Петя«;
if
( 0 == strcmp(s1,s2) )
printf(«Строки
%s и
%s одинаковы«,
s1, s2);
else
printf(«Строки
%s и
%s разные«,
s1, s2);
}
Если
строки
не
равны,
функция
возвращает
«разность»
между
первой
и
второй
строкой,
то
есть
разность
кодов
первых
различных
символов.
Эти
числа
можно
использовать
для
сортировки
строк
–
если
«разность»
отрицательна,
значит
первая
строка
«меньше»
второй,
то
есть
стоит
за
ней
в
алфавитном
порядке.
В
таблице
показано
несколько
примеров
(код
буквы
‘A’
равен
65,
код
буквы
‘B’
–
66,
код
буквы
‘C’
–
67).
s1
s2 результат
strcmp(s1,
s2)
AA
AA 0
AB
AAB ‘B’ – ‘A’ = 66 – 65 = 1
AB
CAA ‘A’ – ‘C’ = 65 – 67 = -2
AA
AAA » – ‘A’ = -65
Задача.
Ввести
две
строки
и
вывести
их
в
алфавитном
порядке.
#include
<stdio.h>
#include
<string.h>
main()
{
char
s1[80], s2[80];
printf
(«Введите
первую
строку«);
gets(s1);
printf
(«Введите
вторую
строку«);
gets(s2);
if
( strcmp(s1,s2) <= 0 )
printf(«%sn%s»,
s1, s2);
else
printf(«%sn%s», s2, s1);
}
Иногда
надо
сравнить
не
всю
строку,
а
только
первые
несколько
символов.
Для
этого
служитфункция
strncmp
(с
буквой
n
в
середине).
Третий
параметр
этой
функции
–
количество
сравниваемых
символов.
Принцип
работы
такой
же
–
она
возвращает
нуль,
если
заданное
количество
первых
символов
обеих
строк
одинаково.
#include
<stdio.h>
#include
<string.h>
main()
{
char
s1[80], s2[80];
printf
(«Введите
первую
строку«);
gets(s1);
printf
(«Введите
вторую
строку«);
gets(s2);
if
( 0 == strncmp(s1, s2, 2) )
printf(«Первые
два
символа
%s и
%s одинаковы«,
s1, s2);
else
printf(«Первые
два
символа
%s и
%s разные«,
s1, s2);
}
Один
из
примеров
использования
функции
strcmp
–
проверка
пароля.
Составим
программу,
которая
спрашивает
пароль
и,
если
пароль
введен
неверно,
заканчивает
работу,
а
если
верно
–
выполняет
какую-нибудь
задачу.
Задача.
Составить
программу,
которая
определяет,
сколько
цифр
в
символьной
строке.
Программа
должна
работать
только
при
вводе
пароля
«куку».
#include
<stdio.h>
#include
<string.h>
main()
{
char
pass[] = «куку«,
//
правильный
пароль
s[80];
//
вспомогательная
строка
int
i, count = 0;
printf
(«Введите
пароль
«);
gets(s);
if
( strcmp ( pass, s ) != 0 )
{
printf
( «Неверный
пароль»
);
return
1; //
выход
по
ошибке,
код
ошибки
1
}
printf
(«Введите
строку«);
gets(s);
i
= 0;
while
( s[i] != » ) {
if
( s[i] >= ‘0’ && s[i] <= ‘9’ )
count
++;
}
printf(«nНашли
%d цифр«,
count);
}
В
этой
программе
использован
тот
факт,
что
коды
цифр
расположены
в
таблице
символов
последовательно
от
‘0’
до
‘9’.
Поэтому
можно
использовать
двойное
неравенство,
а
не
сравнивать
текущий
символ
s[i]
с
каждой
из
цифр.
Обратите
внимание
на
разницу
между
символами
»
(символ
с
кодом
0, признак
конца
строки)
и
‘0’
(символ
с
кодом
48, цифра
0). Переменная
count
работает
как
счетчик.
Копирование
строк
Часто
надо
записать
новое
значение
в
строку
или
скопировать
информацию
из
одной
строки
в
другую.
Функции
копирования
принадлежат
к
числу
«опасных»
– они
могут
вызвать
серьезную
ошибку,
если
произойдет
выход
за
границы
массива.
Это
бывает
в
том
случае,
если
строка,
в
которую
копируется
информация,
имеет
недостаточный
размер
(под
нее
выделено
мало
место
в
памяти).
В
копировании
участвуют
две
строки,
они
называются
«источник»
(строка,
откуда
копируется
информация)
и
«приемник»
(куда
она
записывается
или
добавляется).При
копировании
строк
надо
проверить,
чтобы
для
строки-приемника
было
выделено
достаточно
места
в
памяти
Простое
копирование
выполняет
функция
strcpy.
Она
принимает
два
аргумента:
сначала
строка-приемник,
потом
–
источник
(порядок
важен!).
char
s1[50], s2[10];
gets(s1);
strcpy
( s2, s1); //
s2 (приемник)
<- s1 (источник)
puts
( s2 );
Этот
фрагмент
программы
является
«опасным»
с
точки
зрения
выхода
за
границы
строки.
В
строку
s1
можно
безопасно
записать
не
более
49 символов
(плюс
завершающий
ноль).
Поэтому
если
с
клавиатуры
будет
введена
строка
длиннее
49 символов,
при
записи
ее
в
память
произой-
дет
выход
за
границы
строки
s1.
Строка
s2
может
принять
не
более
9 символов,
поэтому
при
большем
размере
s1
произойдет
выход
за
границы
строки
s2.
Поскольку
реально
функции
передается
адрес
начала
строки,
можно
заставить
функцию
начать
работу
любого
символа,
а
не
только
с
начала
строки.
Например,
следующая
строка
скопирует
строку
s2
в
область
памяти
строки
s1,которая
начинается
с
ее
6-ого
символа,
оставив
без
изменения
первые
пять:
strcpy
( s1+5, s2 );
При
этом
надо
следить,
чтобы
не
выйти
за
границу
массива.
Кроме
того,
если
до
выполнения
этой
операции
в
строке
s1
меньше
5 символов,
фокус
не
удастся.
Еще
одна
функция
позволяет
скопировать
только
заданное
количество
символов,
она
называется
strncpy
и
принимает
в
третьем
параметре
количество
символов,
которые
надо
скопировать.
Важно
помнить,
что
эта
функция
НЕ
записывает
завершающий
нуль,
а
только
копирует
символы
(в
отличие
от
нее
strcpy
всегда
копирует
завершающий
нуль).
Функция
strncpy
особенно
полезна
тогда,
когда
надо
по
частям
собрать
строку
из
кусочков.
#include
<stdio.h>
#include
<string.h>
main()
{
char
s1[] = «Ку—ку«,
s2[10];
strncpy
( s2, s1, 2 ); //
скопировать
2 символа
из
s1 в
s2
puts
( s2 ); //
ошибка!
нет
последнего
»
s2[2]
= »; //
добавляем
символ
окончания
строки
puts
(s2); //
вывод
}
Проблемы
при
копировании
строк
При
копировании
стандартные
функции
strcpy
и
strncpy
поступают
так:
определяют
количество
символов,
которые
надо
скопировать
и
затем
переписывают
их,
начиная
с
первого
символа
до
последнего.
Если
области
источника
и
приемника
не
перекрываются,
то
все
прохо-
дит
нормально.
Но
попробуем
«раздвинуть»
строку,
например
для
того,
чтобы
вставить
что-то
в
ее
середину.
Пусть
в
строке
s1
записано
имя
и
фамилия
человека,
а
в
строке
s2
–
его
отчество.
Надо
получить
в
строке
s1
полностью
имя,
фамилию
и
отчество.
#include
<stdio.h>
#include
<string.h>
main()
{
int
n;
char
s1[80] = «Иван
Рождественский«,
s2[]
= «Петрович
«;
n
= strlen(s2); //
длина
второй
строки
strcpy
(s1+5, s1+5+n); //
пытаемся
раздвинуть
на
n символов
strncpy(s1+5,
s2, n); //
вставляем
отчество
в
середину
puts
( s1 );
}
При
первом
вызове
strcpy
мы
хотели
скопировать
конец
строки,
начиная
с
символа
с
номером
5 (он
шестой
с
начала,
так
как
нумерация
идет
с
нуля)
вправо
на
n
символов
(объявленная
длина
массива
символов
–
80 – позволяет
это
сделать).
Однако
из-за
того,
что
копирование
вы-
полнялось
с
начала
блока
данных,
скопировав
на
новое
место
первый
символ
фамилии
(‘Р‘)
функция
стерла
букву
‘н‘
(справа
на
9 символов)
и
т.д.
В
результате
получили
s1
= «Иван
РождествеРождествеРождес«
В
следующей
строчке
мы
скопировали
в
середину
отчество
(без
завершающего
нуля)
и
получили
s1
= «Иван
Петрович
РождествеРождес«
Таким
образом,
вся
задумка
не
удалась
из-за
того,
что
функция
копирования
работает
в
данномслучае
неверно.
Выход
из
этой
ситуации
такой
–
написать
свою
функцию
копирования,
которая
копирует
не
с
начала
блока,
а
с
конца
(однако
она
будет
неверно
работать
в
обратной
ситуации
–
при
сжатии
строки).
Например,
так: