25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Упражнения<br />

Глава 25. Практически изпит по програмиране (тема 2) 1071<br />

1. Решете задачата "броене на думи в текст", използвайки само един<br />

буфер за четене (StringBuilder). Промени ли се сложността на<br />

алгоритъмът ви?<br />

2. Реализирайте по-ефективно решение на задачата "матрица с прости<br />

числа" като търсите простите числа с "решето на Ератостен":<br />

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes.<br />

3. Добавете поддръжка на операциите умножение и целочислено деление<br />

в задачата "аритметичен израз". Имайте предвид, че те са с по-висок<br />

приоритет от събирането и изваждането!<br />

4. Добавете поддръжка на реални числа, не само цели.<br />

5. Добавете поддръжка на скоби в задачата "аритметичен израз".<br />

6. Напишете програма, която валидира аритметичен израз. Например<br />

"2*(2.25+5.25)-17/3" е валиден израз, докато "*232*-25+(33+а" е<br />

невалиден.<br />

Решения и упътвания<br />

1. Можете да четете входния файл символ по символ. Ако поредният символ<br />

е буква, го добавяте към буфера, а ако е разделител, анализирате<br />

буфера (той съдържа поредната дума) и след това зачиствате буфера.<br />

Когато свърши входния файл, трябва да анализирате последната дума,<br />

която е в буфера (ако файлът не завършва с разделител).<br />

2. Помислете първо колко прости числа ви трябват. След това помислете<br />

до каква стойност трябва да пускате "решето на Ератостен", за да ви<br />

стигнат простите числа за запълване на матрицата. Можете опитно да<br />

измислите някаква формула.<br />

3. Достатъчно е да изпълните първо всички умножения и деления, а след<br />

тях всички събирания. Помислихте ли за деление на нула?<br />

4. Работата с реални числа можете да осигурите като разширите използването<br />

на символа "." и заместите int с double.<br />

5. Можем да направим следното: намираме първата затваряща скоба и<br />

търсим наляво съответната й отваряща скоба. Това, което е в скобите,<br />

е аритметичен израз без скоби, за който вече имаме алгоритъм за<br />

изчисление на стойността му. Можем да го заместим със стойността му.<br />

Повтаряме това за следващите скоби докато скобите свършат. Накрая<br />

ще имаме израз без скоби.<br />

Например, ако имаме "2*((3+5)*(4-7*2))", ще заместим "(3+5)" с 8,<br />

след това "(4-7*2)" с -10. Накрая ще заместим (8*-10) с -80 и ще<br />

сметнем 2*-80, за да получим резултата -160. Трябва да предвидим

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!