Реферат по предмету "Информатика, программирование"


Модульное программирование

Кафедра: Автоматика и Вычислительная Техника
Модульное программирование

Содержание
1. Классы памяти идентификатора
1.1 Область действия
1.2 Область видимости
1.3 Продолжительность жизни
2. Модели памяти ОЗУ
2.1 Виды моделей памяти
2.2 Размещение исполняемого файла в ОЗУ в модели large
3. Передача данных в функцию
3.1 Передача параметров по значению
3.2 Передача параметров по адресу
3.3 Передача одномерных массивов
3.4 Передача двумерных массивов
4. Тестирование функций
5. Практические задания
5.1 Указать классы памяти переменной
5.2 Работаем с адресами
5.3 Прототипы функций
5.3.1 Свопинг
5.3.2 Индексы максимальных элементов одномерного массива
5.3.3 Индексы максимальных элементов двумерного массива
5.3.4 Угол между двумя векторами
5.3.5 Определитель матрицы
5.4 Выделение фрагмента программы в отдельную функцию
5.5 Тестирование функции
5.5.1 Сортировка массива
5.5.2 МиниМакс
6. Лабораторные задания
6.1 Линейное уравнение
6.2 Четные элементы массива
6.3 Нахождение простых чисел
6.4 Количество вхождений подстроки в строку
6.5 Произведение матриц
7. Дополнительные задания
Библиографический список
1. Классы памяти идентификатора
С каждым объектом памяти переменной связаны следующиепонятия: область действия, область видимости и продолжительность жизни. Эти трипонятия объединяются в понятие класс памяти переменной. Класс памяти устанавливаетсясинтаксисом и местом размещения определения этой переменной.
Спецификатор класса памяти в объявлении переменной можетбыть auto, register, static или extern. Если класс памяти не указан, то онопределяется по умолчанию из контекста объявления.
Объекты классов auto и register имеют локальное время жизни.Спецификаторы static и extern определяют объекты с глобальным временем жизни.
При объявлении переменной на внутреннем уровне может бытьиспользован любой из четырех спецификаторов класса памяти, а если он не указан,то подразумевается класс памяти auto.
Переменная с классом памяти auto имеет локальное время жизнии видна только в блоке, в котором объявлена. Память для такой переменнойвыделяется при входе в блок и освобождается при выходе из блока. При повторномвходе в блок этой переменной может быть выделен другой участок памяти.
Переменная с классом памяти auto автоматически неинициализируется. Она должна быть проинициализирована явно при объявлении путемприсвоения ей начального значения. Значение неинициализированной переменной склассом памяти auto считается неопределенным.
Спецификатор класса памяти register предписывает компиляторураспределить память для переменной в регистре, если это представляетсявозможным. Использование регистровой памяти обычно приводит к сокращениювремени доступа к переменной. Переменная, объявленная с классом памятиregister, имеет ту же область видимости, что и переменная auto. Числорегистров, которые можно использовать для значений переменных, ограниченовозможностями компьютера, и в том случае, если компилятор не имеет враспоряжении свободных регистров, то переменной выделяется память как длякласса auto. Класс памяти register может быть указан только для переменных стипом int или указателей с размером, равным размеру int.
Переменные, объявленные на внутреннем уровне соспецификатором класса памяти static, обеспечиваю возможность сохранить значениепеременной при выходе из блока и использовать его при повторном входе в блок. Такаяпеременная имеет глобальное время жизни и область видимости внутри блока, вкотором она объявлена. В отличие от переменных с классом auto, память длякоторых выделяется в стеке, для переменных с классом static память выделяется всегменте данных, и поэтому их значение сохраняется при выходе из блока.
Пример:
/* объявления переменной i на внутреннем уровне с классомпамяти static. */
/* исходный файл file1. c */
main ()
{...
}
fun1 ()
{ static int i=0;...
}
/* исходный файл file2. c */
fun2 ()
{ static int i=0;...
}
fun3 ()
{ static int i=0;...
}
В приведенном примере объявлены три разные переменные склассом памяти static, имеющие одинаковые имена i. Каждая из этих переменныхимеет глобальное время жизни, но видима только в том блоке (функции), в которойона объявлена. Эти переменные можно использовать для подсчета числа обращений ккаждой из трех функций.
Переменные класса памяти static могут быть инициализированыконстантным выражением. Если явной инициализации нет, то такой переменнойприсваивается нулевое значение. При инициализации константным адреснымвыражением можно использовать адреса любых внешних объектов, кроме адресовобъектов с классом памяти auto, так как адрес последних не является константойи изменяется при каждом входе в блок. Инициализация выполняется один раз припервом входе в блок.
Переменная, объявленная локально с классом памяти extern,является ссылкой на переменную с тем же самым именем, определенную глобально водном из исходных файлов программы. Цель такого объявления состоит в том, чтобысделать определение переменной глобального уровня видимым внутри блока.
Пример:
/* объявления переменной i, являющейся именем внешнегомассива длинных целых чисел, на локальном уровне*/
/* исходный файл file1. c */
main ()
{...
}
fun1 ()
{ extern long i [] ;...
}
/* исходный файл file2.c */
long i [MAX] ={0};
fun2 ()
{...
}
fun3 ()
{...
}
Объявление переменной i [] как extern в приведенном примеределает ее видимой внутри функции fun1. Определение этой переменной находится вфайле file2. c на глобальном уровне и должно быть только одно, в то время какобъявлений с классом памяти extern может быть несколько.
Объявление с классом памяти extern требуется принеобходимости использовать переменную, описанную в текущем исходном файле, нониже по тексту программы, т.е. до выполнения ее глобального определения. Следующийпример иллюстрирует такое использование переменной с именем st.
Пример:
main ()
{ extern int st [] ;...
}
static int st [MAX] ={0};
fun1 ()
{...
}
Объявление переменной со спецификатором extern информируеткомпилятор о том, что память для переменной выделять не требуется, так как этовыполнено где-то в другом месте программы.
При объявлении переменных на глобальном уровне может бытьиспользован спецификатор класса памяти static или extern, а так же можнообъявлять переменные без указания класса памяти. Классы памяти auto и registerдля глобального объявления недопустимы.
Объявление переменных на глобальном уровне — это илиопределение переменных, или ссылки на определения, сделанные в другом местепрограммы. Объявление глобальной переменной, которое инициализирует этупеременную (явно или неявно), является определением переменной. Определение наглобальном уровне может задаваться в следующих формах:
1. Переменная объявлена с классом памяти static. Такаяпеременная может быть инициализирована явно константным выражением, или поумолчанию нулевым значением. То есть обьявления staticint i=0 и static int iэквивалентны, и в обоих случаях переменной i будет присвоено значение 0.
2. Переменная объявлена без указания класса памяти, но сявной инициализацией. Такой переменной по умолчанию присваивается класс памятиstatic. То есть объявления int i=1 и static int i=1 будут эквивалентны.
Переменная объявленная глобально видима в пределах остаткаисходного файла, в котором она определена. Выше своего описания и в другихисходных файлах эта переменная невидима (если только она не объявлена с классомextern).
Глобальная переменная может быть определена только один разв пределах своей области видимости. В другом исходном файле может бытьобъявлена другая глобальная переменная с таким же именем и с классом памятиstatic, конфликта при этом не возникает, так как каждая из этих переменныхбудет видимой только в своем исходном файле.
Спецификатор класса памяти extern для глобальных переменныхиспользуется, как и для локального объявления, в качестве ссылки на переменную,объявленную в другом месте программы, т.е. для расширения области видимостипеременной. При таком объявлении область видимости переменной расширяется доконца исходного файла, в котором сделано объявление.
В объявлениях с классом памяти extern не допускаетсяинициализация, так как эти объявления ссылаются на уже существующие иопределенные ранее переменные.
Переменная, на которую делается ссылка с помощьюспецификатора extern, может быть определена только один раз в одном из исходныхфайлов программы.
 1.1 Область действия
