Изучение Си после Паскаля: циклы, развилки, функции, обработка одномерных массивов — КиберПедия 

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

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

Изучение Си после Паскаля: циклы, развилки, функции, обработка одномерных массивов

2022-10-28 35
Изучение Си после Паскаля: циклы, развилки, функции, обработка одномерных массивов 0.00 из 5.00 0 оценок
Заказать работу

О.Ф.Власенко, И.В.Беляева

ИЗУЧЕНИЕ СИ ПОСЛЕ ПАСКАЛЯ: ЦИКЛЫ, РАЗВИЛКИ, ФУНКЦИИ, ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ

 

Методические указания к выполнению лабораторных работ по программированию для студентов направления 5528 “Информатика и вычислительная техника” и специальности 2201 “Вычислительные машины, комплексы, системы и сети”

 

                                       Ульяновск 2003


 

УДК 681.3 (076)

ББК 32.97 я 7

   В58

 

Рецензент             

Доцент кафедры «Информационные системы», канд. техн. наук, О.Н. Евсеева

 

                            Одобрены секцией методических пособий

                             научно-методического совета университета

 

 

Власенко О.Ф., Беляева И.В.

В58 Изучение Си после Паскаля: циклы, развилки, функции, обработка одномерных массивов: Методические указания к лабораторным работам. – Ульяновск: УлГТУ, 2003.- 68 с.

 

Методические указания предназначены для студентов, знающих язык программирования Турбо Паскаль и изучающих язык Си. В методических указаниях рассмотрены основные элементы языка Си в сравнении с языком Турбо Паскаль: управляющие конструкции (циклы и развилки), вопросы создания пользовательских функций, стандартные функции ввода/вывода, обработка одномерных массивов. Рассмотрены различия синтаксисов Си и Турбо Паскаля, различия в использовании управляющих конструкций. В методические указания включено большое количество примеров, а также задания для трех лабораторных работ: «Циклы и вывод в Си», «Вычисление математических функций» и «Обработка одномерных массивов».

Методические указания могут быть использованы студентами, изучающими дисциплины “Информатика”, “Программирование на языке высокого уровня” при изучении языка Си.

Работа подготовлена на кафедре ВТ.

Печатается в авторской редакции.

                                                                           УДК 681.3 (076)

                                                                           ББК 32.97 я 7

 

ã О.Ф. Власенко, И.В. Беляева, 2003

ã Оформление. УлГТУ, 2003


ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ.. 4

ВЫВОД В ЯЗЫКЕ СИ.. 5

Простейшая программа «Привет, мир!». 5

Функция PRINTF – форматированный вывод.. 6

Циклы В ЯЗЫКЕ СИ.. 9

«Привет, мир!» 100 раз. 9

Цикл с предусловием в Паскале и Си.. 9

Цикл с постусловием в Паскале и Си.. 10

Цикл for в Паскале и Си.. 11

задание для Лабораторной работы по теме «ЦИКЛЫ и вывод в Си» 14

ФУНКЦИИ В ЯЗЫКЕ СИ.. 20

Локальные и глобальные переменные. 20

Функции без параметров в Си.. 21

Функции с параметрами.. 23

Способы передачи параметров в подпрограммы.. 25

Работа с указателями: операции взятия адреса и разыменования адреса.. 26

ВВОД В ЯЗЫКЕ СИ.. 29

Функция GETCH – ввод символа.. 29

Функция SCANF - форматированный ввод.. 29

РАЗВИЛКИ.. 30

Пример задачи: размер файла в байтах.. 30

Усеченные развилки.. 30

Полные развилки.. 32

задание для Лабораторной работуы по теме «Вычисление математических функций». 35

ОРГАНИЗАЦИЯ МЕНЮ. Управляющая структура Выбор (SWITCH) 46

Организация простейшего меню... 46

Выбор. 46

МАССИВЫ В СИ.. 51

Объявление массива в Си.. 51

Вычисление адреса элемента массива.. 52

Адресная арифметика.. 52

Имя массива является указателем на нулевой элемент массива.. 53

Передача массива в функцию через параметр. 54

Примеры обработки массивов в Си.. 55

Задание для лабораторной работы по теме «Обработка одномернЫХ массивОВ». 58

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

ВВЕДЕНИЕ

 

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

В представляемых методических указаниях читателю-студенту предлагается познакомиться с языком программирования Си. Предполагается, что читатель знаком с языком Паскаль в объеме вузовского семестрового курса программирования или усиленного школьного двухгодичного курса информатики. Предполагается, что читатель собственноручно написал, по крайней мере, десяток простых программ и что он уверенно работает в Турбо-среде (Турбо Паскаль 7.0).

