Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания по программированию БИО.docx
Скачиваний:
5
Добавлен:
11.02.2016
Размер:
125.93 Кб
Скачать

Вопросы

  1. Дайте описание базовых структур алгоритмов.

    1. Описать 5 стандартных блоков для построения алгоритмов

    1. Описать 3 стандартных структуры алгоритмов

    1. Построить примеры каждой из структур

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

    1. Описать 6 стандартных типов данных.

bool

1

0   /   255

целочисленный (символьный) тип данных

char

1

0   /   255

 целочисленные типы данных

short int

2

-32 768    /    32 767

unsigned short int

2

0  /  65 535

int

4

-2 147 483 648   /   2 147 483 647

unsigned int

4

0     /     4 294 967 295

long int

4

-4 294 967 295/    4 294 967 295

unsigned long int

4

0     /     4 294 967 295

типы данных с плавающей точкой

float

4

-2 147 483 648.0  / 2 147 483 647.0

long float

8

-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0

double

8

-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0

    1. Описать 4 спецификатора типа

void

char

short

Int (Целочисленное значение)

long

float

double

signed

unsigned

    1. Охарактеризовать множество значений, которые могут принимать величины этого типа;

  1. Опишите управляющие структуры, используемые в языке программирования С++.

    1. Дать описание структуры выбора

if (логическое выражение)  оператор;  if( позвонят в дверь= =true)    Пойдем открывать;

    1. Дать описание структуры повторения

Самый часто используемый цикл — это цикл for, его структура показана ниже:

1

2

3

