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

Давыдов В.Г. - Программирование и основы алгоритмизации - 2003

.pdf
Скачиваний:
839
Добавлен:
13.08.2013
Размер:
9.55 Mб
Скачать

r=l;

}

else

r=3;

 

Ответ

к упражнению 3.

swi

tab(

1 )

 

{

4:

 

 

case

;

 

 

n-h+

 

 

break;

 

case

1:

case

7; case 9:

 

n=a+b;

 

 

break;

 

de£ault:

 

 

 

n=a-b;

 

Ответ к упражнению

4.

Будет напечатано:

 

•к

 

-- О - - -1 -2

-- -3 - - -4

/*

Ответ

к упражнению

5.

 

 

 

 

 

 

Файл 4__12_5. срр

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int

5.

Пусть

определен

];

массив

 

 

 

 

 

Напишите

а[

25

 

 

который напечатает с

но­

вой

фрагмент

Си-программы,

строки

значения

элементов

"а"

по 5

элементов

в

строке

и

по

10 позиций

на

элемент.

Решить

задачу

с помош^ю

цикла

 

while.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В.

Давыдов.

Консольное

приложение

(Microsoft

Visual

Stu­

dio

C++

6.

0)

 

 

 

 

 

 

 

 

 

 

 

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^include

 

<stdio.h>

 

 

 

//

Для

ввода-вывода

 

 

 

Int

main

(

vo±dL )

 

 

 

//

Возвращает

0 при

успехе

 

 

{

int

 

 

 

a[

25

];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Инициализация

i<25;

массива

)

 

 

 

 

 

 

for(

 

int

i=0;

 

 

i + +

 

 

 

 

 

320

{

а[

i

]

= 1;

 

 

}

 

 

 

 

 

 

 

 

 

//

Печать

массива

 

±

= О;

i<25

)

 

 

 

while(

 

 

 

{

±f(

 

!(

1%5

)

)

 

 

 

) ;

 

 

 

printf

(

"\п"

 

printf(

"%10d",

a[ ± ] ) ;

}

i + + ;

 

 

 

 

 

(

"\n"

)

;

 

 

printf

 

 

z-etux-n 0;

 

 

 

 

Ответ

 

к упражнению

6.

При любых исходных значениях "А:" цикл будет выполняться конечное число раз.

18.6. Для подраздела 6.9

 

Ответ

к упражнению 7.

 

Будет напечатано:

10

13

16

15

13

11

 

Ответ

купрамснению 2.

 

 

 

Будет напечатано:

 

 

 

рр-р

=

4

*рр-а

-

4

**рр

=

14

рр-р

=

3

*рр-а = 3

**рр

=

13

рр-р

- • =

4

*рр-а = 4

**рр

=

14

рр-р

=

4

*рр-а

=

3

**рр

=

13

18.7. Для подраздела 8.16

Ответ к упражнениям 1-3.

Файл LS.CPP

321

 

Определены

 

следующие

данные:

 

 

 

 

 

 

 

 

 

 

struct

 

ELEM

 

 

 

 

 

 

//

 

Структура

 

для

элемента

 

списка

 

{

Int

 

 

 

dat;

 

 

 

//

 

Данное

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ELEM

 

 

*next;

 

 

//

 

Указатель

 

на

следующей

 

элемент

 

}

 

 

 

 

 

*start

 

 

//

 

Указатель

 

на

начало

 

списка

 

 

 

Во

 

входном

 

файле

 

Is,dat

 

содержится

 

некоторое

 

 

количество

 

целых

 

чисел

г

разделенных

 

символами

пробельной

 

группы

(

' ',

'\t',

 

'\л ' ; .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.

Написать

прототип,

определение

и

пример

вызова

 

функции

для ввода

из

входного

 

файла

 

имеющихся

 

там

чисел,

 

 

представив

введенную

информацию

 

 

линейным

списком,

 

в

котором

каждый

узел

(динамически

 

 

размещенная

структура)

содержит

две

 

компоненты.

Первая

 

компонента

 

хранит

данное

(введенное

 

число),

 

а вторая

-

указывает

адрес

следующей

структуры.

При

этом первое

 

прочи­

танное

 

число

 

должно

 

находиться

в

начале

линейного

 

списка.

Ис­

ходные

 

данные

и

результаты

 

работы

функции

следует

 

передавать

через

 

список

 

 

параметров,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

С

целью

 

обработки

 

 

ошибок

 

предусмотреть

 

контроль

 

значений,

возвращаемых

 

 

функциями

библиотеки

языков

Си/C++,

 

 

 

 

 

2.

 

Дополнительно

 

 

написать

 

прототип,

 

определение

 

и

пример

вызова

 

функции

для

печати

в

 

файл

ks.out

на

магнитном

 

диске

 

содержимого

 

линейного

 

 

списка,

 

Требования

 

к

оформлению

 

функции

и

обработке

 

ошибок

аналогичны

 

указанным

выше

 

требованиям,

 

 

3.

 

Дополнительно

 

 

написать

 

прототип,

 

определение

 

и

пример

вызова

 

функции,

 

которая

разрушает

линейный

 

список.

 

Требования

к

оформлению

 

функции

 

и обработке

ошибок

аналогичны

 

указанным

в

пункте

1

 

требованиям,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В.

Давыдов,

 

Консольное

 

приложение

 

(Microsoft

 

 

Visual

 

Studio

 

C++

6,0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^Include

 

<stdlo.h>

 

 

 

 

//

 

Для

функций

 

 

ввода-вывода

 

 

^Include

 

<stdllb,h>

 

 

 

 

//

 

Для

функции

 

exit

 

 

 

 

 

stmict

 

EL

 

 

 

 

 

 

 

//

 

Структура

 

для

элемента

 

списка

 

{

int

 

 

 

dat;

 

 

 

//

 

Данные

(целое)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

EL

 

 

 

*next;

 

 

//

 

Указатель

 

на

следующий

 

элемент

 

} ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Прототипы

 

функций

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void

Create__beg

(

EL

*&,

char

 

* )

;

 

 

 

 

 

 

 

 

 

void

Add_end(

 

EL

*&,

 

int

) ;

 

 

 

 

 

 

\

 

 

 

 

 

void

Prlnt_ls

 

( EL

*,

 

char

*,

char

*

) /

 

 

 

 

 

 

 

 

void

Dest_ls(

 

EL

*&

)

;

 

 

 

 

 

 

 

 

 

 

 

 

 

void

Del_beg(

 

EL

*&

)

;

 

 

 

 

 

 

 

 

 

 

 

 

 

int

main (

void

)

 

 

 

 

//

 

Возвращает

 

0

при

успехе

 

 

 

{

//

 

Указатель

на

начало

 

списка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

322

EL

*start;

 

start

= NULL/

//

Инициализация списка

// Заполнение

линейного

списка символами из файла LS.DAT:

//первый прочитанный символ - в начале списка

Create_beg( starts "LS.DAT" );

//Вывод содержимого списка в файл

 

Print_ls(

 

start,

"LS.OUT"r

"w");

 

 

 

 

 

 

Dest_ls

(

start

) ;

//

Разрушение

списка

 

 

 

jretixzm

0;

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Заполнение

линейного

списка

символами

из

файла

LS.DAT:

//

первый

прочитанный

символ

- в начале

списка

 

void.

Crea te_beg (

 

 

 

 

 

 

 

 

 

 

 

EL

 

*&start,

//

Указатель на

начало

списка

 

//

Указатель

на

файл ввода

 

 

 

 

 

 

 

cbstr

 

*pFlleInp

)

 

 

 

 

 

 

 

{

//

Данное

для

элемента,

добавляемого

 

в

конец

списка

 

 

 

Int

 

 

1 /

 

 

 

 

 

 

 

 

 

 

// Указатель

на

структуру

со сведениями

о

файле для

//чтения

FILE *f_±n;

//Открываем файл для чтения

±£( ( f_in

= fopen(

pFllelnp,

"г" )

)

== NULL )

{

 

 

 

 

 

printf

( "\n Файл %s для

чтения

не

открыт \л",

 

pFilelnp

) ;

 

 

 

e x i t ( l ) ;

 

 

 

 

}

 

 

 

 

 

±nt

re;

 

 

 

 

//Указатель на файл ввода // Создаем список

wb±le( ( ГС = fscanfC f_in, " %d ", &i ) ) == 1 )

{

Add_end(

start,

i

);

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

//

Закрываем

файл

 

 

 

 

 

±£(

( fclose(

f_in

) ) =- EOF )

 

 

{

 

"\n Файл %s не

закрыт

\л", pFilelnp

);

 

printf(

 

e x i t ( 2 ) ;

 

 

 

 

 

}

 

 

 

 

 

 

 

jretixzm/

 

 

 

 

 

 

;

 

 

 

 

 

 

 

// Добавление элемента

в

конец

списка

 

 

void Add_end(

 

 

 

 

 

 

EL

*&start,

//

указатель на

начало списка

 

323

int

i)

//

Данные добавляемого

элемента

// Указатель

на

новый

(добавляемый)

элемент

списка

EL

*temp,

Указатель

на

текущий

элемент

 

*сиг;

//

temp = new

EL;

//

1: динамическое

размещение

 

 

//

элемента

 

 

±f( temp == NULL )

 

{

printf(

 

"\n

Элемент

списка

не размещен

\п" ) /

 

 

 

 

 

 

 

 

 

exit

(

3

) ;

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

=

1;

 

 

//2:

 

занесение

данного

 

 

 

temp->dat

 

 

 

3:

 

 

 

temp->next

= NULL;

 

//

новый

элемент

является

 

 

 

 

 

 

 

 

 

//

Новый

последним

(пустой)

 

 

 

±£(

start

 

== NULL

)

//

список

списка

 

else

start

 

=

temp;

 

//

4а:

указатель

на начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

//

46:

проходим

весь

список

от начала^

пока

текущий

 

 

 

 

//

=

элемент

не

станет

последним

 

 

 

 

 

сиг

 

start;

 

!=

NULL

)

 

 

 

 

 

 

 

wb±le(

cur->next

 

 

 

 

 

 

 

 

 

//

Продвижение

по

списку

 

 

 

 

 

 

 

//

сиг

=

cur->next;

 

элемента

на

новый^

 

 

 

 

4в:

ссылка

последнего

 

 

 

 

 

//

 

добавляемый

в

конец

 

списка

 

 

 

 

 

cur->next

=

temp;

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

геЬизпл;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

Печать содержимого

 

списка

на

 

экран

 

 

 

 

void

Prlnt_ls

(

*start,

 

 

//

Указатель

на

начало

списка

 

 

EL

 

 

 

 

 

 

сЬа2Г

 

*pFileOut,//

//

Указатель

на

файл

вывода

 

файла

(

char

 

 

*pMode

)

Указатель

на

режим

открытия

EL

 

*ргп;

 

 

 

//

Указатель

на

печатаемый

элемент

 

 

 

 

 

 

±£(

start

 

== NULL

)

 

 

 

 

 

 

 

 

 

 

{

 

 

 

"\п

Список

пуст.

Распечатывать

нечего

\п"

) ;

 

 

printf

 

(

 

 

retu2m;

 

 

 

 

 

 

 

 

 

 

 

 

 

}

//Открываем файл вывода

FILE

*f_out

= fopen( pFileOut,

pMode

) ;

±f( !f__out

)

 

 

 

{

( "\n Ошибка открытия файла

вывода

&s \ л " ,

printf

 

pFlleOut

) ;

 

 

324

exit(

4

) ;

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

prn =

start;

 

 

 

//

Указатель

на начало

списка

fprintf(

f_out,

"\л

Состояние

линейного

списка:

\п" ) /

int

 

i

^

О;

 

 

 

 

 

 

 

while

( prn

! = NULL )

//

До конца

списка

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

if(

! (

i%4

) )

 

 

 

 

 

 

 

 

fprintfi

f_out,

"\n"

) ;

 

 

 

 

//Печать данных элемента

fprintfi

f_out,

"%15d", prn->dat

)

;

prn = prn->next;

// Продвижение

no

списку

;

 

/ /

Закрываем

 

файл

вывода

 

 

 

 

 

 

fclose(

f_out

)

/

 

 

 

 

 

 

 

 

 

rBturzi/

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//***********************************************************

 

/ /

Разрушение

списка

 

 

 

 

 

 

 

 

void

Dest_ls

(

 

 

 

 

 

 

 

 

 

 

 

 

EL

 

 

*&start

)

//

Указатель

на

начало

списка

 

{

±f(

start

== NULL

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

printf(

 

"\n

Список

пуст. Удалять

нечего"

) ;

 

 

 

 

 

 

}

return;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

while(

start

 

/=

NULL

)

 

 

 

 

 

 

 

 

Del_beg(

 

start

)

;

/ / Удаление

первого

элемента

списка

return;

}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

325

// Удаление

первого

элемента

списка

 

 

 

 

 

void

Del_beg(

*&start

) //

Указатель

на

 

начало

списка

EL

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

EL

 

 

*del;

 

//

Указатель

на

 

удаляемый

элемент

±f(

start

==

NULL

)

 

 

 

 

 

 

 

{

printf

(

"\n

Список

пуст.

Удалять

 

нечего"

)

;

 

 

}

return/

 

 

 

 

 

 

 

 

 

 

 

1:

подготовка

 

первого

элемента

для

удаления

 

//

 

 

del

-

start;

 

 

//

2:

start

сдвигается

на

второй

start

= del->next;

 

delete

del;

 

 

 

//

1:

элемент

первого

элемента

 

 

 

//

удаление

return;

ПРИЛОЖЕНИЯ

Приложение П.1. Тесты и программные проекты. Варианты заданий

П.1.1. Тесты (контрольные работы)

На практических занятиях по основным разделам курса целе­ сообразно провести тестирование. Такими разделами являются:

• программирование на ПМ-ассемблере;

Qввод;

овывод;

простейшие ветвления;

ациклы;

аструктуры; Q функции;

ообласти действия определений;

омассивы и указатели;

оработа с динамической памятью и операции с линейным списком;

апрепроцессор, перечисления, функции с умалчиваемыми значениями аргументов, перегрузка функций, шаблоны функций, перегрузка операций.

П.1.1.1. Программирование на ПМ-ассемблере. Варианты тестов

Изобразить схему программы и написать законченную программу на языке ПМ для решения заданной задачи. Для ввода и

вывода использовать файлы MS DOS. Для обеспечения наглядности вывода использовать строковые данные.

Вариант 1. Ввести и напечатать значения элементов массива целого типа с фиксированным размером 10 (для упрощения про­ граммы размер массива вводить не нужно). Вычислить и напечатать среднее значение для множества отрицательных элементов массива. Постарайтесь не потерять в вычисленном среднем значении дроб­ ную часть. Если массив не содержит элементов с отрицательными значениями, то в качестве ответа напечатать "В массиве нет отрица­ тельных элементов".

Вариант 2. Ввести и напечатать значения элементов массива целого типа с фиксированным размером 8 (для упрощения размер массива вводить не нужно). Вычислить и напечатать значение наи-

327

большего элемента массива.

Вариант 3. Ввести и напечатать значения элементов массива вещественного типа с размером 10. Вычислить и напечатать количе­ ство отрицательных элементов массива.

Вариант 4, Ввести и напечатать значения элементов массива вещественного типа с размером 20. Вычислить и напечатать индекс наименьшего элемента массива.

Вариант 5. Ввести и напечатать значения элементов массива целого типа с размером 20. Вычислить и напечатать среднее ариф­ метическое для элементов массива. Постарайтесь, чтобы дробная часть в результате не потерялась.

Вариант 6, Ввести и напечатать значение переменной х веще­ ственного типа. Вычислить для нее восьмую степень и напечатать вычисленное значение. Решить задачу с использованием только трех умножений.

Вариант 7. Ввести и напечатать значения переменных а, 6, с вещественного типа. Определить наибольшее значение среди них, присвоить его переменной d и напечатать. Решить задачу с исполь­ зованием только двух сравнений.

Вариант 8, Ввести и напечатать значения переменных а, Ь, с вещественного типа. Определить и напечатать, сколько среди них отличных от нуля.

Вариант 9, Ввести и напечатать значения переменных а, b це­ лого типа. Определить, равны ли они друг другу, и напечатать ответ.

Вариант 10. Ввести и напечатать значения переменных а, b вещественного типа. Определить количество положительных значе­ ний среди заданных и напечатать ответ.

Вариант 11, Ввести и напечатать значения переменной х ве­ щественного типа. Вычислить и напечатать значение функции у :=

\х\.

Вариант 12. Ввести и напечатать значения переменных а, Ь, с, d вещественного типа. Определить и напечатать z := max( min( а, b ), max( с, d ) ) .

328

Вариант

13, Ввести и напечатать значения переменных х, у и

Z вещественного типа.

Вычислить и

напечатать значения

переменных и := тах( х, у,

z ) , / : = min( х, у,

z ).

Вариант

14. Ввести и напечатать значения переменных а, Ь, с,

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

Вариант

15. Ввести и напечатать значения переменных хну

вещественного

типа. Вычислить и напечатать значения перемен­

ных и := тах( д:, у ) , / : = min( д:, у ).

Вариант

16. Ввести и напечатать значения переменных х, у^ z

вещественного типа. Вычислить и напечатать целое/7 по правилу:

 

1

при к = min{

X^

у^

Z

) ,

Р : =

2

при у =

min{

X ^

у г

Z

) ,

 

3

при Z =

m i n (

X,

у г

z

)

Вариант 17. Ввести и напечатать значения переменных а, 6, с вещественного типа. Присвоить переменной а максимальное, а пе­ ременной Ъ - минимальное из указанных значений. После этого на­ печатать их значения.

Вариант 18. Ввести и напечатать значение х вещественного типа. Вычислить и напечатать значение у:

+ 1

У : = О

- 1

при

X >

О ^

при

X

=

О,

при

X

< О

Вариант 19. Ввести и напечатать значения переменных а, Ь, с, d вещественного типа. Определить и напечатать количество нулевых значений среди заданных.

Вариант 20. Ввести и напечатать значения переменных а, 6, с, d вещественного типа, причем два из них одинаковы. Найти и напе­ чатать значение, отличное от этих двух.

329