Область действия переменной — это часть программы илиисходного модуля, в которой определен объект соответствующий этой переменной. Перечислимвиды областей действия.
Блок. Эта область действия начинается в точке определенияпеременной и заканчивается в конце блока, содержащего это определение. Такойблок называется окружающим. Тело функции рассматривается как блок.
Функция. Фактически совпадает с телом функции. Такойобластью действия обладают формальные аргументы, перечисленные в заголовкефункции, а также метки, используемые операторами goto.
Файл. Распространятся от точки определения переменной доконца файла. Переменные с такой областью действия называются глобальными идолжны определяться вне всякой функции. Если глобальная переменная определена вконце файла, то ее область действия фактически пустая и вверх на весь файл нераспространяется. Прототип. Такой областью действия обладают переменные изсписка формальных параметров прототипа функции./>
1.2 Область видимости
Видимость переменных и функций в программе определяетсяследующими правилами.
1. Переменная, объявленная или определенная глобально,видима от точки объявления или определения до конца исходного файла. Можносделать переменную видимой и в других исходных файлах, для чего в этих файлахследует ее объявить с классом памяти extern.
2. Переменная, объявленная или определенная локально, видимаот точки объявления или определения до конца текущего блока. Такая переменнаяназывается локальной.
3. Переменные из объемлющих блоков, включая переменныеобъявленные на глобальном уровне, видимы во внутренних блоках. Эту видимостьназывают вложенной. Если переменная, объявленная внутри блока, имеет то же имя,что и переменная, объявленная в объемлющем блоке, то это разные переменные, ипеременная из объемлющего блока во внутреннем блоке будет невидимой.
4. Функции с классом памяти static видимы только в исходномфайле, в котором они определены.
Метки в функциях видимы на протяжении всей функции.
Имена формальных параметров, объявленные в списке параметровпрототипа функции, видимы только от точки объявления параметра до концаобъявления функции.
 1.3 Продолжительность жизни