for ( /*инициализация переменной; условие; изменение значения переменной*/ ) {

  // тело цикла (тут находится код который будет повторяться)

Цикл while — очень простой цикл, вот его структура:

1

2

3

4

while ( /*условие*/ )

{

   // тело цикл - тут находится код, который необходимо повторять

}

Есть еще один тип циклов — do while. Этот цикл полезен, когда необходимо выполнить код по крайней мере — 1 раз. Рассмотрим его структуру:

1

2

3

do {

   // тело цикла

} while ( /*условие*/ );

    1. Дать описание структуры множественного выбора

switch (ZNAC) { case -: x=y-z;  break; case +: x=y+z;  break; case *: x=y*z;  break; case /: x=y/z;  break; default: cout<<А калькулятор у меня только арифметический! Чего это вы тут такое левое нажимаете?;         break; }

  1. Опишите способы создания и обработки одномерных массивов на языке программирования С++

    1. Дать определение массива

Массив это структура данных, представленная в виде группы ячеек одного типа, объединенных под одним единым именем. Массивы используются для обработки большого количества однотипных данных. Имя массива является указателем,   что такое указатели расскажу немного позже. Отдельная ячейка данных массива называется элементом массива.  Элементами массива могут быть  данные любого типа. Массивы могут иметь как одно, так и более одного измерений. В зависимости от количества измерений массивы делятся на одномерные массивы, двумерные массивы, трёхмерные массивы и так далее до n-мерного массива. Чаще всего в программировании используются одномерные и двумерные массивы, поэтому мы рассмотрим только эти  массивы.

    1. Описать структуру одномерного массива в языке С++

Одномерный массив — массив, с одним параметром, характеризующим количество элементов одномерного массива. Фактически одномерный массив — это массив, у которого может быть только одна строка, и n-е количество столбцов. Столбцы в одномерном массиве — это элементы массива. На рисунке 1 показана структура целочисленного одномерного массива a. Размер этого массива — 16 ячеек.

Рисунок 1 — Массивы в С++

Заметьте, что максимальный индекс одномерного массива a равен 15, но размер массива 16 ячеек, потому что нумерация ячеек массива всегда начинается с 0. Индекс ячейки – это целое неотрицательное число, по которому можно обращаться к каждой ячейке массива и выполнять какие-либо действия над ней (ячейкой).

1

2

3

4

//синтаксис  объявления одномерного массива в С++:

/*тип данных*/  /*имя одномерного массива*/[/*размерность одномерного массива*/];

//пример объявления одномерного массива, изображенного на рисунке 1:

int a[16];

где, int - целочисленный тип данных;

        а -  имя одномерного массива; 16 — размер одномерного массива, 16 ячеек.

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

1

2

//ещё один способ объявления одномерных массивов

int mas[10], a[16];

Объявлены два одномерных массива  mas и а размерами 10 и 16 соответственно. Причём в таком способе объявления все массивы будут иметь одинаковый тип данных, в нашем случае - int.

1

2

// массивы могут быть инициализированы при объявлении:

int a[16] = { 5, -12, -12, 9, 10, 0, -9, -12, -1, 23, 65, 64, 11, 43, 39, -15 }; // инициализация одномерного массива

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

1

int a[]={5,-12,-12,9,10,0,-9,-12,-1,23,65,64,11,43,39,-15}; // инициализации массива без определения его размера.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// array.cpp: определяет точку входа для консольного приложения.

 

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int main(int argc, char* argv[])

{

    cout << "obrabotka massiva" << endl;

    int array1[16] = { 5, -12, -12, 9, 10, 0, -9,

                    -12, -1, 23, 65, 64, 11, 43, 39, -15 }; // объявление и инициализация одномерного массива

    cout << "indeks" << "\t\t" << "element massiva" << endl; // печать заголовков

    for (int counter = 0; counter < 16; counter++)  //начало цикла

    {

    //вывод на экран индекса ячейки массива, а затем содержимого этой ячейки, в нашем случае - это целое число

     cout << "array1[" << counter << "]" << "\t\t" << array1[counter] << endl;

    }

    system("pause");

    return 0;

}

    1. Привести примеры объявления массивов

  1. Опишите способы создания и обработки двумерных массивов на языке программирования С++

    1. Дать определение массива

    2. Описать структуру двумерного массива в языке С++

С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив - это массив одномерных массивов. Двумерный массив объявляется следующим образом: тип имя_массива[размер второго измерения][размер первого измерения]; Следовательно, для объявления двумерного массива целых с размером 10 на 20 следует написать: int d[10] [20] ; Посмотрим внимательно на это объявление. В противоположность другим компьютерным языкам, где размерности массива отделяются запятой, С помещает каждую размерность в отдельные скобки.

Для доступа к элементу с индексами 3, 5 массива d следует использовать d[3] [5]

В следующем примере в двумерный массив заносятся числа от 1 до 12, после чего массив выводится на экран. #include <stdio.h> int main(void) { int t,i, num[3][4]; /* загрузка чисел */ for(t=0; t<3; ++t) for (i=0; i<4; ++i) num[t][i] = (t*4)+i+1; /* вывод чисел */ for (t=0; t<3; ++t) { for (i=0; i<4; ++i) printf("%d  ",num[t][i]); printf ("\n"); } return 0; } В данном примере num[0][0] имеет значение 1, num[0][1] имеет значение 2, num[0][2] - 3 и так далее. num[2][3] имеет значение 12.

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

Число байт в памяти, требуемых для размещения двумерного массива, вычисляется следующим  образом: число байт = размер второго измерения * размер первого измерения * sizeof (базовый тип) Предполагая наличие в системе 2-байтных целых, целочисленный массив с размерностями 10 на 5 будет занимать 10 * 5 * 2, то есть 100 байт.

Когда двумерный массив используется как аргумент функции, передается указатель на первый элемент. Функция, получающая двумерный массив, должна, как минимум, определять размер первого измерения, поскольку компилятору необходимо знать длину каждой строки для корректной  индексации массива. Например, функция, получающая двумерный целочисленный массив с размерностями 5, 10, будет объявляться следующим образом: void func1 (int х[] [10]) { ... }

Можно определить размер второго измерения, но это не обязательно. Компилятору нужно знать размер первого измерения для правильного выполнения операторов типа х [2] [4] в функции. Если длина строки не известна, невозможно узнать, где начинается следующая строка.

Краткая программа, приведенная ниже, использует двумерный массив для хранения оценок каждого студента в классах учителя. Программа предполагает, что учитель имеет три класса и в каждом классе может быть максимум 30 студентов. Обратим внимание, как осуществляется доступ к grade из каждой функции: #include <conio.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #define CLASSES 3 #define GRADES 30 int grade[CLASSES][GRADES]; void disp_grades(int g[] [GRADES]), enter_grades(void); int get_grade(int num); int main(void) /* программа для хранения оценок */ { char ch; for (;;) { do { printf("(E)nter grades\n"); printf("(R)eport grades\n"); printf("(Q) uit\n"); ch = toupper(getche()); } while(ch!='E' && ch!='R' && ch!='Q'); switch(ch) { case 'E': enter_grades(); break; case 'R': disp_grades(grade); break; case 'Q': return 0; } } } /* ввод каждой оценки студентов */ void enter_grades(void) { int t, i; for(t=0; t<CLASSES; t++) { printf("Class # %d:\n", t+1); for(i=0; i<GRADES; ++i) grade[t][i] = get_grade (i); } } /* реальный ввод оценки */ int get_grade(int num) { char s [80]; printf("enter grade for student # %d:\n", num+1); gets (s); return(atoi(s)); } /* вывод оценок класса */ void disp_grades(int g[] [GRADES]) { int t, i; for(t=0; t<CLASSES; ++t) { printf("Class # %d:\n", t+1); for(i=0; i<GRADES; ++i) printf("grade for student #%d is %d\n", i+1, g[t][i]); } }

    1. Привести примеры программ по обработке массивов

  1. Опишите принципы работы с файлами последовательного доступа

А. Как произвести открытие файла

Файлом называют способ хранения информации на физическом устройстве. Файл — это понятие, которое применимо ко всему — от файла на диске до терминала.

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

Текстовый поток — это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).