Предлагаемые лабораторные работы должны быть выполнены в среде Borland C++ 3 (BC3). Среда BC3 практически полностью совпадает со средой Turbo Pascal 7, поэтому при ее изучении больших проблем у читателя не возникнет. А вот с изучением языка Си проблемы возникают. Хотя создан язык Си примерно в те же годы, что и Паскаль (Си в 1972 (Деннис Ритчи), а Паскаль в 1970 (Никлаус Вирт)), но эти два языка принципиально отличаются. Язык Паскаль создавался специально для обучения студентов вузов программированию. Язык Си создавался для замены языка Ассемблер при разработке операционных систем. Постепенно Паскаль стал использоваться не только для целей обучения. Язык Си также перестал быть только языком для написания операционных систем. И Паскаль, и Си в сегодняшнем мире информационных технологий занимают достаточно высокие места в рейтинге универсальных языков программирования и активно используются в различных проектах.

Данные методические указания не имеют цели заменить собой справочник по языку Си. При выполнении лабораторных работ, задание на которые включены в методические указания, Вам потребуются книги по Си, например [1] и/или [2].

ВЫВОД В ЯЗЫКЕ СИ

 

Простейшая программа «Привет, мир!»

 

По традиции, заложенной в книге [1], изучение языка Си начнем с программы, выводящей на экран строку с приветствием миру.

 

Пример на Паскале:

1> Begin

2> Writeln(‘Привет, мир!’);

3> End. 

Разберем эту программу на Паскале.

В строке 1 (Begin) начинается тело программы.

В строке 2 (Writeln(‘Привет, мир!’);) вызывается стандартная процедура writeln, которая выведет на экран переданную в нее в качестве параметра строку (‘Привет, мир!’) после чего курсор будет переведен на следующую строку.

В строке 3 (End.) заканчивается тело программы.

Заметим, что стандартная процедура writeln объявлена в модуле system, который подключается к любой Паскаль - программе автоматически.

 

Пример на Си:

1> #include <stdio.h>

2>

3> int main()

4> {

5> printf (“Привет, мир!\n”);

6> return 0;

7> }

Разберем эту программу на Си.

В строке 1 (#include <stdio.h>) подключается модуль stdio.h (ST an D ard I nput O utput H eader file – заголовочный файл (модуль) стандартного ввода-вывода). В этом модуле объявлена, в частности, функция printf, используемая в программе.

Пустая строка 2 служит в качестве разделителя в тексте программы.

В строке 3 (int main()) находится заголовок главной (main) функции программы. Главная функция в Си – эквивалент тела программы в Паскале. Выполнение Си – программы всегда начинается с функции main.

В строке 4 начинается функция main. Символ { эквивалентен ключевому слову begin в Паскале.

В строке 5 (printf(“Привет, мир!\n”);) вызывается стандартная функция printf, которая выведет на экран переданную в нее в качестве параметра строку (”Привет, мир!\n”). Символ ‘\n’ в конце строки заставит курсор перейти на следующую строку.

В строке 6 (return 0;) производится выход из функции main. 0 – код успешного завершения программы. Если программа по завершению вернула 0, значит все хорошо, ошибок нет.

В строке 7 (}) заканчивается функция main. Символ } эквивалентен ключевому слову end в Паскале.

 

Уже из этого совсем маленького примера видно, что при программировании на Си приходится заботиться о многих вещах, о которых в Паскале даже не вспоминали:

1. Подключение стандартных модулей (в Паскале system подключается автоматически, в Си ни один модуль (!!!) автоматически не подключается).

2. Чтобы перевести курсор на следующую строку экрана, в строку нужно включить символ \n.

3. Выход из программы в Си производится явно, с указанием кода завершения. Если все прошло успешно, то возвращается 0.

 

С другой стороны, есть в Си и определенные удобства – например, операторные скобки обозначаются {}, в то время как в Паскале они обозначаются begin end. Вообще, исходный текст, записанный на Си, как правило, компактнее аналогичного исходного текста на Паскале.

 

 

Циклы В ЯЗЫКЕ СИ

 

«Привет, мир!» 100 раз

 

Напишем программу, 100 раз выводящую на экран фразу «Привет, мир!!!». Ясно, что лучшим решением будет использование цикла. Решим эту задачу с использованием всех трех циклов по очереди – while, do … while (repeat... until), for.

