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

Информатика и программирование - часть 1

.pdf
Скачиваний:
75
Добавлен:
13.02.2015
Размер:
1.12 Mб
Скачать

Даны действительные числа A1, ..., А10. Все числа попарно различны. Поменять в этой

последовательности местами:

наибольший и наименьший элементы;

наибольший и последний элементы.

Дано натуральное число n. Сколько различных цифр встречается в его десятичной

записи.

Даны действительные числа A1, ..., А10. Вычислить 1 + 22 + 1010

Символьный тип данных.

В C# есть символьный класс Char, основанный на классе System.Char и

использующий двухбайтную кодировку Unicode представления символов. Для этого типа

в языке определены символьные константы - символьные литералы. Константу можно

задавать:

символом, заключенным в одинарные кавычки;

escape-последовательностью, задающей код символа;

Unicode-последовательностью, задающей Unicode-код символа.

Вот несколько примеров объявления символьных переменных и работы с ними:

public void TestChar()

{

char ch1 = 'A', ch2 = '\x5A', ch3 = '\u0058'; char ch = new Char();

int code; string s; ch = ch1;

//преобразование символьного типа в тип int code = ch;

ch1 = (char)(code + 1);

//преобразование символьного типа в строку

s = ch1.ToString() + ch2.ToString() + ch3.ToString(); Console.WriteLine("s= {0}, ch= {1}, code = {2}", s, ch, code);

}

Три символьные переменные инициализированы константами, значения которых

заданы тремя разными способами. Переменная ch объявляется в объектном стиле,

используя new и вызов конструктора класса. Тип char, как и все типы C#, является

классом. Этот класс наследует свойства и методы класса Object и имеет большое число

собственных методов.

Статические методы и свойства класса Char

Метод

Описание

GetNumericValue

Возвращает численное значение символа, если он является цифрой, и (-1) в

 

противном случае

GetUnicodeCategory

Все символы разделены на категории. Метод возвращает Unicode

 

категорию символа.

IsControl

Возвращает true, если символ является управляющим

IsDigit

Возвращает true, если символ является десятичной цифрой

IsLetter

Возвращает true, если символ является буквой

IsLetterOrDigit

Возвращает true, если символ является буквой или цифрой

IsLower

Возвращает true, если символ задан в нижнем регистре

IsNumber

Возвращает true, если символ является числом (десятичной или

 

шестнадцатеричной цифрой)

IsPunctuation

Возвращает true, если символ является знаком препинания

IsSeparator

Возвращает true, если символ является разделителем

IsSurrogate

Некоторые символы Unicode с кодом в интервале [0x1000, 0x10FFF]

 

представляются двумя 16-битными "суррогатными" символами. Метод

 

возвращает true, если символ является суррогатным

IsUpper

Возвращает true, если символ задан в верхнем регистре

IsWhiteSpace

Возвращает true, если символ является "белым пробелом". К белым

 

пробелам, помимо пробела, относятся и другие символы, например,

 

символ конца строки и символ перевода каретки

Parse

Преобразует строку в символ. Естественно, строка должна состоять из

 

одного символа, иначе возникнет ошибка

ToLower

Приводит символ к нижнему регистру

ToUpper

Приводит символ к верхнему регистру

MaxValue, MinValue

Свойства, возвращающие символы с максимальным и минимальным

 

кодом. Возвращаемые символы не имеют видимого образа.

Основным типом при работе со строками является тип string, задающий строки переменной длины. Класс String в языке C# относится к ссылочным типам. Над строками -

объектами этого класса - определен широкий набор операций, соответствующий современному представлению о том, как должен быть устроен строковый тип.

Объявление строк. Конструкторы класса string

Объекты класса String объявляются как все прочие объекты простых типов - с

явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса. Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. Но у класса String

достаточно много конструкторов. Они позволяют сконструировать строку из:

символа, повторенного заданное число раз;

массива символов char[];

части массива символов.

Некоторым конструкторам в качестве параметра инициализации можно передать строку, заданную типом char*. Но все это небезопасно, и подобные примеры приводиться и обсуждаться не будут. Приведу примеры объявления строк с вызовом разных конструкторов:

public void TestDeclStrings()

{

string world = "Мир";

string sssss = new string('s', 5); char[] yes = "Yes".ToCharArray(); string stryes = new string(yes); string strye = new string(yes, 0, 2);

Console.WriteLine("world = {0}; sssss={1}; stryes={2};" + " strye= {3}", world, sssss, stryes, strye);

}

Объект world создан без явного вызова конструктора, а объекты sssss, stryes, strye

созданы разными конструкторами класса String.

Заметьте, не допускается явный вызов конструктора по умолчанию - конструктора без параметров. Нет также конструктора, которому в качестве аргумента можно передать обычную строковую константу. Соответствующие операторы в тексте закомментированы.

Операции над строками

Над строками определены следующие операции:

присваивание (=);

две операции проверки эквивалентности (==) и (!=);

конкатенация или сцепление строк (+);

взятие индекса ([]).

Поскольку string - это ссылочный тип, то в результате присваивания создается ссылка на константную строку, хранимую в "куче". С одной и той же строковой константой в "куче" может быть связано несколько переменных строкового типа. Но эти переменные не являются псевдонимами - разными именами одного и того же объекта.

Дело в том, что строковые константы в "куче" не изменяются (о неизменяемости строкового типа будем далее говорить подробно), поэтому когда одна из переменных получает новое значение, она связывается с новым константным объектом в "куче".

Остальные переменные сохраняют свои связи. Для программиста это означает, что семантика присваивания строк аналогична семантике значимого присваивания.

В отличие от других ссылочных типов операции, проверяющие эквивалентность,

сравнивают значения строк, а не ссылки. Эти операции выполняются как над значимыми типами.

Бинарная операция "+" сцепляет две строки, приписывая вторую строку к хвосту первой.

Возможность взятия индекса при работе со строками отражает тот приятный факт,

что строку можно рассматривать как массив и получать без труда каждый ее символ.

Каждый символ строки имеет тип char, доступный только для чтения, но не для записи.

Вот пример, в котором над строками выполняются данные операции:

public void TestStringOper()