Время жизни переменной (глобальной или локальной) определяетсяпо следующим правилам.
1. Переменная, объявленная глобально (т.е. вне всех блоков),существует на протяжении всего времени выполнения программы.
2. Локальные переменные (т.е. объявленные внутри блока) склассом памяти register или auto, имеют время жизни только на период выполнениятого блока, в котором они объявлены. Если локальная переменная объявлена склассом памяти static или extern, то она имеет время жизни на период выполнениявсей программы.
/>2. Модели памяти ОЗУ
Память микропроцессора Intel 80x86 имеет сегментированнуюархитектуру. Непосредственно можно адресоваться к 64К памяти сегменту. Процессор80x86 отслеживает 4 различных сегмента: сегмент кода, сегмент данных, сегментстека и дополнительный сегмент. Кодовый сегмент содержит машинные командыпрограммы; в сегменте данных хранится информация; сегмент стека имееторганизацию и назначение стека; вспомогательный сегмент используется дляхранения некоторых вспомогательных данных. Процессор 80x86 имеет четыре16-разрядных сегментных регистра (по одному на сегмент) — CS, DS, SS и ES,которые указывают на сегмент кода, данных, стека и дополнительный сегментсоответственно. Сегмент может находиться в любом месте памяти, но начинатьсядолжен по адресу, кратному 10. Сегменты могут перекрываться. Например, всечетыре сегмента могут начинаться с одного адреса.
Полный адрес в 8086 состоит из двух 16-битовых значений: адресасегмента и смещения. Предположим, что адрес сегмента данных — т.е. значение врегистре DS — равен 2F84 (шестнадцатеричное) и вы желаете вычислить фактическийадрес некоторого элемента данных, который имеет значение 0532 (основание 16) отначала сегмента данных; как это сделать?
Вычисление адреса будет выполнено следующим образом: нужносдвинуть влево значение сегментного регистра на 4 бита (это эквивалентно однойшестнадцатеричной цифре), а затем сложить с величиной смещения.
Полученное 20-битовое значение и есть фактический адресданных, как показано ниже:
регистр DS (после сдвига): 0010 1111 1000 0100 0000 = 2F840
смещение: 0000 0101 0011 0010 = 00532
— — -------------------------------
Адрес: 0010 1111 1101 0111 0010 = 2FD72
Участок памяти величиной 16 байт называется параграфом,поэтому говорят, что сегмент всегда начинается на границе параграфа.
Начальный адрес сегмента всегда является 20-битовым числом,но сегментный регистр имеет всего 16 битов — поэтому младшие 4 бита всегдапредполагаются равными нулю. Это означает — как было уже сказано — что началосегмента может находиться только в адресах памяти, кратных 16, т.е. адресах, вкоторых последние 4 бита (или один шестнадцатиричный разряд) равен нулю. Поэтомуесли регистр DS содержит значение 2F84, то фактически сегмент данных начинаетсяв адресе 2F840.
Стандартная запись адреса имеет форму сегмент: смещение;например, предыдущий адрес можно записать как 2F84: 0532. Отметим, чтопоскольку смещения могут перекрываться, данная пара сегмент: смещение неявляется уникальной; следующие адреса относятся к одной и той же точке памяти:
0000: 0123
0002: 0103
0008: 00A3
0010: 0023
0012: 0003
Сегменты могут (но не должны) перекрываться. Например, всечетыре сегмента могут начинаться с одного и того же адреса, что означает, чтовся ваша программа в целом займет не более 64 Кб — но тогда в пределах этойпамяти должны поместиться и коды программы, и данные, и стек.
 2.1 Виды моделей памяти
