Составление алгоритма решения задачи и его реализация 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Составление алгоритма решения задачи и его реализация



Оглавление

  1. Лабораторная работа №1 Знакомство со средой Borland C++.

Программирование с использованием математических функций. 3

  1. Лабораторная работа №2

Форматный ввод-вывод 4

  1. Лабораторная работа №3

Составление алгоритма решения задачи и его реализация 5

  1. Лабораторная работа №4

Программирование алгоритмов циклической структуры 10

  1. Лабораторная работа №5

Обработка одномерных массивов 14

  1. Лабораторная работа №6

Обработка двумерных массивов 16

  1. Лабораторная работа №7 Типовые приемы алогитмизации 19
  2. Лабораторная работа №8 Обработка символьных данных 22
  3. Лабораторная работа №9

Программирование с использованием подпрограмм пользователя 24

  1. Лабораторная работа №10

Программирование с использованием собственных функций для обработки символьных данных 28

  1. Лабораторная работа №11

Программирование алгоритмов с использованием переменной структура 31

  1. Лабораторная работа №12 Работа с файлами на верхнем уровне 35
  2. Лабораторная работа №13 Организация работы в графическом режиме 40
  3. Лабораторная работа №14 Создание графика 42
  4. Лабораторная работа №15

Организация перемещения объекта по заданной траектории 45

  1. Лабораторная работа №16 Организация работы в текстовом режиме 51
  2. Лабораторная работа №17 Создание светового меню 53
  3. Лабораторная работа №18

Динамическое распределение памяти, создание списка 59


Лабораторная работа №1

Знакомство со средой Borland C++. Программирование с использованием математических функций.

Цель работы – изучение среды Borland C++, овладение навыками программирования с использованием математических функций.

Задания для самостоятельной подготовки:

 

1. Изучить:

· главное меню среды Borland C++;

Задание к лабораторной работе:

1. создать новый файл программы под названием lab1.cpp;

2. в окне редактирования программного кода набрать код программы приведенной ниже;

3. исправить ошибки;

4. выполнить программу в пошаговом режиме.

 

#include <math.h>

#define PI 3.14

viod main ()

{ float a,b,x,y,z;

clrscr();

z=3;

y=2;

x=3,4;

a=((2*cos(x-PI/6)))/(1/2+pow(sin(y),2))

b=1+(pow(z,2)/(3+pow(z,2)/5));

return;

}

 


Лабораторная работа №2

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

Цель работы - овладение практическими навыками использования форматного ввода-вывода.

 

Задание к лабораторной работе:

  1. дан текст программы, которая по определенным формулам вычисляет a и b, переменные x, y и z определены программно. Переделайте программу так, чтобы пользователь мог самостоятельно определять переменные x, y и z и получал результаты вычисления на экране.
  2. составить блок-схему программы

 

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define PI 3.14

void main ()

{ float a,b,x,y,z;

clrscr();

a=((2*cos(x-PI/6)))/(1/2+pow(sin(y),2));

b=1+(pow(z,2)/(3+pow(z,2)/5));

 

return; }


Лабораторная работа №3

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

З а д а н и е А. Вычислить на ЭВМ значения y и p, используя расчетные формулы:

при значениях a=0,59, z=-4,8, x=2,1.

 

Программа решения задачи имеет вид:

#include <stdio.h> //подключение файла

#include <math.h> //подключение файла

void main () //заголовок функции main

{

float a,z,x,y,p; // объявление переменных

printf (“Введите значения переменных a,z,x\n”); // вывод на экран сообщения

scanf (“%f%f%f”, &a,&z,&x); // ввод значений переменных

y=a*pow(tan(pow(x,2)),3)+sqrt(pow(z,2)/(pow(a,2)+ pow(x,2))); //расчет y

p=log(a+ pow(x,2))+pow(sin(z/a),2); // расчет p

printf (“Значения переменных:\n y=%10.3f\n p=%10.3f\n ”,y,p);

//вывод значений переменных

return; //завершение функции main

}

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

a=1, z=1, x=0.5.

Тогда вычисляемые значения y и p будут равны:

y=0.911, p=0.233.

Вычисленные значения следует сравнить со значениями, вычисленными на ЭВМ.

З а д а н и е B. Вычислить на ЭВМ значение функции:

при значениях a=1,3, b=1,29, t=0,38.

 

Программа решения задачи имеет вид:

 

#include <stdio.h> //подключение файла