{

//операции над строками string s1 = "ABC", s2 = "CDE"; string s3 = s1 + s2;

bool b1 = (s1 == s2);

char ch1 = s1[0], ch2 = s2[0]; Console.WriteLine("s1={0}, s2={1}, b1={2}," +

"ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2); s2 = s1;

b1 = (s1 != s2); ch2 = s2[0];

Console.WriteLine("s1={0}, s2={1}, b1={2}," + "ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

//Неизменяемые значения s1 = "Zenon";

//s1[0]='L';

}

Строковые константы

ВC# существуют два вида строковых констант:

обычные константы, которые представляют строку символов, заключенную в кавычки;

@-константы, заданные обычной константой c предшествующим знаком @.

Вобычных константах некоторые символы интерпретируются особым образом.

Связано это прежде всего с тем, что необходимо уметь задавать в строке непечатаемые символы, такие, как, например, символ табуляции. Возникает необходимость задавать символы их кодом - в виде escape-последовательностей. Для всех этих целей используется комбинация символов, начинающаяся символом "\" - обратная косая черта. Так, пары символов: "\n", "\t", "\\", "\"" задают соответственно символ перехода на новую строку,

символ табуляции, сам символ обратной косой черты, символ кавычки, вставляемый в строку, но не сигнализирующий о ее окончании. Комбинация "\xNNNN" задает символ,

определяемый шестнадцатеричным кодом NNNN. Хотя такое решение возникающих проблем совершенно естественно, иногда возникают неудобства: например, при задании констант, определяющих путь к файлу, приходится каждый раз удваивать символ обратной косой черты. Это одна из причин, по которой появились @-константы.

В @-константах все символы трактуются в полном соответствии с их

изображением. Поэтому путь к файлу лучше задавать @-константой. Единственная

проблема в таких случаях: как задать символ кавычки, чтобы он не воспринимался как

конец самой константы. Решением является удвоение символа. Вот соответствующие

примеры:

public void ExString()

{

//Два вида констант string s1 = "\x50"; string s2 = @"\x50"""; bool b1 = (s1 == s2);

Console.WriteLine("s1={0}, s2={1}, b1={2}", s1, s2, b1); s1 = "c:\\c#book\\ch5\\chapter5.doc";

s2 = @"c:\c#book\ch5\chapter5.doc";

b1 = (s1 == s2);

Console.WriteLine("s1={0}, s2={1}, b1={2}", s1, s2, b1); s1 = "\"A\"";

s2 = @"""A""";

b1 = (s1 == s2);

Console.WriteLine("s1={0}, s2={1}, b1={2}", s1, s2, b1);

}

Статические свойства и методы класса String

Метод

Описание

Empty

Возвращается пустая строка. Свойство со статусом read only

Compare

Сравнение двух строк. Метод перегружен. Реализации метода позволяют

 

сравнивать как строки, так и подстроки. При этом можно учитывать или не

 

учитывать регистр, особенности национального форматирования дат, чисел и

 

т.д.

CompareOrdinal

Сравнение двух строк. Метод перегружен. Реализации метода позволяют

 

сравнивать как строки, так и подстроки. Сравниваются коды символов

Concat

Конкатенация строк. Метод перегружен, допускает сцепление произвольного

 

числа строк

Copy

Создается копия строки

Format

Выполняет форматирование в соответствии с заданными спецификациями

 

формата.

Intern, IsIntern

Отыскивается и возвращается ссылка на строку, если таковая уже хранится во

 

внутреннем пуле данных. Если же строки нет, то первый из методов добавляет

 

строку во внутренний пул, второй - возвращает null. Методы применяются

 

обычно тогда, когда строка создается с использованием построителя строк -

 

класса StringBuilder

Join

Конкатенация массива строк в единую строку. При конкатенации между

 

элементами массива вставляются разделители. Операция, заданная методом Join,

 

является обратной к операции, заданной методом Split. Последний является

 

динамическим методом и, используя разделители, осуществляет разделение

 

строки на элементы

Задачи для самостоятельной работы

Удалить группу символов, расположенных между круглыми скобками включая сами

скобки.

Дано натуральное число n и n символов. Подсчитать, сколько раз среди данных символов встречается символ "+" и сколько раз символ "*".

Подсчитать общее число вхождений символов "+", "-", "*" в последовательности n

символов.

Выделить символы, заключённые в фигурные скобки.

Удалить символы, заключённые в фигурные скобки.

Переставить местами группы символов While и Do.

Переставить местами группы символов Repeat и Until.

Подсчитать наибольшее число букв а, идущих подряд в данной последовательности символов.

Вычислить s- сумму порядковых номеров всех букв, входящих в слово SUM.

Напечатать текст, образованный литерами с порядковыми номерами 65, 71 и 69.

Если в заданный текст входит каждая из букв слова key, тогда напечатать yes, иначе no.

Напечатать заданный текст, удалив из него лишние пробелы, т.е. из нескольких подряд идущих пробелов оставить только один.

В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяет ли он следующему свойству:

текст содержит (помимо букв) только одну цифру причём её числовое значение равно длине текста;

сумма числовых значений цифр, входящих в текст, равна длине текста;

Логической переменной b присвоить значение true, если между литерами 'a' и 'z' нет иных символов, кроме строчных латинских букв, и значение false иначе.

Дана строка, подсчитать сколько раз встречается буква a.

Даны натуральное число n, символы S1, S2, ..., Sn. Подсчитать, сколько раз среди данных символов встречается буква b.

Даны натуральное число n, символы S1, S2, ..., Sn. Подсчитать:сколько раз среди данных символов встречается символ "+" и сколько раз символ "*";

общее число вхождений символов "+", "-" и "*" в последовательность S1, S2, ..., Sn.

Дана последовательность S1, S2, ..., Sn, заменить в ней:

все восклицательные знаки точками;

каждую точку многоточием;

каждую из групп стоящих рядом точек одной точкой;

каждую из групп стоящих рядом точек многоточием.

Даны натуральное число n, символы S1, S2, ..., Sn. Выяснить, имеются ли в последовательности S1, S2, ..., Sn такие члены последовательности Si и Si+1, что Si – это запятая, Si+1 - это тире.

Даны натуральное число n, символы S1, S2, ..., Sn. Получить первое натуральное i, для которого каждый из символов Si и Si+1, совпадают с буквой А. Если такой пары в последовательности S1, S2, ..., Sn нет, то ответом должно быть число 0.

Даны натуральное число n, символы S1, S2, ..., Sn. Известно что среди S1, S2, ..., Sn

есть по крайней мере одна запятая. Найти такое натуральное i, что:

Si - первая по порядку запятая;

Si - последняя по порядку запятая.

Даны натуральное число n, символы S1, S2, ..., Sn. Преобразовать удалив каждый символ "*" и повторив каждый символ отличный от "*".

Даны натуральное число n, символы S1, S2, ..., Sn, среди которых есть двоеточие.

получить все символы, расположенные до первого двоеточия включительно.

получить все символы, расположенные после первого двоеточия включительно.

получить все символы, расположенные между первым и вторым двоеточиями.

Если второго двоеточия нет, то получить все символы после первого двоеточия.

Даны натуральное число n, символы S1, S2, ..., Sn.

подсчитать наибольшее количество идущих подряд пробелов;

выяснить, верно ли, что в последовательности S1, S2, ..., Sn имеются пять идущих подряд букв С.

Даны натуральное число n, символы S1, S2, ..., Sn. Группы символов, разделённых пробелами (одним или несколькими) и не содержащим пробелов внутри себя будем называть словами.

подсчитать количество букв "а" в последнем слове данной последовательности.

найти количество слов, начинающихся с буквы "с".

найти количество слов, у которых первый и последний символы совпадают.

подсчитать количество слов в данной последовательности.

найти какое-нибудь слово, начинающиеся с буквы "а".

преобразовать данную последовательность, заменяя всякое вхождение слова

"это" на слово "то".

найти длину самого короткого слова.

найти длину самого длинного слова.

удалить все символы, не являющиеся буквами.

заменить все малые буквы одноимёнными большими.

Найти самое длинное слово в предложении.

Найти первое симметричное слово в предложении.

Заменить заданное слово предложения на другое слово.

Найти в предложении слова, которые начинаются на одну и ту же букву.

Напечатать предложение, удалив из него повторное вхождение слов.

Напечатать различные слова предложения, указав для каждого из них число его вхождений.

Напечатать предложение после удаления средней буквы для слов нечётной длины.

Напечатать слова предложения в алфавитном порядке.

Список литературы.

а) основная литература:

1.Могилёв А.В., Пак Н.И., Хеннер Е.К. Информатика: Учеб. пособие для студ. пед. ву-зов / Под ред. Е.К. Хеннера. — М., Academia, 2004.

2.Сборник задач по программированию. / Авт.-сост. А.П. Шестаков; Перм. ун-т. — Пермь, 2001. (Ч. I — 76 с.; Ч. II (Олимпиадные задачи) — 112 с.)

3.Семакин И.Г., Шестаков А.П. Основы программирования: Учебник. — М.: Мастерство, НМЦ СПО; Высшая школа, 2004. — 432 с.

б) дополнительная литература:

1.Абрамов С.А. и др. Задачи по программированию. — М.: Наука, 1988.

2.Алексеев В.Е. и др. Вычислительная техника и программирование. Практикум по программированию. — М.: ВШ, 1991.

3.Бондарев В.М., Рублинецкий В.И., Качко Е.Г. Основы программирования. — Харьков: Фолио, Ростов н/Д: Феникс, 1997. — 368 с.

4.Вирт Н. Алгоритмы и структуры данных. — М.: Мир, 1989.

5.Вирт Н. Алгоритмы + структура данных = программы. — М.: Мир, 1985.

6.Гладков В.П. Конспект лекций по программированию для начинающих: Учеб. пособие / Перм. гос. техн. ун-т. — Пермь, 1998. — 217 с.

7.Гладков В.П. Курс лабораторных работ по программированию: Учебное пособие для специальностей электротехнического факультета ПГТУ / Перм. гос. техн. ун-т.

Пермь, 1998. — 153 с.

8.В.П. Гладков, А.П. Шестаков. Вопросы, задания и контрольные работы для начинающих программистов (материалы к уроку). //Информатика, 2001, № 20(309).

с. 10-13; №№ 33-35, 37-38, 40.

9.В.П. Гладков, А.П. Шестаков. Вопросы, задания и контрольные работы для начинающих программистов (избранные темы). //Информатика, 2003, №№ 27-28 (412-413) — 64 с.