Двоичный поток — это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.

Организация работы с файлами средствами C

Объявление файла

FILE *идентификатор;

Пример

FILE *f;

Открытие файла:

fopen(имя физического файла, режим доступа)

Режим доступа — строка, указывающая режим открытия файла файла и тип файла

Типы файла: бинарный (b); текстовый (t)

Значение

Описание

r

Файл открывается только для чтения

w

Файл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан

a

Файл открывается для записи в конец (для дозаписи) или создается, если не существует

r+

Файл открывается для чтения и записи.

w+

Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан

a+

Файл открывается для записи в конец (для дозаписи) или создается, если не существует

Например

f = fopen(s, "wb");

k = fopen("h:\ex.dat", "rb");

Неформатированные файловый ввод-вывод

Запись в файл

fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);

Например,

fwrite(&dat, sizeof(int), 1, f);

Чтение из файла

fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);

Например,

fread(&dat, sizeof(int), 1, f);

Закрытие файла

fclose(имя логического файла);

Пример 1. Заполнить файл некоторым количеством целых случайных чисел.

/* Заполнить файл некоторым количеством целых случайных чисел. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

using namespace std;

int main()

{

FILE *f; int dat;

srand(time(0));

int n=rand()%30 + 1;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "wb");

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

{ dat = rand()%101 - 50;

cout << dat << " ";

fwrite(&dat, sizeof(int), 1, f);

}

cout << endl;

fclose(f);

system("PAUSE");

return EXIT_SUCCESS;

}

Пример 2. Найти сумму и количество целых чисел, записанных в бинарный файл.

/* Найти сумму и количество целых чисел, записанных в бинарный файл. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

using namespace std;

int main()

{

FILE *f;

int dat, n=0, sum=0;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "rb");

while (fread(&dat, sizeof(int), 1, f))

{n++;

cout << dat << " ";

sum+=dat;

}

cout << endl;

cout << "sum: " << sum << "; number: " << n << endl;

fclose(f);

system("PAUSE");

return EXIT_SUCCESS;

}

Пример 3. Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса.

/* Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве:

пол (m/f), возраст (в мес.), масса. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

using namespace std;

struct krolik {char pol; int vozrast; double massa;};

int main()

{

FILE *f; krolik dat; int n;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "wb");

cout << "How many rabbits? "; cin >> n;

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

{ cout << "What sex " << i << "th rabbit? "; cin >> dat.pol;

cout << "How old " << i << "th rabbit? "; cin >> dat.vozrast;

cout << "What is the mass of the " << i << "th rabbit? "; cin >> dat.massa;

fwrite(&dat, sizeof(krolik), 1, f);

}

fclose(f);

system("PAUSE");

return EXIT_SUCCESS;

}

Пример 3 (продолжение). В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше.

/* В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса.

Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

using namespace std;

struct krolik {char pol; int vozrast; double massa;};

int main()

{

FILE *f; krolik dat, max; int n;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "rb");

fread(&dat, sizeof(krolik), 1, f);

max=dat;

while (fread(&dat, sizeof(krolik), 1, f))

{if (dat.vozrast>max.vozrast) max=dat;

else if (dat.vozrast==max.vozrast&&dat.massa>max.massa) max=dat;}

cout << "The oldest rabbit has a sex " << max.pol << ", age " << max.vozrast << " and mass " << max.massa << endl;

system("PAUSE");

return EXIT_SUCCESS;

}

Форматированный файловый ввод-вывод

1) Функции fgetc() и fputc() позволяют соттветственно осуществить ввод-вывод символа.

2) Функции fgets() и fputs() позволяют соттветственно осуществить ввод-вывод строки.

3) Функции fscanf() и fprintf() позволяют соттветственно осуществить форматированный ввод-вывод и аналогичный соответствующим функиям форматированного ввода-вывода, только делают это применительно к файлу.

Организация работы с файлами средствами C++

Файловый ввод-вывод с использованием потоков

Библиотека потокового ввода-вывода

fstream

Связь файла с потоком вывода

ofstream имя логического файла;

Связь файла с потоком ввода

ifstream имя логического файла;

Открытие файла

имя логического файла.open(имя физического файла);

Закрытие файла

имя логического файла.close();

Пример 4. Заполнить файл значениями функции y = x * cos x.

/* Заполнить файл значениями функции y = x * cos x. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

#include <fstream>

#include <cmath>

using namespace std;

double fun(double x);

int main()

{double a, b, h, x; char s[20];

cout << "Enter the beginning and end of the segment, step-tabulation: ";

cin >> a >> b >> h;

cout << "File name? "; cin >> s;

ofstream f;

f.open(s);

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

{f.width(10); f << x;

f.width(15); f << fun(x) << endl; }

f.close();

system("PAUSE");

return EXIT_SUCCESS;

}

double fun(double x)

{ return x*cos(x); }

Пример 5. Файл содержит несколько строк, в каждой из которых записано единственное выражение вида a#b (без ошибок), где a, b - целочисленные величины, # - операция +, -, /, *. Вывести каждое из выражений и их значения.

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

long a, b; char s[256], c; int i;

cout << "File name? "; cin >> s;

ifstream f; f.open(s);

while (!f.eof())

{ f.getline(s, 256);

i=0; a=0;

while (s[i]>='0'&&s[i]<='9')

{

a=a*10+s[i]-'0';

i++;

}

c=s[i++]; b=0;

while (s[i]>='0'&&s[i]<='9')

{

b=b*10+s[i]-'0';

i++;

}

switch (c){

case '+': a+=b; break;

case '-': a-=b; break;

case '/': a/=b; break;

case '*': a*=b; break;}

cout << s << " = " << a << endl; }

f.close();

system("PAUSE");

return EXIT_SUCCESS;

}

Пример 6. В заданном файле целых чисел посчитать количество компонент, кратных 3.

/* В заданном файле целых чисел посчитать количество компонент, кратных 3. */

/* Dev-C++ */

#include <cstdlib>

#include <iostream>

#include <fstream>

using namespace std;

int main()

{int r,ch;

ifstream f;

f.open("CH_Z.TXT");

ch=0;

for (;f.peek()!=EOF;)

{f>>r;

cout << r << " ";

if (r%3==0) ch++ ;

}

f.close();

cout << endl << "Answer: " << ch;

system("PAUSE");

return EXIT_SUCCESS;

}

    1. Как осуществить чтение из файла символа или строки символов

    2. Как осуществить запись символа или строки символов в файл

    3. Как осуществить смещение внутри файла

    4. Как произвести закрытие файла

  1. Охарактеризуйте функции и подпрограммы, их назначение.