Цикл for в Паскале и Си

 

Пример на Паскале:

var

I: integer;

Begin

for I:= 1 to 100 do

Write(‘Привет, мир! ’);

End. 

 

Пример на Си:

#include <stdio.h>

 

int main()

{

int i;

for (i = 1; i <= 100; i++)

printf(“Привет, мир! ”);

return 0;

}

 

Сравним цикл на Паскале и на Си:

Паскаль Си
for I:= 1 to 100 do Write(‘Привет, мир! ’); for (i = 1; i <= 100; i++) printf(“Привет, мир! ”);

 

Отличие цикла for в Паскале и Си видно из примера и из формального описания синтаксиса:

 

Паскаль:

For СЧЕТЧИК := НАЧАЛЬНОЕ_ЗНАЧЕНИЕ

To КОНЕЧНОЕ_ЗНАЧЕНИЕ

Do ОПЕРАТОР

 

Или

For СЧЕТЧИК := НАЧАЛЬНОЕ_ЗНАЧЕНИЕ

Downto КОНЕЧНОЕ_ЗНАЧЕНИЕ

Do ОПЕРАТОР

 

Си:

for ( ИНИЦИАЛИЗАЦИЯ_ПАРАМЕТРОВ_ЦИКЛА; УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА;

ИЗМЕНЕНИЕ_ПАРАМЕТРОВ_ЦИКЛА )

ОПЕРАТОР;

 

Обратите внимание: в Паскале две формы цикла For. Одна для прямого подсчета – счетчик изменяется от НАЧАЛЬНОГО_ЗНАЧЕНИЯ до КОНЕЧНОГО_ЗНАЧЕНИЯ с шагом +1 (for i:= 1 to 100 do). Вторая форма считает с шагом –1 (for i:= 100 downto 1 do).

В Си цикл FOR значительно более универсален. В разделе ИНИЦИАЛИЗАЦИЯ_ПАРАМЕТРОВ_ЦИКЛА может быть записано через запятую любое количество любых выражений. То же самое относится к разделу ИЗМЕНЕНИЕ_ПАРАМЕТРОВ_ЦИКЛА. В УСЛОВИИ_ПРОДОЛЖЕНИЯ_ЦИКЛА может быть записано любое логическое выражение.

 

Пример использования цикла FOR:

Задача: вывести на экран таблицу степеней 2.

В результате работы программы должна получиться следующая таблица:

 

N 2^N
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024

 

Напишем реализацию на Паскале:

var

n, y: integer;

Begin

Writeln(‘+----+------+’);

Writeln(‘| N | 2^N |’);

Writeln(‘+----+------+’);

y:= 1;

for n:= 0 to 10 do

begin

writeln(‘| ’, n:2, ‘ | ’, y:4, ‘ |’);

y:= y * 2;

end;

Writeln(‘+----+------+’);

End. 

 

Реализация на Си:

#include <stdio.h>

 

int main()

{

int n, y;

printf(“+----+------+\n”);

printf(“| N | 2^N |\n”);

printf(“+----+------+\n”);

for (y = 1, n = 0; n <= 10; y *= 2, n++)

printf(“| %2d | %4d |\n”, n, y);

printf(“+----+------+\n”);

return 0;

}

 

В этом примере в цикле FOR одновременно используются два счетчика – N и Y. В Паскале этого сделать нельзя, поэтому программа на Паскале получается длиннее, чем на Си.

 

задание для Лабораторной работы по теме «ЦИКЛЫ и вывод в Си»

 

Цель работы

 

Изучить использование различных циклов и процедуры вывода PRINTF.

Общее задание

 

Необходимо разработать 3 программы, каждая из которых выполняет одни и те же действия: вывод на экран набора символов, указанных в варианте. В программе №1 требуется использовать цикл с постусловием do.. while. В программе №2 требуется использовать цикл с предусловием while. В программе №3 требуется использовать цикл for. Массивы и файлы в программе использовать нельзя.

 

Пример выполнения лабораторной работы

 

Задание: На экран нужно вывести набор символов:

A B C D E

B C D E F

C D E F G

D E F G H

E F G H I

 

Программа №1 (с циклом do … while):

#include <stdio.h>

#include <conio.h>

 

int main()