В 16-разрядных программах вы можете использовать 6 моделейпамяти: крохотную, малую, среднюю, компактную, большую и огромную.
Tiny(крохотная). Эта модель памяти используется в тех случаях, когда абсолютнымкритерием достоинства программы является размер ее загрузочного кода. Этоминимальная из моделей памяти. Все четыре сегментных регистра (CS, DS, SS и ES)устанавливаются на один и тот же адрес, что дает общий размер кода, данных истека, равный 64К. Используются исключительно ближние указатели.
Small(малая). Эта модель хорошо подходит для небольших прикладных программ. Сегментыкода и данных расположены отдельно друг от друга и не перекрываются, чтопозволяет иметь 64К кода программы и 64К данных и стека. Используются толькоуказатели near.
Medium(средняя). Эта модель годится для больших программ, для которых не требуетсядержать в памяти большой объем данных. Для кода, но не для данных используютсяуказатели far. В результате данные плюс стек ограничены размером 64К, а кодможет занимать до 1М.
Compact(компактная). Лучше всего использовать эту модель в тех случаях, когда размеркода невелик, но требуется адресация большого объема данных. Указатели farиспользуются для данных, но не для кода. Следовательно, код здесь ограничен64К, а предельный размер данных — 1 Мб.
Large(большая). Модели large и huge применяются только в очень больших программах. Дальниеуказатели используются как для кода, так и для данных, что дает предельныйразмер 1 Мб для обоих.
Huge(огромная). Дальние указатели используются как для кода, так и для данных. BorlandC обычно ограничивает размер статических данных 64К; модель памяти hugeотменяет это ограничение, позволяя статическим данным занимать более 64К.
Для выбора любой из этих моделей памяти вы должны либовоспользоваться соответствующим параметром меню интегрированной среды, либоввести параметр при запуске компилятора, работающего в режиме командной строки./>
2.2 Размещение исполняемого файла в ОЗУ в моделиlarge
Модели памяти устроены по-разному. Рассмотрим расположениеобластей памяти в модели large.
Область кода содержит машинные коды функций программы. Функции,присоединенные к exe-файлу на стадии линковки, размещаются вне области кода.
Область данных содержит глобальные и статические переменные,строковые константы.
В стеке размещаются локальные переменные, параметры,передаваемые функциям, и ряд других данных. Как правило, стек растет сверхувниз, занимая пульсирующую непрерывную область. В случае переполнения стекапроисходит его «налезание» стека на область данных и выдаетсясоответствующее сообщение. Проверка стека увеличивает время работы программы иее можно отключить в Options-Entry/Exit Code Generation-Stack options-Teststack overflow.
В кучу данные помещаются только по указанию программиста ине имеют имени. К ним можно обратиться только по адресу, расположенному влокальной или глобальной переменной.