#include <math.h> //подключение файла

void main () //заголовок функции main

{

float a,b,t,s; // объявление переменных

printf (“Введите значения переменных a,b,t\n”); // вывод на экран сообщения

scanf (“%f%f%f”, &a,&b,&t); // ввод значений переменных

if (a*t<1) //если a*t<1

s=a*t+b; //то s рассчитывается по первой формуле

else //иначе

if (a*t= =1) // если a*t= =1

s=cos(a*t); // то s рассчитывается по второй формуле

else // иначе

s=exp(-a*t)*cos(a*t); // s рассчитывается по третьей формуле

printf (“s=%10.3f\n”,s); //вывод значения переменной

return; //завершение функции main

}

В качестве тестовых наборов исходных данных используем следующие значения переменных:

1. a=1, b=1, t=0.5, s=1.5;

2. a=1, b=1, t=1, s=0.5403;

3. a=2, b=1, t=1, s=-0.0563;

Вычисленные значения следует сравнить со значениями, вычисленными на ЭВМ.

 

Контрольные вопросы

  1. Какие типы величин есть в изучаемом языке программирования?
  2. Указать диапазон значений величин целого и действительного типов.
  3. Какие имена переменных допустимы в программе? Как задать тип переменной в программе?
  4. Указать имена стандартных функций для вычисления .
  5. Указать средства, имеющиеся в языке программирования для управления размещением данных на строке. Как организовать вывод значений, сопровождая выводимое числовое значение наименованием переменной? Как организовать пропуск одной, двух строк при выводе?
  6. Как выбрать значения исходных данных для тестового варианта счета?
  7. Перечислить действия, реализуемые при выполнении условного оператора.
  8. Что такое вычислительный процесс разветвляющейся структуры? Как организовать разветвление вычислений на две, на три ветви?
  9. Зачем необходимо при отладке программы тестировать все ветви алгоритма?

Лабораторная работа №4

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

З а д а н и е А. Вычислить на ЭВМ значение функции:

при изменении аргумента t в диапазоне с шагом 0,1. Вывод значений t и s выполнить в виде таблицы.

Программа решения задачи имеет вид:

 

#include <stdio.h> //подключение файла

#include <math.h> //подключение файла

void main () //заголовок функции main

{

float a,b,t,s,tn=0.1,tk=2.1,h=0.1; // объявление переменных с инициализацией

printf (“Введите значения переменных a,b,t\n”); // вывод на экран сообщения

scanf (“%f%f”, &a,&b); // ввод значений переменных

printf (“Таблица функции S(T)\n” s t\n); //вывод шапки таблицы

t=tn; //присвоение начального значения t

while(t<=tk) // пока t меньше либо равно конечного значения

{if (a*t<1) //если a*t<1

s=a*t+b; //то s рассчитывается по первой формуле

else //иначе

if (a*t= =1) // если a*t= =1

s=cos(a*t); // то s рассчитывается по второй формуле

else // иначе

s=exp(-a*t)*cos(a*t); // s рассчитывается по третьей формуле

printf (“%10.3f%10.3f \n”,t,s); //вывод значений переменных

t+=h; //увеличение t на величину шага

}

return; //завершение функции main

}

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

с точностью до элемента ряда, меньшего е=10-4 для x=0,1.

Определить число элементов ряда, вошедших в сумму.

Для вычисления общего элемента ряда

используем рекуррентное соотношение, выразив n-й элемент через (n-1)-й:

;

Значение первого элемента ряда вычислим до цикла с помощью оператора присваивания а=x, а всех последующих элементов ряда по рекуррентному соотношению

в цикле.

Программа решения задачи имеет вид:

 

#include <stdio.h> //подключение файла

#include <math.h> //подключение файла

void main () //заголовок функции main

{ int n;

float x,e,a,s; // объявление переменных

printf (“Введите значения переменных x,e\n”); // вывод на экран сообщения

scanf (“%f%f”, &x,&e); // ввод значений переменных

a=x; s=0; n=1; //присвоение начальных значений

do

{ s+=a; // накопление суммы

n++; // увеличение n на 1

a*=-a*x*x/(2*n-2)*(2*n-1); //расчет следующего элемента

} while(fabs(a)>=e) //пока текущий элемент a больше либо равен заданной точности e

printf (“сумма элементов ряда=%10.3f\nчисло элементов=%10d \n”,s,n);

//вывод значений переменных

return; } //завершение функции main

 