10.Грызлов В.И., Грызлова Т.П. Турбо Паскаль 7.0. — М.: ДМК, 1998. — 400 с.

11.Дайтибегов Д.М., Черноусов Е.А. Основы алгоритмизации и алгоритмические языки. — М.: ФиС, 1992.

12.Джонс Ж., Харроу К. Решение задач в системе Turbo Pascal. — М.: ФиС, 1991.

13.Дмитриева М.В., Кубенский А.А. Элементы современного программирования. — СПб: изд-во С.-П. университета, 1991.

14.Зуев Е.А. Практическое программирование на языке Turbo Pascal 6.0, 7.0. — М.: Радио и связь, 1994.

15.Зубов В.С. Программирование на языке Turbo Pascal (версии 6.0 и 7.0). — М.: Информационно-издательский дом "Филинъ", 1997. — 320 с.

16.Есаян А.Р. и др. Информатика. — М.: Просвещение, 1991.

17.Информатика. Задачник-практикум в 2 т. / Под ред. И. Семакина, Е. Хеннера. М.: Лаборатория Базовых Знаний, 1999.

18.Культин Н.Б. Программирование в Turbo Pascal и Delphi. — СПб.: BHV — Санкт-

Петербург, 1998. — 240 с.

19.Ляхович В.Ф. Руководство к решению задач по основам информатики и вычислительной техники. — М.: ВШ, 1994.

20.Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. / Под ред. Тарасенко В.П. — К,: ВЕК+, М.: Бином Универсал, 1998. — 496 с.

21.Могилёв А.В., Пак Н.И., Хеннер Е.К. Информатика: Учеб. пособие для студ. пед.

вузов / Под ред. Е.К. Хеннера. — М., Academia, 1999.

22.Окулов С.М. Основы программирования. — М.: ЮНИМЕДИАСТАЙЛ, 2002. — 424 с.

23.Пильщиков В.Н. Сборник упражнений по языку Pascal. — М.: Наука, 1989.

24.Попов В.Б. Турбо-Паскаль для школьников. М.: ФиС, 1999. — 528 с.

25.Сборник задач по программированию. / Авт.-сост. А.П. Шестаков; Перм. ун т. — Пермь, 1999. (Ч. I — 76 с.; Ч. II (Олимпиадные задачи) — 112 с.)

26.Семакин И.Г., Шестаков А.П. Лекции по программированию. — Пермь, изд-во ПГУ, 1998.

27.Семакин И.Г., Шестаков А.П. Основы алгоритмизации и программирования: Учебник для сред. проф. образования / И.Г. Семакин, А.П. Шестаков. — М.: Издательский центр "Академия", 2008. — 400 с. (Допущено Министерством образования и науки Российской Федерации)

28.Сергиевский М.В., Шалашов А.В. Turbo Pascal 7.0. — М.: Машиностроение, 1994.

29.Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. — М.: "Нолидж", 1997. — 616 с.

30.Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие.

— М.: "Нолидж", 1997. — 432 с.

31.Фролов Г.Д., Кузнецов Э.И. Элементы информатики. — М.: ВШ, 1989.

32.Шень А. Программирование: теоремы и задачи. — М.: МЦНМО, 1995.

в) программное обеспечение и Интернет-ресурсы:

1.http://msdn.microsoft.com/ru-ru/default.aspx

2.http://citforum.ru

3.http://durus.ru

4.http://www.rushelp.com

5.http://www.delphimaster.ru

6.http://www.codenet.ru/cat/Languages/Delphi

7.http://rudelphi.info/

8.http://www.delphikingdom.com

9.http://www.compdoc.ru

10.http://www.emanual.ru