/>
Рис.1. Сегментация для модели памяти Large
 
3. Передача данных в функцию
Си — язык сугубо процедурный и основной логической единицей программыявляется функция. Формат описания функции следующий:
[тип возвращаемого значения] имя_функции (список параметров)
{тело функции
[return возвращаемое_значение] }
В скобках помещена необязательная часть конструкции.
В списке параметров указывают данные, которые необходимопередать в функцию. Ниже рассмотрены различные способы передачи данных вфункцию. 3.1 Передача параметров по значению
Параметры функции передаются по значению и могутрассматриваться как локальные переменные, для которых выделяется память привызове функции и производится инициализация значениями фактических параметров. Привыходе из функции значения этих переменных теряются. Поскольку передачапараметров происходит по значению, в теле функции нельзя изменить значенияпеременных в вызывающей функции, являющихся фактическими параметрами.
Например:
void print_num (int i, int j)
{ printf («значение i=%d. Значение j=%d. », i,j);}
Обращение в программе к данной функции будет таковым:
print_num (6, 19);
/>3.2 Передача параметровпо адресу
Рассмотрим пример функции, которая меняет значениепеременных местами:
void change (int x, int y)
{ int k=x;
x=y;
y=k;
}
В данной функции значения переменных x и y, являющихсяформальными параметрами, меняются местами, но поскольку эти переменныесуществуют только внутри функции change, значения фактических параметров,используемых при вызове функции, останутся неизменными. Для того чтобы менялисьместами значения фактических аргументов можно использовать функцию приведеннуюв следующем примере.
Пример:
void change (int *x, int *y)
{ int k=*x;
*x=*y;
*y=k;
}
При вызове такой функции в качестве фактических параметровдолжны быть использованы не значения переменных, а их адреса change (&a,&b);
/>3.3 Передача одномерныхмассивов
При передаче одномерного массива в функцию следуетучитывать, что имя массива не содержит информации о размере этого массива. Поэтомунеобходимо передавать два параметра: имя массива и размер.
Пример.
int sum (int A [], int Dim); // прототип
int sum (int A [], int Dim); // заголовок
{
….
} // телофункции
void main ()
{
int res, A [] = {2,1,3,2};
res = sum (A,
4);
} // вызов функции sum
Формальный аргумент имени массива может иметь вид int *A.
int sum (int *A, int Dim); // прототип
Для определения размера массива при вызове функции можноиспользовать выражение sizeof (A) /sizeof (int) илиsizeof (A) /sizeof (A []). Например,
res = sum (A, sizeof (A) /sizeof(A []));
 