Контрольные вопросы

  1. указать последовательность действий, выполняемых при организации циклических участков программы с заданным числом повторений.
  2. Указать назначение и правила организации цикла.
  3. Перечислить возможные способы организации цикла с заданным числом повторений в изучаемом языке программирования.
  4. Что такое итерационный вычислительный процесс? Его отличия от цикла с заданным числом повторений.
  5. Каково условие выхода из цикла при вычислении значения суммы элементов бесконечного ряда?
  6. Какие операторы организуют тело цикла в программе вычисления значения суммы элементов бесконечного ряда?
  7. Почему при вычислении значения текущего элемента ряда используется простая переменная, а не индексированная?
  8. Зачем используются рекуррентные соотношения для вычисления значений элементов ряда?

Лабораторная работа №5

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

Вычислить на ЭВМ наибольший элемент массива X(N), N<=7 и его порядковый номер. Проверить правильность работы программы при N=3 и значениях элементов массива (1.5, 4.3, 5.6, 2.4). При выполнении задания необходимо использовать прием нахождения наибольшего. Для этого перед циклом следует задать начальное значение наибольшего, равное первому элементу массива, а в цикле сравнивать наибольший с текущим элементом массива; в том случае, если текущий элемент больше наибольшего из предыдущих, то считать его наибольшим. Для нахождения порядкового номера наибольшего элемента массива необходимо перед циклом задать его начальное значение как номер первого элемента массива, а в цикле всякий раз, когда текущий элемент массива больше наибольшего, считать номером наибольшего номер текущего элемента массива.

 

Программа решения задачи имеет вид:

 

 

#include <stdio.h> //подключение файла

void main () //заголовок функции main

{

float X[7], xmax;

int i,N,nmax; // объявление переменных

do

{printf (“Введите размерность массива X в диапазоне от 1 до7\n”);

// вывод на экран сообщения

scanf (“%d”, &N); // ввод значения переменной

}while(N<1||N>7);

printf (“Введите %d элементов массива X\n”,N);

// вывод на экран сообщения

for(i=0;i<N;i++) // цикл по перебору элементов массива

scanf (“%f”, &X[i]); // ввод значений элементов массива

xmax=X[0]; nmax=0; // присвоение начального значения

for(i=0;i<N;i++) // цикл по перебору элементов массива

if (X[i]>xmax) //если текущий элемент больше значения наибольшего

{ xmax=X[i]; //то наибольшему присваивается значение текущего

nmax=i; // индексу наибольшего присваивается индекс текущего

}

printf (“наибольший элемент=%10.3f\n его индекс=%2dn”,s);

//вывод значений переменных

return; //завершение функции main

}

 

Контрольные вопросы

  1. Указать особенности программ, использующих массивы.
  2. Как объявляется массив в программе? Каким образом можно проинициализировать элементы массива?
  3. В чем состоит особенность при организации цикла при обработке массивов?
  4. В чем состоит особенность использования приемов программирования при обработке массивов?
  5. Указать особенности ввода и вывода массивов.

 


Лабораторная работа №6

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

В массиве L(N,M) N<=3, M<=4 найти столбец с наименьшей суммой элементов. На экран вывести номер столбца имеющего наименьшую сумму элементов, элементы этого столбца и сумму его элементов.

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

 

Программа решения задачи имеет вид:

 

#include <stdlib.h> //подключение файла

#include <stdio.h> //подключение файла

 

void main () //заголовок функции main

{

float L[3][4], smin,s;

int i,j,N,M,nmin; // объявление переменных

do

{printf (“Введите размерность массива N в диапазоне от 1 до3, M - от 1 до4 \n”);

// вывод на экран сообщения

scanf (“%d%d”, &N,&M); // ввод значения переменной

}while(N<1||N>3||M<1||M>4);

//пока введенные значения не лежат в заданном диапазоне

randomize(); // инициализация датчика случайных чисел

printf (“Массива L\n”); // вывод на экран сообщения

for(i=0;i<N;i++) // цикл по перебору элементов массива по строкам

{ for(j=0;j<M;j++)

{L[i][j]=(random(100)-50)/10.;

//генерация случайного числа и присвоение его элементу массива

printf (“%f”, L[i][j]); // вывод значения элемента массива

}

printf (“\n”); //переход на новую строку

}

nmin=0; smin=0; // присвоение начального значения

for(i=0;i<N;i++)

smin+=L[i][0]; //накопление суммы элементов первого столбца

for(j=0;j<M;j++) // цикл по перебору элементов массива по столбцам

{ s=0; // присвоение начального значения

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

s+=L[i][j]; //накопление суммы элементов текущего столбца

if (s<smin)

//если меньше значения наименьшей суммы

{ smin=s;

//то наименьшей сумме присваивается значение суммы элементов текущего столбца

nmin=j;

// индексу столбца, имеющего наименьшую сумму присваивается //индекс текущего столбца

}

}

printf (“Номер столбца, имеющего наименьшую сумму элементов=%2d\n”,nmin);

 

printf (“Элементы столбца, имеющего наименьшую сумму элементов\n”);

for(i=0;i<N;i++)

printf (“%f”, L[i][0]);

printf (“\nсумма элементов=%f\n”,smin); //вывод значений переменных

return; //завершение функции main

}

 