{

int i, j, c;

 

clrscr();

 

// Внешний цикл обеспечивает вывод 5 строк

// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’

i = ‘A’;

do

{

// Внутренний цикл обеспечивает вывод ровно 5 символов,

// начиная с символа i

c = i;

j = 0;

do

{

printf(“%c ”, c);

c++;

j++;

} while (j < 5);

 

printf(“\n\n”);

i++

} while (i <= ‘E’);

 

return 0;

}

 

Программа №2 (с циклом while):

#include <stdio.h>

#include <conio.h>

 

int main()

{

int i, j, c;

 

clrscr();

 

// Внешний цикл обеспечивает вывод 5 строк

// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’

i = ‘A’;

while (i <= ‘E’)

{

// Внутренний цикл обеспечивает вывод ровно 5 символов,

// начиная с символа i

c = i;

j = 0;

while (j < 5)

{

printf(“%c ”, c);

c++;

j++;

}

printf(“\n\n”);

i++

}

return 0;

}

 

Программа №3 (с циклом for):

#include <stdio.h>

#include <conio.h>

 

int main()

{

int i, j, c;

 

clrscr();

 

// Внешний цикл обеспечивает вывод 5 строк

// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’

for (i = ‘A’; i <= ‘E’; i++)

{

// Внутренний цикл обеспечивает вывод ровно 5 символов,

// начиная с символа i

for (c = i, j = 0; j < 5; c++, j++)

printf(“%c ”, c);

printf(“\n\n”);

}

return 0;

}


 

Задачи простые

 


Вариант A1.

A B C D E

A B C D

A B C

A B

A

 

Вариант A2:

Z Y X W V

Z Y X W

Z Y X

Z Y

Z

 

Вариант A3:

Z Y X W V

Y X W V

X W V

W V      

V

 

Вариант A4:

A B C D E

B C D E

C D E

D E

E

 

Вариант A5:

Z Y 

Z Y X

Z Y X W 

Z Y X W V


Вариант A6:

V

W V

X W V

Y X W V

Z Y X W V

 

Вариант A7:

A C E G I

C E G I

E G I

G I

I

 

Вариант A8:

A C E G I

B D F H J

C E G I K

D F H J L

E G I K M

 

Вариант A9:

A

A B

A B C

A B C D

A B C D E

 

Вариант A10:

Z X V T R

X V T R P

V T R P N

T R P N L

R P N L J

 


Вариант A11:

1 2 3 4 5

2 3 4 5

3 4 5

4 5

5

 

Вариант A12:

1 3 5 7 9

3 5 7 9

5 7 9

7 9

9

 

Вариант A13:

9

7 9

5 7 9

3 5 7 9

1 3 5 7 9

 

Вариант A14:

R

T R

V T R

X V T R

Z X V T R

 

Вариант A15:

Z X V T R

X V T R

V T R

T R

R


 

Задачи средней сложности

 


Вариант B1:

A B C D E

E A C D E

E D A D E

E D C A E

E D C B A

 

Вариант B2:

A B C D E

E A B C D

D E A B C 

C D E A B  

B C D E A

 

Вариант B3:

A B C D E

B C D E Z

C D E Z Y

D E Z Y X

E Z Y X W

Z Y X W V

 

Вариант B4:

A D G J M

M D G J M

M J G J M

M J G J M

M J G D M

M J G D A

 

Вариант B5:

A B C D E

Z B C D E

Y Z C D E

X Y Z D E

W X Y Z E


Вариант B6:

A B C D E

A A B C D

B A A B C

C B A A B

D E B A A

E D C B A

 

Вариант B7:

A D B E C

C A D B E

E C A D B

B E C A D

D B E C A

 

Вариант B8:

A

B C

D E F

G H I J

K L M N O

 

Вариант B9:

A

B C

C D E

D E F G

E F G H I

 

Вариант B10:

A B C D E

F G H I

J K L

M N

   O


Вариант B11:

A B C D E

F G H I

J K L

M N

   O

 

 

Вариант B12:

A B C D E

B C D E

C D E

D E

   E

 

Вариант B13:

A B C D E F G

B C D E F  

C D E    

D      

 

Вариант B14:

A C E G I

A C E G

A C E

A C E G

A C E G I

 

 

Вариант B15:

   Z

Z Y

Z Y X

Z Y X W

Z Y X

Z Y

   Z

 


 

Задачи сложные

 


Вариант C1:

A       

B A B     

B B A B B

A A A A A A A

B B A B B 

B A B 

A

 

Вариант C2:

... X...

.. X X..

. X  X.

X      X

. X  X.

.. X X..

... X...

 

Вариант C3:

. + #. # +.

+ #... # +

#..... #

.......

#..... #

+ #... # +

. + #. # +.

 

Вариант C4:

A B C D C B A

B C D D C B

C D  D C

D      D

C D  D C

B C D D C B

A B C D C B A

 

Вариант C5:

A

A B C

A B C B C

A B C B C B A

C B C B A

C B A

A


Вариант C6:

+ + + + + + +

+ + + O + + +

+ + 0 O 0 + +

+ 0 0 O 0 0 +

+ + 0 O 0 + +

+ + + O + + +

+ + + + + + +

 

Вариант C7:

A B B C C C D

B B C C C D D

B C C C D D D

C C C D D D D

C C D D D D

C D D D D

D D D D

 

Вариант C8:

A A A

A A A B

A A B B C

B B C B B

C B B A A

B A A A

   A A A

 

Вариант C9:

... A A A B

... A A B C

... A B C C

B B B B C C C

B B C D...

B C D D...

C D D D...

 

Вариант C10:

. A A A A A +

.. A A A + C

... A + C C

B B B + C C C

B B + D. C C

B + D D.. C

+ D D D...


Вариант C11:

A

B A B

C B A B C

D C B A B C D

C B A B C

B A B

A

 

Вариант C12:

+ + + + + X 

+ + + X + 

+ X + + 

X + + +  

X + + + + 

X + + + + +  

 

Вариант C13:

X      

* X *   

* * X * * 

* * * X * * *

X. X    

X... X  

X..... X

 

Вариант C14:

X + + X

X + X +

X X + +

X + + +

X + X + +

X + + + X +

X + + + + + X

 

Вариант C15:

X.. X

X. X +

X X + +

X + + +

X * X + +

X * * * X +

X * * * * * X

 


ФУНКЦИИ В ЯЗЫКЕ СИ

 

Функции без параметров в Си

 

В Си есть только функции, процедур нет. Но в Си есть возможность объявить тип возвращаемого функцией значения как void (пусто). Такая функция Си является эквивалентом процедуры в Паскале.

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

/*

Задание: На экран нужно вывести набор символов:

A B C D E

B C D E F

C D E F G

D E F G H

E F G H I

*/

 

#include <stdio.h>

#include <conio.h>

 

// printLetters - процедура (функция без возвращаемого значения)

// Выводит на экран указанную в задании последовательность символов

void printLetters()

{

int i, j, c;

// Внешний цикл обеспечивает вывод 5 строк

// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’

for (i = ‘A’; i <= ‘E’; i++)

{

// Внутренний цикл обеспечивает вывод ровно 5 символов,

// начиная с символа i

for (c = i, j = 0; j < 5; c++, j++)

printf(“%c ”, c);

printf(“\n\n”);

}

}

 

int main()

{

clrscr();   // Вызов процедуры clrscr

printfLetters(); // Вызов процедуры printLetters

 

return 0;

}

Синтаксис определения процедуры (функции, не возвращающей значений) без параметров в Си:

void ИМЯ_ФУНКЦИИ ()

{

ТЕЛО_ФУНКЦИИ

}

Синтаксис вызова процедуры без параметров в Си:

ИМЯ_ФУНКЦИИ ();

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

ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ ИМЯ_ФУНКЦИИ ()

{

ТЕЛО_ФУНКЦИИ

}

Внутри тела функции ОБЯЗАТЕЛЬНО должен быть предусмотрен возврат значения. Синтаксис выхода из функции с одновременным возвращением значения:

return ВОЗВРАЩАЕМОЕ_ЗНАЧЕНИЕ;

В Паскале аналогичные действия выполняются за 2 шага:

1. Присвоение имени функции возвращаемого значения.

2. Exit.

 

Пример функции без параметров:

int main()

{

int i, j, c;

 

clrscr();       

printfLetters();

 

return 0; // выход из функции с возвращением значения 0

}

 

 

Функции с параметрами

 

Рассмотрим функции с параметрами на примере. Нужно написать функцию, вычисляющую значение , где a и n – целые числа. Решим эту задачу «в лоб», используя многократное умножение в цикле:

 

Реализация на Паскале:

{ Функция, вычисляющая и возвращающая a^n }

{ ^ - возведение в степень}

function power(a, n: integer):longint;

var

res: longint; { Результат (степень) }

i: integer;

begin

res:= 1;

for i:= 1 to n do

res:= res * a;

power:=res; { Возвращаем значение из функции }

end;

 

var