3.4 Передача двумерных массивов
Способ 1. При передаче двумерного массива в функцию следует учитывать,что количество элементов в строке массива является частью типа имени этогомассива. Так например, для массива int A [3] [4] имя массива А имеет типint (*) [4], т.е. А — это указатель на одномерный массив из 4элементов типа int.
Поэтому необходимо передавать два параметра: имя массива иколичество строк в массиве.
Пример.
int sum2 (int A [] [4], intM); // прототип
int sum2 (int A [] [4], intM); // заголовок
{
….
} // телофункции
void main ()
{
int res, A [] [4] = {{2,1,3,2}, {2,3,4,5}}; // две строки, четыре столобца
res = sum2 (A,
2); // вызов функции sum2
}
Формальный аргумент имени массива может иметь вид int (*A) [4].
int sum2 (int (*A) [4], int M); // прототип
Для определения размера массива при вызове функции можноиспользовать выражение sizeof (A) /sizeof (A []). Например,
res = sum2 (A, sizeof (A) /sizeof(A []));
Способ 2. Другой способ передачи двумерного массива вфункцию состоит в погружении фактического двумерного массива с размерами MxN вдвумерный массив заведомо больших размеров. Пи этом достаточно взять большойразмер стоки, например, 100.
int sum3 (int A [] [100], int M, int N);// прототип
int sum3 (int A [] [100], int M, int N); // заголовок
{
….
} // телофункции
void main ()
{
int res, A [2] [100] = {{2,1,3,2}, {2,3,4,5}}; /* двестроки, четыре столбца с чатичной инициалиазацией*/
res = sum3 (A, 2,4); // вызов функции sum3
}
Способ 3. Третий способ передачи двумерного массива вфункцию состоит в эмуляции фактического двумерного массива с размерами MxN спомощью одномерного массива с размером M*N. Пи этом M*N должно быть меньше 64К.
int sum4 (int A [], int M, int N); // прототип
int sum4 (int A [], int M, int N); // заголовок
{
….
} // телофункции
void main ()
{
int res, A [2] [4] = {{2,1,3,2}, {2,3,4,5}}; /* две строки, четырестолбца */
res = sum4 ( (int *) A, 2,4); // вызов функции sum4
}
 
4. Тестирование функций
Вычислительные модули необходимо тщательно протестировать спомощью отдельной тестовой функции с прототипом
void test (void);
При тестировании следует соблюдать следующие требования:
автоматизм, то есть от программиста при тестировании нетребуется никаких действий,
прозрачность. Это означает, что функция testвыводит сообщения на экран только в случае возникновения ошибок.
иллюстративность: листинг тестовой функции позволяетпосмотреть различные способы вызова проверяемой функции.
всесторонность, то есть при тестировании необходиморассмотреть все крайние ситуации.
В программе должны осуществляться все возможные проверки, вчастности:
на корректность входных данных,
при выделении динамической памяти,
на выход индексов массива из диапазона.
/>/>
5. Практические задания
 5.1 Указать классы памяти переменной