Контрольные вопросы

  1. Указать основные правила организации вложенных циклов.
  2. Указать способы выхода из внутреннего цикла.
  3. Как организовать вывод матрицы в общепринятом виде?
  4. Как организовать вывод нижней треугольной матрицы в общепринятом виде?
  5. Как организовать ввод матрицы размером N на M элементов?

Лабораторная работа №7

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

Задание.

Написать программу, осуществляющую вывод и управление меню с подсветкой. Главное меню должно содержать пункты:

1. Ввод информации

2. Вывод информации

3. Выход

При выборе первого пункта осуществить ввод в массив структур информации

- ФИО рабочего;

- год рождения;

- табельный номер.

При выборе второго пункта осуществить вывод меню второго уровня

  1. Вывод ФИО рабочего и года рождения
  2. Вывод ФИО рабочего и табельного номера
  3. Вывод всей информации
  4. Выход.

Разместить функции программы создания светового меню в отдельных файлах. Объединить созданные файлы в проекте.

 

Программа решения задачи имеет вид:

 

Файл 1:

void menu(int j, int c1, int c2, int ys, unsigned char *textmenu[])

{

int i;

textcolor(c1);

textbackground(c2);

for(i=0;i<j;i++)

{

gotoxy(1,ys);

clreol();

cprintf("%s",textmenu[ys/2-1]);

ys+=2;

}

// ys+=2;

return;

}

Файл 2:

int winmenu(char* u[])

{

int y,predy;

union

{

int p;

unsigned char b[2];

} key;

textbackground(0);

clrscr();

window(7,3,73,22);

textbackground(15);

clrscr();

window(10,4,70,21);

textbackground(2);

clrscr();

y=2;

predy=2;

menu(3,0,2,2,u);

menu(1,15,0,2,u);

for(;;)

{

key.p=bioskey(0);

switch (key.b[1])

{

case 72: y-=2;

if(y<2) y=6;

break;

case 80: y+=2;

if(y>6) y=2;

break;

case 28: return y/2;

}

menu(1,0,2,predy,u);

menu(1,15,0,y,u);

predy=y;

}

}

Файл 3:

 

int vvod(struct pass mas[])

{

int i,kol;

clrscr();

cprintf("Введите кол-во жителей:");

scanf("%d",&kol);

for(i=0;i<kol;i++)

{

cprintf("\r\n");

cprintf("Введите ФИО: ");

scanf("%s", &mas[i].fio);

cprintf("\r\nВведите год рождение: ");

scanf("%d", &mas[i].god);

cprintf("\r\nВведите его табельный номер: ");

scanf("%d", &mas[i].tabn);

}

return kol;

}

 

Файл 4:

void vivod(int k,struct pass mas[],int de)

{

int i;

clrscr();

for(i=0;i<k;i++)

switch(de)

{

case 1:cprintf("ФИО:%20s\r\nГод рождения:%5d\r\n",mas[i].fio,mas[i].god); break;

case 2:cprintf("ФИО:%20s\r\nТабельный номер:%d\r\n",mas[i].fio,mas[i].tabn); break;

case 3:cprintf("ФИО:%20s\r\nГод рождения:%5d\r\nТабельный номер:%d\r\n",mas[i].fio,mas[i].god,mas[i].tabn);

}

getch();

return;

}

 

Файл 5:

 

#include<stdio.h>

#include<string.h>

#include<conio.h>

#include<stdlib.h>

#include<graphics.h>

#include<math.h>

#include<dos.h>