x, n: integer;

begin

x:= power(2, 3); {x = 2 ^ 3 = 8}

n:= 2;

writeln(x, ' ^ ', n, ' = ', power(x, n));

{Будет выведено: 8 ^ 2 = 64}

end.

 

 

 

Реализация на Си:

 

#include <stdio.h>

 

//Функция, вычисляющая и возвращающая a^n

//^ - возведение в степень

long power(int a, int n)

{

long res = 1;

int i;

for (i = 1; i <= n; i++)

res *= a;

return res; // Возвращаем значение res

}

 

int main()

{

int x = power(3, 2); // x = 3 ^ 2 = 9

int n = 5;

printf("\n %d ^ %d = %ld\n", x, n, power(x, n));

// Будет выведено: 9 ^ 2 = 81

return 0; // Возвращаем значение 0

}

 

В Си синтаксис определения функции с параметрами следующий:

ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ ИМЯ_ФУНКЦИИ ( СПИСОК_ПАРАМЕТРОВ )

{

ТЕЛО_ФУНКЦИИ

}

Список параметров представляет собой параметры, разделенные запятыми. Каждый параметр имеет вид:

ТИП_ПАРАМЕТРА ИМЯ

В нашем примере функция power имеет два целых параметр: a и y. Параметры в Си также называют аргументами.

 

ВВОД В ЯЗЫКЕ СИ

 

РАЗВИЛКИ

 

Пример задачи: размер файла в байтах

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

Пример:

1. Файл имеет размер 10240 байт (б). Это то же самое, что 10 килобайт (Кб) или 0.0098 мегабайта (Мб). Ясно, что в данном случае удобнее всего размер выдавать в килобайтах.

2. Файл имеет размер 1500000 байт (б). Это то же самое, что 1464,84 килобайта (Кб) или 1.043 мегабайта (Мб). Ясно, что в данном случае удобнее всего размер выдавать в мегабайтах.

 

Пересчет из байт в другие единицы измерения производится по формулам:

1 Кб = 1024 б

1 Мб = 1024 Кб = 1024*1024 б = 1 048 576 б

1 Гб = 1024 Мб = 1024*1024*1024 б = 1 073 741 824 б

 

Уточним задачу.

Дано число X. 0 <= X <= 2 000 000 000.

Нужно вывести X, если X < 1024.

Если 1024 <= X < 1024*1024, нужно вывести X / 1024.

Если 1024*1024 <= X < 1024*1024*1024, нужно вывести                              X / (1024*1024).

Если X >= 1024*1024*1024, нужно вывести X / (1024*1024*1024).

 

Усеченные развилки

 

Решение задачи на Паскале:

var

x: longint;

Begin

Write(‘Введите размер файла:’);

read(x);

 

if x < 0 then

begin

writeln(‘Вы ввели неправильный размер файла!’);

exit;

end;

 

if x < 1024 then

writeln(‘size = ‘, x, ‘ б’);

 

if (x >= 1024) and (x < 1024*1024) then

writeln(‘size = ‘, (x / (1024)):0:2, ‘ Кб’);

 

if (x >= 1024*1024) and (x < 1024*1024*1024) then

writeln(‘size = ‘, (x / (1024*1024)):0:2, ‘ Мб’);

 

if x >= 1024*1024*1024 then

writeln(‘size = ‘, (x / (1024*1024*1024)):0:2, ‘ Гб’);

End. 

 

В Паскале существует две операции деления. Обычная операция деления обозначается знаком / - в результате выполнения такой операции получается результат - вещественное число. Операция целочисленного деления обозначается DIV. Оба операнда операции DIV должны иметь целый тип.

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

В примере обратите внимание на формат вывода:0:2. Такая запись означает нулевую минимальную ширину поля и две цифры после запятой. Нулевая минимальная ширина поля означает, что число при выводе будет занимать столько позиций, сколько нужно.

 

Реализация на Си:

#include <stdio.h>

 

int  main()

{

long x;

 

printf(“Введите размер файла:”);

scanf(“%ld”, &x);

 

if (x < 0)

{

pritnf(“Вы ввели неправильный размер файла!”);

return 1; //Возвращаем из main не 0 – сигнал об ошибке

         //во время исполнения программы

}

 

if (x < 1024)

printf(“size = %d б“, (int) x); // x имеет тип long,

         // а в форматной строке указан %d – int,

         // поэтому необходимо приведение типа (int) x

 

if (x >= 1024 && x < 1024.0*1024)

printf(“size = %0.2f Кб”, x / 1024.0);

 

if (x >= 1024.0*1024 && x < 1024.0*1024*1024)

printf(“size = %0.2f Мб“, x / (1024.0*1024));

 

if (x >= 1024.0*1024*1024)

printf(“size = %0.2f Гб“, x / (1024.0*1024*1024));

 

return 0;

}

 