Что напечатает программа? Укажите область действия, областьвидимости и продолжительность жизни всех переменных n.
int n = 1;
void main ()
{
printf (“%d", n);
static int n=3;
printf (“%d", n);
while (n--)
{
printf (“%d", n);
int n=10;
printf (“%d", n);
printf (“%d”,:: n+n);
}
}/>5.2 Работаемс адресами
У некоторой программы в модели large при работе в отладчике регистры содержат следующие значения:
CS = 1ADF, DS=1AE3, SS=1B26, SP=0FD2.
Найдите размеры областей памяти.
Укажите диапазоны возможных адресов для:
переменной int n=2, если она а) глобальная, б) статическая, в) локальная;
содержимого указателя char *str=”Hello”;
значения адресной константы main;
содержимого указателя int *A= (int *) malloc(1000).
 5.3 Прототипы функций
 5.3.1 Свопинг
Напишите прототип функции, которая организует обмен значенийдвух переменных.
 5.3.2 Индексы максимальных элементов одномерногомассива
Напишите прототип функции, которая находит индексымаксимальных элементов одномерного массива.
 5.3.3 Индексы максимальных элементов двумерногомассива
Напишите прототип функции, которая находит индексымаксимальных элементов двумерного массива с заданными размерами.
 5.3.4 Угол между двумя векторами
Напишите прототип функции, которая находит угол в радианахмежду двумя векторами из пространства Rn.
 5.3.5 Определитель матрицы
Напишите прототип функции, которая находит определительквадратной матрицы с размерами nxn.
 
5.4 Выделение фрагмента программы в отдельнуюфункцию
 
Разбиение программы на функции
#include
void main ()
{
int a, b, div, mod;
printf (“Введите два целых числа”);
scanf (“%d%d”, &a, &b);
div = a/b;
mod = a%b;
printf (“\n%d /%d =%d”, a, b, div);
printf (“\n%d%%%d =%d", a, b, mod);
}
Выделите в три отдельных функции фрагменты, связанные свводом данных, с вычислениями и с организацией вывода результатов. Вычислительнаяфункция должна быть одна. Глобальные переменные не использовать.
 5.5 Тестирование функции
 5.5.1 Сортировка массива
Следующий прототип функции сортирует массив А размером n по возрастанию на месте оригинального массива void sort (int A [], int n);
Напишите тест этой функции для трех различных вариантовисходных данных.
/>5.5.2 МиниМакс
Функция находит минимальное и максимальное из двух чиселтипа int и имеет прототип
void MinMax (int a, int b, int *pmin,int *pmax);
Напишите тест для этой функции.
/>6. Лабораторные задания
 6.1 Линейное уравнение
Написать функцию, которая решает линейное уравнение a ∙ x + b = 0 спроверкой выхода за диапазон типа float. Прототипфункции
int linur (float a, float b, float *px);
Функция получает:a и b — коэффициенты уравнения, px — указатель на ячейку, в которую будет помещен единственныйкорень уравнения.
Функция возвращает:
0 — нет решения,
1 — найдено единственное решение,
2 — любое число является решением,
3 — решение единственное, но не входит в диапазон типапеременной x.
Вывод текстовой информации с результатами решенияорганизовать с использованием оператора switch. Выходиз программы должен быть единственным. Организовать тестирование функции linur.
 6.2 Четные элементы массива
Напишите функцию, которая находит все четные элементыодномерного массива элементов типа int. Организовать тестирование функции.
Прототип функции
int Chot (int A [], int DimA, int FoundA []);
 
6.3 Нахождение простых чисел
Напишите функцию, которая находит все простые числа и ихколичество до long N включительно. Натуральное число m> 1 называется простым, если оно делится только на 1 и на само себя. Организоватьтестирование функции.
Прототип функции.
long AllProst (long N, long Prost [], int DimProst,int *flag);
 6.4 Количество вхождений подстроки в строку
Напишите функцию, которая определяет количество вхожденийподстроки в строку. Организовать тестирование функции.
Прототип функции
int NumStrStr (char *str,char *substr);
 6.5 Произведение матриц
Напишите функцию, которая находит произведение двухпрямоугольных матриц с согласованными размерами. Организовать тестированиефункции.
Прототип функции
void MMult (float A [], float B [], float AB[], int m, int n, int k);
Здесь одномерные массивы эмулируют двумерные массивы./>
7. Дополнительные задания
Написать функцию принадлежности точки невыпукломумногоугольнику без самопересечений.
Написать функции tolowerrus и toupperrus для перевода однойрусской буквы из верхнего регистра в нижний и наоборот.
 
Библиографический список
1.        Керниган Б. Язык программирования Си / Б. Керниган, Д. Ритчи. СПб.: Невскийдиалект, 2001.352 с.
2.        Подбельский В.В. Программирование на языке Си / В.В. Подбельский, С.С. Фомин.М.: Финансы и статистика, 2004.600 с.
3.        Программирование в Си. Организация ввода-вывода: метод. указания / сост.С.П. Трофимов. Екатеринбург: УГТУ, 1998.14 с.
4.        Программирование в Си. Динамическое распределение памяти: метод. указания/ сост. С.П. Трофимов. Екатеринбург: УГТУ, 1998.13 с.


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.