#include<bios.h>

 

 

struct pass

{

char fio[30]; int god; int tabn;

};

 

void main()

{

struct pass s[30];

int koll,R=1,P=1;

unsigned char *textmenu1[]={"1.Ввод инфо","2.Вывод инфо","3.Выход"};

unsigned char *textmenu2[]={"1.Вывод ФИО и год рождения","2.Вывод ФИО и табельный номер","3.Вывод всей инфо"};

clrscr();

// koll=vvod(s);

_setcursortype(_NOCURSOR);

while(R!=3)

{

R=winmenu(textmenu1);

switch(R)

{

case 1: koll=vvod(s); break;

case 2: P=winmenu(textmenu2); vivod(koll,s,P); break;

case 3: clrscr(); textcolor(4); cprintf("Программа выполнила недопустимую операцию и будет закрыта!!!"); getch();

}

}

return;

}

Контрольные вопросы

  1. Что такое проект в интегрированной среде Borland C++?
  2. Для чего предназначен проект? Приведите примеры использования проекта.
  3. Какие файлы могут входить в состав проекта?

Лабораторная работа №8

Обработка символьных данных

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

 

Задания для самостоятельной подготовки:

1. Изучить:

- правила записи символьных данных (констант, переменных, массивов) и их объявление;

- способы ввода и вывода символьных данных;

- способы обработки символьных данных;

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

2. Разработать алгоритм решения в соответствии с заданием.

3. Составить программу решения задачи.

4. Подготовить тестовый вариант исходных данных для проверки работы программы.

 

Задание к работе:

  1. Составить и выполнить на ЭВМ программу обработки символьных данных в соответствии с вариантом задания, указанного в табл. 8.
  2. Проверить правильность выполнения программы с помощью тестового варианта.

Таблица 6

Вариант задания Условия задачи
  В строке найти самое длинное симметричное слово, например ALLA, MOM и т. д.
  В строке найти самое длинное слово и вывести его на экран.  
  В строке найти самое короткое слово и вывести его на экран.  
  Из строки выбрать и напечатать символы, которые встречаются в ней один раз.  
  Из строки выбрать целые числа и записать их в массив N.  
  В строке удалить все символы, расположенные между скобками (…), включая ().
  В строке указать слово, в котором доля согласных максимальна.  
  В строке указать слово, в котором доля гласных A, E, I, O максимальна.  
  Для каждого слова строки указать долю согласных.
  Для встречающихся в тексте пар рядом расположенных символов указать, сколько раз встречается каждое из таких двухбуквенных сочетаний.
  Отредактировать строку вида: МАРИЯ ПЕТРОВНА СИДОРОВА. КАРЛ ИВАНОВИЧ ГЕ. в строку вида: СИДОРОВА М. П. ГЕ К. И.
  На основе исходной строки сформировать строку, в которой сначала записаны все буквы, а затем все цифры исходной строки.
  В строке указать слово, в котором доля гласных максимальна.
  Из строки выбрать и напечатать символы, которые встречаются в ней два раза.
  Для каждого слова строки указать долю гласных

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

В строке удалить все лишние пробелы, оставляя между словами по одному пробелу.

Обработку строки нужно производить с конца, чтобы не пропускать сочетание двух пробелов. Если встречаются два пробела подряд (текущий символ и предыдущий), удалить предыдущий символ путем копирования части строки с новой позиции, отличающейся от предыдущей на 1.

Программа решения задачи имеет вид:

 

#include <stdio.h> //подключение файла

#include <string.h> //подключение файла

 

void main () //заголовок функции main