В отличие от Паскаля, в Си операция деления одна, и обозначается она /. Но (!) если хотя бы один операнд имеет вещественный тип, то результат вычисляется по правилам деления вещественных чисел (то есть как при использовании операции / в Паскале). Если оба операнда имеют целый тип, то результат получается по правилам деления целых чисел (как при использовании DIV в Паскале). Это означает, что если разделить целое число 2000 на 1024, то получится 2000 / 1024 = 1, а не 1.95. В нашем примере нам нужно, чтобы деление не было целочисленным. Поэтому при делении 2000 / 1024 выполняем 2000 / 1024.0. Поскольку один из операндов вещественный, то и результат будет вещественный 2000 / 1024.0 = 1.95.

 

Сравним усеченную развилку в Паскале и в Си:

Паскаль Си
if x < 1024 then writeln(x); if (x < 1024) printf(“%d “, (int)x);

 

Отличие усеченной развилки в Паскале и Си видно из примера и из формального описания синтаксиса:

 

Паскаль:

If УСЛОВИЕ Then ОПЕРАТОР

 

Си:

if ( УСЛОВИЕ ) ОПЕРАТОР

 

Полные развилки

 

Решение задачи на Паскале:

var

x: longint;

Begin

Write(‘Введите размер файла:’);

read(x);

 

if x < 0 then

writeln(‘Вы ввели неправильный размер файла!’)

else

begin

if x < 1024 then

writeln(‘size = ‘, x, ‘ б’)

 

else if x < 1024*1024 then

writeln(‘size = ‘, (x / (1024)):0:2, ‘ Кб’)

 

else if x < 1024*1024*1024 then

writeln(‘size = ‘, (x / (1024*1024)):0:2, ‘ Мб’)

 

else

writeln(‘size = ‘, (x / (1024*1024*1024)):0:2,

         ‘ Гб’);

end;

End. 

 

Реализация на Си:

#include <stdio.h>

 

int main()

{

long x;

 

printf(“Введите размер файла:”);

scanf(“%ld”, &x);

 

if (x < 0)

pritnf(“Вы ввели неправильный размер файла!”);

else

{

if (x < 1024)

printf(“size = %d б“, (int)x);

 

else if (x < 1024.0*1024)

printf(“size = %0.2f Кб”, x / 1024.0);

 

else if (x < 1024.0*1024*1024)

printf(“size = %0.2f Мб“, x / (1024.0*1024));

 

else

printf(“size = %0.2f Гб“, x / (1024.0*1024*1024));

}

 

return 0;

}

 

Сравним полную развилку в Паскале и в Си:

Паскаль Си
if x < 0 then writeln(‘Ошибка ввода!’) else begin … end;   if (x < 0) pritnf(“Ошибка ввода!”); else { … }  

 

Отличие усеченной развилки в Паскале и Си видно из примера и из формального описания синтаксиса:

 

Паскаль:

If УСЛОВИЕ Then ОПЕРАТОР Else ОПЕРАТОР

 

Си:

if ( УСЛОВИЕ ) ОПЕРАТОР else ОПЕРАТОР

 

задание для Лабораторной работуы по теме «Вычисление математических функций»

 

Цель работы

 

Изучить использование функций в Си.

Общее задание

 

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

В программе обязательно использовать функции. Использование глобальных переменных запрещено.

 

Простые задания

 

В варианте задается «кусочная функция» y = f(x). В программе необходимо обеспечить ввод с клавиатуры границ диапазона [a..b] и шага изменений h для аргумента x. Нужно вывести на экран таблицу значений функции y = f(x) для , шаг изменения x равен h.

 

Пример выполнения лабораторной работы по простым заданиям

 

Функция y=f(x) имеет вид:

Если x < 3, то

Если , то

Если x > 6, то

 

Реализация на Си:

#include <stdio.h>

#include <math.h>

 

/*

Вычисление функции, заданной в варианте

*/

double f(double x)

{

if (x < 3) return sin(3 * x) + 6;

if (x <= 6) return (x * x) / (1 + x * x);

return 1 + sqrt(x + 10);

}

 

int main()