{

char str[80],*n;

int i; // объявление переменных

printf (“Введите строку\n”);

gets(str); //ввод строки

i=strlen(str); //начальное значение (длина строки)

while(i) //пока не конец строки (i не равно нулю)

{if(*(str+i)= =’ ‘ &&(*(str+i-1)= =’ ‘)

//если текущий и предыдущий символы пробелы

{n=str+i-1; //n устанавливается на предыдущий символ

while((*n=*(n+1))!=’\0’)

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

n++; //переход к следующему символу

}

i--; //переход к предыдущему символу

}

if(*(str+strlen(str)-1)= =’ ‘) //если конечный символ пробел

*(str+strlen(str)-1)=’\0’; //то он удаляется

if(*(str)= =’ ‘) //если первый символ пробел

{n=str; //запоминается номер текущей позиции

while((*n=*(n+1))!=’\0’) //то он удаляется

n++;

}

printf (“Строка без лишних пробелов:\n%s\n”,str);

//вывод значения переменной

return; //завершение функции main

}

 

Контрольные вопросы

  1. Указать области применения символьных данных.
  2. Указать способы записи символьных констант.
  3. Указать, какие действия можно выполнять над символьными данными.
  4. Указать способы объявления и определения символьных данных.

 


Лабораторная работа №9

Подпрограмм пользователя

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

 

Задания для самостоятельной подготовки:

1. Изучить:

· правила записи подпрограммы (функции) и обращения к ней;

· способы передачи параметров в подпрограмму;

· порядок выполнения программ, использующих подпрограммы.

2. Разработать алгоритм решения в соответствии с заданием.

3. Составить программу решения задачи.

4. Подготовить тестовый вариант исходных данных для проверки работы программы.

 

Задание к работе:

  1. Составить и выполнить на ЭВМ программу, использующую подпрограмму-функцию в соответствии с вариантом задания, указанного в табл. 6.
  2. Проверить правильность выполнения программы с помощью тестового варианта.

Таблица 7

Вариант задания Условия задачи Примечания
  Вычислить большие корни квадратных уравнений x2-ax+b=0 cx2-dx-f=0 Все корни действительные
  Подсчитать число точек, находящихся внутри круга радиусом r с центром в начале координат; координаты заданы массивами X(100), Y(100) Расстояние точки от начала координат вычислять в подпрограмме
  Определить периметры треугольников, заданных координатами их вершин XA (5), XB (5), XC (5) YA (5), YB (J), YC (5) Длину стороны треугольников вычислять в подпрограмме
  Подсчитать число точек, находящихся внутри круга радиусом r с центром в точке с координатами (1,1); координаты заданы массивами X(80), Y(80) Расстояние точки от центра круга определять в подпрограмме
  Вычислить z= , где υ1, υ2, υ3 – объем шаров с радиусами r1, r2, r3 соответственно υ1 вычислять в подпрограмме  
  Вычислить суммы положительных элементов массивов X (N), Y (M), Z (K) N≤60 M≤60 K≤70
  Вычислить z=(s1+s2)/2, где s1 – сумма положительных элементов массива А(10), s2 – сумма отрицательных элементов массива В(8). Сумму элементов вычислять в функции. Ввод элементов массива осуществлять в функции. Обе суммы вычислять в одной подпрограмме
  Вычислить z=(xm1+xm2)/2, где xm1, xm2 – наименьшие элементы массивов А(15), В(10). Ввод элементов массива осуществлять в функции. Наименьшие элементы вычислять в функции

Продолжение таблицы 7

Вариант задания Условия задачи Примечания
  Вычислить суммы положительных элементов каждой строки массивов X(6,4), Y(8,5). Ввод элементов массива осуществлять в функции. Сумму положительных элементов вычислять в функции
  Подсчитать количество элементов массива А(5,6), лежащих в диапазоне [0,1], и количество элементов массива В(3,4), лежащих в диапазоне [-1,0]. Ввод элементов массива осуществлять в функции. Количество элементов вычислять в функции
  Найти средние значения и стандартные отклонения для массивов A(N1), B(N2). Средние значения и стандартные отклонения вычислять в функции. Ввод элементов массива осуществлять в функции. N1<=20 N2<=10
  Определить число положительных элементов до первого отрицательного в массивах X(N), Y(M), Z(K). Число положительных элементов вычислять в функции. Ввод элементов массива осуществлять в функции. N<=20 M<=30 K<=10
  Подсчитать количество элементов массива А(5,6), лежащих в диапазоне [0,5], и количество элементов массива В(3,4), лежащих в диапазоне [-5,0]. Ввод элементов массива осуществлять в функции. Количество элементов вычислять в функции
  Найти средние значения A(15), B(10). Средние значения и стандартные отклонения вычислять в функции. Ввод элементов массива осуществлять в функции.  
  Подсчитать число точек, находящихся внутри круга радиусом r с центром в точке с координатами (1,1); координаты заданы массивами X(80), Y(80) Расстояние точки от центра круга определять в подпрограмме

 

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

Подсчитать количество элементов целочисленных массивов А(4,5), кратные 3, и В(3,4), кратные 5, используя для подсчета функцию. Ввод и вывод элементов осуществлять в функциях.

В подпрограммы ввода и вывода элементов массивов необходимо передавать массивы, их размер. Так как массивы передаются по ссылке, эти функции ничего не будут возвращать (тип функции void). В подпрограмму подсчета количества элементов необходимо передавать массивы, их размер и числовое значение (3 или 5), кратность элементов которому нужно определить. В подпрограмме подсчета количества элементов требуется организовать цикл по перебору всех элементов массивов (например, построчно), проверку текущего элемента на кратность соответствующему параметру, и увеличение счетчика чисел на 1, в случае истинности проверки. Функция возвращает один результат – значение счетчика чисел, поэтому тип функции int.

 

Программа решения задачи имеет вид:

 

#include <stdlib.h> //подключение файла

#include <stdio.h> //подключение файла

 

void inparr2 (float X[][5], int N, int M) //заголовок функции inparr2

{

int i,j; // объявление переменных

randomize(); // инициализация датчика случайных чисел

for(i=0;i<N;i++) // цикл по перебору элементов массива по строкам

for(j=0;j<M;j++)

X[i][j]=(random(100)-50)/10.;

//генерация случайного числа и присвоение его элементу массива

return; //завершение функции inparr2

}

 

void outarr2 (float Y[][5], int K, int L) //заголовок функции inparr2

{

int i,j; // объявление переменных

for(i=0;i<K;i++) // цикл по перебору элементов массива по строкам

{ for(j=0;j<L;j++)

printf (“%f”, Y[i][j]); // вывод значения элемента массива

printf (“\n”); //переход на новую строку

}

return; //завершение функции outarr2

}

 

int countsh (float C[][5], int N, int M, int k) //заголовок функции countsh

{

int i,j,coun; // объявление переменных

coun=0; //присвоение начального значения

for(i=0;i<N;i++) // цикл по перебору элементов массива по строкам

for(j=0;j<M;j++)

if(C[i][j]%k= =0) // проверка кратности текущего элемента

coun++; //увеличение счетчика чисел на 1

return coun; //завершение функции countsh

}

 

void main () //заголовок функции main

{

float A[4][5], B[3][5];

int counA,counB; // объявление переменных

inparr2(A,4,5);

inparr2(B,3,4); // вызов функции inparr2

printf (“Массив A\n”);

outarr2(A,4,5); // вызов функции outarr2

printf (“Массив B\n”);

outarr2(B,3,4); // вызов функции outarr2

counA = countsh(A,4,5,3);

counB= countsh(B,3,4,5); // вызов функции countsh

printf (“Количество элементов, кратных 3 в массиве A=%3d\n”, counA);

printf (“Количество элементов, кратных 5 в массиве B=%3d\n”, counB);

//вывод значений переменных

return; //завершение функции main

}

 

Контрольные вопросы

  1. Указать, при каких условиях целесообразно использование подпрограмм, какие выгоды они предоставляют.
  2. Указать способы передачи параметров в подпрограмму.
  3. Указать, как организовать подпрограмму без параметров, подпрограмму, не возвращающую значение.
  4. От чего зависит тип функции?

Лабораторная работа №10

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

Задана строка. Спроектировать и написать функцию, осуществляющую вставку последовательности символов в строку с заданной позиции (вставляемая последовательность задается пользователем).

В функцию вставки необходимо передавать три параметра: исходную строку, вставляемую строку, номер символа после которого осуществлять вставку. Функция возвращает один результат – адрес полученной строки (совпадает с адресом исходной строки). Исходная строка состоит из двух частей: первой подстроки – после которой нужно осуществить вставку символов, и второй – перед которой нужно осуществить вставку символов. В функции объявляется локальная переменная – указатель на char. В нее запоминается адрес символа, перед которым будет осуществлена вставка (адрес начала второй подстроки). На позицию вставки (после первой подстроки) записывается символ ‘\0’ – признак окончания строки. Добавляется вставляемая строка и вторая подстрока, адрес которой был запомнен в локальной переменной.

 

Программа решения задачи имеет вид:

#include <stdio.h> //подключение файла

#include <string.h> //подключение файла

 

char *insertstr (char *s,int n1,char *t) //заголовок функции insertstr

{ //объявление локальной переменной-указателя

char *l;

strcpy(l,s+n1); //копирование второй части строки

s[n1]='\0'; //запись '\0' на позицию вставки

strcat(s,t); //добавление вставляемой строки

strcat(s,l); //добавление второй части строки

return s; //завершение функции insertstr

}

 

void main() //заголовок функции main

{char str[255], a[80];

int n; // объявление переменных

printf("Введите строку\n");

gets(str);

printf("Введите вставляемую последовательность\n");

gets(a);

printf("Введите номер символа после которого осуществлять вставку\n");

scanf(“%d”,&n) //ввод значений переменных

strcpy(str,insert(str,n,a));

//вызов функции strcpy, копирующей в str, значение, Возвращаемое функцией insert

printf("Полученная строка\n%s\n",str); //вывод значения переменной

return; //завершение функции main

}

Контрольные вопросы

  1. Перечислить способы ввода и вывода символьных данных.
  2. Назвать специальные функции, используемые для обработки символьных данных.
  3. Пояснить применение указателей при работе с символьными данными.
  4. Указать, что служит признаком окончания строки.

Лабораторная работа №11

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

Задание.

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

- фамилия студента;

- группа;

- оценки.

Вывести на экран введенную информацию в виде таблицы и информацию о студентах, имеющих средний балл выше 3.

 

Программа решения задачи имеет вид:

 

#include<stdio.h>

#include<conio.h>

 

void main()

{

struct student

{

char fio[25],gr[7]; // Ф.И.О. студента

int mark[9][6],kurs,kol[9]; // оценки по семестрам, курс, сессии

}st[250];

int m,kolst,i,j,l,k,n,p,o,q,s;

float sr;

 

printf("\n Введите количество студентов:");

scanf("%d",&kolst);

 

for (i=0; i<kolst;i++) // ввод информации о студентах

{

printf("Введите фамилию:");

scanf("%s",&st[i].fio);

printf("Введите группу:");

scanf("%s",&st[i].gr);

printf("Введите курс:");

scanf("%d",&st[i].kurs);

if (st[i].kurs==5) // это чтобы не было 10 сессии

l=1;

else l=0;

 

for (j=0;j<st[i].kurs*2-l;j++)

{

printf("Введите количество оценок в %d семестре:",j+1);

scanf("%d",&st[i].kol[j]);

printf("Введите оценки за %d семестр:",j+1);

 

for (k=0;k<st[i].kol[j];k++)

scanf("%d",&st[i].mark[j][k]);

}

}

printf("Информация о студентах \n");

printf("┌─────────┬────────┬───────┬────────┬───────────┐\n");

printf("│ФИО студента│ Группа │ Курс │ Семестр │ Оценки │\n");

printf("│ │ │ │ ├─┬─┬─┬─┬─┬─│\n");

printf("├─────────┼────────┼───────┼────────┼─┼─┼─┼─┼─┼─┤\n");

m=0; // кол-во студентов с баллом выше 3

 

for (i=0; i<kolst;i++) // цикл по студентам

{

sr=0; // средний балл

n=0; // количество оценок

if(st[i].kurs==5)

l=1;

else l=0;

 

for (j=0;j<st[i].kurs*2-l;j++) // цикл по семестру (сколько проучился)

{

 

for (k=0;k<st[i].kol[j];k++) // цикл по оценкам в j-той сессии

sr+=st[i].mark[j][k]; // k-тая оценка в j-той сессии

n+=st[i].kol[j];

}

sr/=n; \\средний балл

 

if (sr>=4)

{

printf("│ %-16s│ %-7s", st[i].fio,st[i].gr);

 

for (p=1;p<st[i].kurs+1;p++) // вывод курса

{

printf("│%-7d",p);

 

for (o=2*p-l-1;o<2*p-l+1;o++) // вывод o-того семестра

{

printf("│%-8d",o);

 

for (q=0;q<st[i].kol[o-1];q++) // вывод оценок в o-том семестре

printf("│%-d",st[i].mark[o-1][q]);

 

if (q<6) // чтобы были пустые ячейки, если оценок меньше 6

for (s=0;s<6-q;s++)

printf("│ ");

printf("│\n"); // переход на следующую строку в таблице

printf("│ │ │ ");

}

printf("│ │ │ │ │ │ │ │\n");

printf("│ │ ");

}

printf("│ │ │ │ │ │ │ │ │\n");

m++;

}

}

printf("└─────────┴────────┴───────┴────────┴─┴─┴─┴─┴─┴─┘\n");

 

if (m= =0)

printf("Студенты, имеющие средний балл, больший 3,отсутствуют\n");

getch();

return;

}

 



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 385; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.128.78.41 (0.496 с.)