{

double a, b, h;

double x, y;

 

// Ввод значений границ диапазона и шага изменения X

while (1) // бесконечный цикл ввода

{

printf("Введите значения A, B, H:");

scanf("%lf%lf%lf", &a, &b, &h);

if (a > b)

{

printf("Вы ввели неверные значения: a > b!!\n");

continue; // продолжаем выполнение цикла ввода

}

if (h <= 0)

{

printf("Вы ввели неверные значения: h <= 0!!\n");

continue; // продолжаем выполнение цикла ввода

}

// Ввод корректен - выходим из цикла

break;

}

 

// Формируем шапку таблицы

printf("+------------+---------------+\n");

printf("+ X +  Y  +\n");

printf("+------------+---------------+\n");

// формируем таблицу

for (x = a; x <= b; x += h)

{

y = f(x);

printf("| %10lf | %12lf |\n", x, y);

}

// Завершаем формирование таблицы

printf("+------------+---------------+\n");

return 0;

}


 

Варианты для простых заданий и для заданий средней сложности

 


Вариант A1:

Функция y=f(x) имеет вид:

Если x < 2, то

Если , то

Если x > 5, то

 

Вариант A2:

Функция y=f(x) имеет вид:

Если x <= 0, то

Если 0 < x < 3, то

Если x >= 3, то

 

Вариант A3:

Функция y=f(x) имеет вид:

Если x <= -3, то

Если -3 < x <= 0, то

Если x > 0, то

 

Вариант A4:

Функция y=f(x) имеет вид:

Если x < 0, то

Если 0 <= x <= 2, то

Если x > 2, то

 

Вариант A5:

Функция y=f(x) имеет вид:

Если x < 3, то

Если 3 <= x <= 6, то

Если x > 6, то

 

 


Вариант A6:

Функция y=f(x) имеет вид:

Если x < 3, то

Если 3 <= x <= 6, то

Если x > 6, то

 

Вариант A7:

Функция y=f(x) имеет вид:

Если x < 2, то

Если 2 <= x <= 5, то

Если x > 5, то

 

Вариант A8:

Функция y=f(x) имеет вид:

Если x <= 0, то

Если 0 < x < 3, то

Если x >= 3, то

 

Вариант A9:

Функция y=f(x) имеет вид:

Если x <= -3, то

Если -3 < x <= 0, то

Если x > 0, то

 

Вариант A10:

Функция y=f(x) имеет вид:

Если x <= 0, то

Если 0 < x < 6, то

Если x >= 6, то

 


Вариант A11:

Функция y=f(x) имеет вид:

Если x < 0, то

Если 0 <= x <= 2, то

Если x > 2, то

 

Вариант A12:

Функция y=f(x) имеет вид:

Если x < 3, то

Если 3 <= x <= 6, то

Если x > 6, то

 

Вариант A13:

Функция y=f(x) имеет вид:

Если x < 3, то

Если 3 <= x <= 6, то

Если x > 6, то

 


Вариант A14:

Функция y=f(x) имеет вид:

Если x < 2, то

Если 2 <= x <= 5, то

Если x > 5, то

 

Вариант A15:

Функция y=f(x) имеет вид:

Если x <= 0, то

Если 0 < x < 3, то

Если x >= 3, то

 


Задания среднего уровня сложности

 

В варианте задается «кусочная функция» y = f(x). В программе необходимо обеспечить ввод с клавиатуры границ диапазона [a..b] и шага изменений h для аргумента x. Нужно вывести на экран таблицу значений функции y = f(x), вычисленную с использованием функций стандартной библиотеки Си, и значения y1 = f1(x), вычисленные с помощью пользовательской реализации этих же функций. В пользовательской реализации необходимо использовать итерационный алгоритм вычисления.

Варианты заданий средней сложности те же, что и для простых заданий (смотри выше).

 

Варианты для сложных заданий

 


Вариант C1:

Функции:

1.  

2.

3.

 

Вариант C2:

Функции:

1.  

2.

3.

 

Вариант C3:

Функции:

1.  

2.

3.

 

Вариант C4:

Функции:

1.  

2.

3.

 


Вариант C5:

Функции:

1.  

2.

3.

 

Вариант C6:

Функции:

1.  

2.

3.

 

Вариант C7:

Функции:

1.  

2.

3.

 

Вариант C8:

Функции:

1.  

2.

3.

 


Вариант C9:

Функции:

1.  

<

Поделиться с друзьями:

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

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.77 с.