Расчет определителя 2-го порядка по введенным четырем целым числам

Южно-Уральский государственный университет

Заочный инженерно - экономический факультет









Контрольная (курсовая) работа №2

По Информатике





Выполнил студент- заочник 1го курса

Шифр – ЭПА-04-588			Группа – 147

«____»___________2008г. «____»___________2008г.

Срок предоставления работы по графику Дата отправки работы

№_____________ по журналу «____»_____________2008г.

___________________ Хусаинов Р.З.

отметка о зачете работы

Преподаватель

____________________

Подпись преподавателя

«____»_____________2008г.




1. Расчет определителя 2го порядка по введенным четырем целым числам



Программа:

 /*Расчет определителя 2го порядка по введенным 4-м целым числам*/



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

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



main () /*главная функция*/

{

 int a1,a2,a3,a4,b; /*объявление переменных*/

 clrscr (); /*очистка экрана*/

printf ("\n\n\t\tРасчет определителя 2-го порядка\n\n\n\r");

printf ("\tВведите 1-й элемент 1-й строки - "); /*ввод значений*/

scanf ("%d",&a1);

printf ("\tВведите 2-й элемент 1-й строки - ");

scanf ("%d",&a2);

printf ("\tВведите 1-й элемент 2-й строки - ");

scanf ("%d",&a3);

printf ("\tВведите 2-й элемент 2-й строки - ");

scanf ("%d",&a4);



 b=a1*a4-a2*a3 /*расчет определителя*/



printf ("\n\n\t\t\tОпределитель матрицы = %d",b); /*вывод результата*/

 getch (); /*ожидание нажатия любой клавиши*/

}


Пример исполнения:









b=a1*a4-a2*a3

Вывод значения b

Ожидание нажатия клавиши

Очистить экран

Ввод а1,а2,а3,а4

1

1

КОНЕЦ

НАЧАЛО

Алгоритм:


2. Вводится натуральное число меньше 256. Поменять местами цифры десятков и единиц и вывести на экран новое число



Программа:

/* Поменять местами десятки с единицами натурального числа меньше 256*/

#include <conio.h>

#include <stdio.h>



main()

{

 int a,b,c,d,e;

 clrscr ();

 printf ("\tЗамена местами десяток с единицами в натуральном числе\n\n\n\r");

 printf ("\t\aВведите натуральное число меньше 256\n\tЭто число - ");

 scanf ("%d",&a);







/*Проверяем число на соответствие условию*/

 if (a>0)			

	 {

		if (a<256)		

		{/*Число удовлетворяет условию*/

		b=a%10;			/*Находим еденицы*/

		c=(a%100)-b;		/*Находим десятки*/

		d=(a%1000)-(c+b);		/*Находим сотни*/

		e=d+b*10+c/10;		/*Переставляем разряды ед. дес.*/

		printf ("\n\r\tПосле замены разрядов получилось число %d",e);

		}

		else/*Выход если число больше 256*/

		printf ("\t\aЧисло %d не соответствует условию",a); 

	 }

 else/*Выход если число <= 0*/

	printf ("\t\aЧто читать не умеешь? Только натуральные!");

getch ();

}



Пример исполнения:




Алгоритм:





Очистить экран



Ввод «а»

1

a>0

нет

да

a<256

нет

да

b=a%10;

c=(a%100)-b;

d=(a%1000)-(c+b);

e=d+b*10+c/10;

Вывести результат ‘е’

Вывести сообщение «Число больше 256»

КОНЕЦ

Вывести сообщение

«Число не натуральное»

1

Ждать нажатия клавиши



НАЧАЛО



3.Вводится число типа беззнаковое длинное целое. Определить состояние 20-го и 21-го бита. Установить в нулевое состояние 4-й и 5-й биты числа



Программа:

 /*программа для определения 20-го, 21-го и сброса 4-го и 5-го бита числа */

 #include <conio.h>

 #include <stdio.h>

 main ()

 {

unsigned long a,b,ms20=524288,ms21=1048576,m045=2147483623;

		/*ms20 маска для определения 20-го бита,*/

		/*ms21 маска для определения 21-го бита,*/

		/*m045 маска для сброса 4-го и 5-го бита в веденном числе.*/

clrscr ();

printf ("Введите положительное целое число от 0 до 2'147'483'647 - ");

scanf ("%ld",&a);

if (a<=2147483647 && a>0)		 /*Проверка правильности ввода*/

{

		b=a&ms20; /*Проверка 20-го бита*/

	if(b==0)

	{

	printf ("20-й бит в числе %010ld равен -\"0\"\n\r",a);

	}

	else

	printf ("20-й бит в числе %010ld равен -\"1\"\n\r",a);



		b=a&ms21; /* Проверка 21-го бита*/

	if(b==0)

	{

	printf ("21-й бит в числе %010ld равен -\"0\"\n\r",a);

	}

	else

	printf ("21-й бит в числе %010ld равен -\"1\"\n\r",a);



		b=a&m045; /*Сброс 4-го и 5-го бита*/

	printf ("После сброса 4-го и 5-го бита число равно %010ld\n\r",b);

}

else

printf ("Неправильно введено число");

 getch ();

 }

 Пример исполнения: 









Очистить экран

Ввести «а»

0<«а»<2147483647

НЕТ

НЕТ

НЕТ

ДА

ДА

ДА

20-Й БИТ«а»=0

21-Й БИТ«а»=0



Вывести сообщение

«20-й бит=0»

Вывести сообщение

«20-й бит=1»

Вывести сообщение

«21-й бит=0»

Вывести сообщение

«21-й бит=1»

4и5Бит = 0

Вывести сообщение 

Число стало равно… 

КОНЕЦ

Вывести сообщение 

«Неправильно введено число»

Ждать нажатия клавиши



НАЧАЛО

Алгоритм:



4. Вывести на экран таблицу N значений заданной функции: y=sin(x)+sin(3x)/3/. Диапазон изменения переменной x [0; 6.28]. Количество точек таблицы N=100, ширина поля вывода переменных x и y – 9 позиций, точность- 4 позиции



Программа:

/* Программа для расчета заданной функции на 100 значений при Х=[0;6.28]*/

#include<stdio.h>

#include<math.h>

#include<conio.h>

main()

{

float x=0,y,dx=6.28/100;				/*dx шаг приращения х*/

int n;

	clrscr(); /*рисуем шапку таблицы*/

	printf("| № | X | Y |\n");

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



 for (n=1;n<=100;n++,x=x+dx)				/*... и значение х*/

	{

	y=sin(x)+sin(3*x)/3;				/* значение у */

	printf("|%3d|%9.4f |%9.4f|\n",n,x,y);

		if((n%20)==0)

		{

		printf("---------------------------");	/*низ таблицы на экране*/

		gotoxy(3,24);

			if (n==100)

			cprintf (" Расчет закончен. \n\r");

			cprintf ("Для продолжения нажмите пробел.");

		getch();

		gotoxy(1,3); /*возврат курсора под шапку табл.*/

		}

		else

		;

	}

}

Пример исполнения:










НАЧАЛО

dx=6.28/100

x=0

Очистка экрана.

Вывод шапки таблицы

n=1

n<=100

КОНЕЦ

n%20==0

x=x+dx

n++

n%100==0

Вывод сообшения

«Расчет закончен»

Вывод сообщения 

«Для продолжения нажать пробел»

gotoxy(1,3)

нет

да

Вывод значений n,x,y

y=sin(x)+sin(3*x)/3

нет

нет

да

да

Ожидание нажатия клавиши

Алгоритм:


6. Привести краткое описание указанного элемента языка Си: функции преобразования чисел в строки и наоборот, синтаксис, примеры использования



Стандартные функции преобразования данных.

Функции преобразования строки-символов в число.

double atof(char *string); (stdlib.h)

int atoi(char *string); (stdlib.h)

long atol(char *string); (stdlib.h)

Функция atof преобразует строку в вещественное число двойной точности.

Функция atoi преобразует строку в целое число.

Функция atol преобразует строку в длинное целое число.

Во всех функциях строка string является последовательностью символов, которая может интерпретироваться, как число. Чтение символов из строки происходит до тех пор, пока не будет встречен символ, который не может быть распознан, как часть числа, например ‘\0’.

Для функции atof строка может иметь следующий вид:

“[пробелы][знак][цифры][.цифры][e[знак]цифры]”

Для функций atoi и atoll строка может иметь следующий вид:

“[пробелы][знак][цифры]”

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

Функции strtol(), strtoul(), позволяют преобразовывать строки в различные системы счисления.

Функции преобразования вещественных чисел в строку символов.

char *ecvt(double value,int ndigits, int *decptr,int *signptr); (stdlib.h)

char *fcvt(double value,int ndec, int *decptr,int *signptr); (stdlib.h)

char *gcvt(double value,int ndec, char *buffer); (stdlib.h)

Эти функции применяют для вывода значений переменных в графическом режиме.



Функция ecvt

Преобразовывает число с плавающей точкой двойной точности в строку символов. При этом функция возвращает указатель на строку, а строка содержит ndigits цифр числа value, и нулевой байт. Если цифр в числе value больше, чем указано параметром ndigits, то отсекаются младшие разряды. Если цифр в числе value меньше, чем указано в параметре ndigits, число дополняется нулями. Возвращаемая строка содержит только цифры. Позиции точки и знака стоят на 3 и 4 местах, *decptr указывает на целое число, значение которого определяет позицию десятичной точки. '\0', или отрицательное значение говорят о том, что десятичная точка стоит слева от первой цифры, например:



Число

Правильное значение decptr

0.0007568905123

-3

0.7568905123

0

75.68905123

2



Если signptr==0, то число положительное, при остальных значениях – отрицательное.

Число значащих цифр после запятой для формата float – 6, для формата double – 16.

Функция fcvt

Работает так же, как и предыдущая функция, но параметр ndec определяет не общее количество цифр в строке, а количество цифр после десятичной точки. Если число цифр после десятичной точки в числе value больше, чем параметр ndec, то число округляется. Если меньше, то строка дополняется нулями.

Функция gcvt

Функция преобразует число в строку в определённом формате, помещая ”знак”, и десятичную точку. Может применяться для разметки осей координат. Преобразует число value в строку символов по адресу *buffer, и возвращает указатель на ту же строку. Записывает в строку все цифры. Размер строки *buffer должен быть достаточно большим. Пытается преобразовать строку в f-формате(%f). Если места в строке buffer будет недостаточно, функция преобразует строку в е-формат (%е). Незначащие нули при преобразовании подавляются.

Функции преобразования целых чисел в строку символов.

char *itoa (int value, char *string, int radix) (stdlib.h)

char *ltoa (long int value, char *string, int radix) (stdlib.h)

char *ultoa (unsigned long int value, char *string, int radix) (stdlib.h)

Функция itoa

Функция преобразует число целого типа int и воpвращает строку string. Параметр radix определяет систему счисления для представления результата. radix может изменяться от 2 до 36. Если value отрицательно, а radix равен 10, то первый знак “-”.

Функция ltoa

Функция работает так же, как и itoa, но преобразует в строку число типа long int – длинное целое.

Функция ultoa

Функция работает так же, как и itoa, но преобразует в строку число типа unsigned long int – беззнаковое длинное целое.

	Пример:	

#include <stdio.h>

#include <stlib.h>

void main()

{

int value=5382;

char string[10];

itoa(value,string,10);

printf(“Строка string: %s”,string);

value=37;

itoa(value,string,2);

printf(“Строка string: %s”,string);

}

Результат работы программы:

Строка string: 5382

Строка string: 100101



8. Написать программу БЕГУЩАЯ СТРОКА в текстовом режиме экрана. Заданная строка появляется слева в центре экрана и перемещается направо, после того, как она скроется справа, она вновь появляется слева



Программа:

/*Программа БЕГУЩАЯ СТРОКА*/



#include <conio.h>

#include <stdio.h>

	main()

{

char ch,runne_line[41]=" 1234567890123456789012345678901234567890";

		 /*^-для затирания последнего символа в Б.С.*/

char line[80]=" ";

int i=0,x=40,c,z,j,t1,t=30000;

		/*i,c - количество символов в строке

		 *x,z - указатель на элемент массивов line и runne_line

		 *t,t1 -задержка времени в тиках.*/

 clrscr();

 printf("\n\t\tВведите заданную строку.\n");

 printf("\tСтроку, не более 40 символов, закончить \"Enter\".\n");

while((ch=getch())!=0x0d)

{

	i++;

		if(i==41) /* 41-й символ не вводим*/

		{

		gotoxy(8,5);

		cprintf("Символов больше 40, жми \"Enter\".\a");

		i--;

		}

		else

		{

		runne_line[i]=ch; /*начинаем заполнять с 1-го элемента не с 0-го*/

		gotoxy((i+1),4);

		cprintf("%c",ch);

		}

 }

gotoxy(1,5); /*Для затирки предыд. сообщ. если оно есть.*/

 cprintf(" \"Y\"-Запустить БЕГУЩУЮ СТРОКУ.");

 gotoxy(11,6);

 cprintf("\"Пробел\"-Выйти из программы.");



	switch(ch=getch())

	{

	 case 'Y':/*во всех регистрах и раскладках*/

	 case 'y':

	 case 'н':

	 case 'Н':

		gotoxy(1,5);

		cprintf(" ");



		/* определяем следующий элемент в выводимом массиве line*/

		for(x=40;x<82;x++) /* цикл бесконечный*/

		{

		/*Если нажата любая клавиша выйти из цикла*/

		 if(kbhit()) break;

			if(x>79) /* следующий д.б. <= 79*/

			x=0; /* иначе = 0*/

			z=x;

/*переписываем из заданного в выводимый*/	

for(c=i;c>=0;c--,z--)

			{

			if(z<0)

			z=79;

				if(z>79)

				z=0;

				/*выводим на экран*/

				line[z]=runne_line[c];

				for(j=80;j>=1;j--)

				{

				gotoxy(j,24);

				cprintf("%c",line[(j-1)]);

				/*сделать задержку*/

					for(t1=t;t1!=0;t1--);

				}

			 }



		 }

	 break;

	 default:;

	 }

}

Пример исполнения:






Алгоритм:





cprintf("Символов больше 40”);

НАЧАЛО

Описание переменных

i,c - количество символов в строке массивов

x,z - указатель на элемент массивов line и runne_line

t,t1 -задержка времени. 

line и runne_line-выводимый и вводимый массив

Очистка экрана



1

while((ch=getch())!=0x0d)



ДА

НЕТ

i++

if(i==41)

ДА

НЕТ

runne_line[i]=ch; 

cprintf("%c",ch);



i--

cprintf("\"Y\"-Запустить БЕГУЩУЮ СТРОКУ.") 

cprintf("\"Пробел\"-Выйти из программы.");

3

1

switch(ch=getch());

case 'Y':

ДА

НЕТ

КОНЕЦ

2

x=40;




3

x<82

if(kbhit())

if(x>79)  

z=x;

x=0;

c>=0;

z<0

z=79;

z>79

z=0;

НЕТ

ДА

2

НЕТ

НЕТ

ДА

НЕТ

ДА

ДА

НЕТ

НЕТ

ДА

line[z]=runne_line[c];

j>=1

cprintf("%c",line[(j-1)]);

t1!=0;

c=i;

j=80;

j--;

ДА

НЕТ

t1=t;

t1--;

ДА

НЕТ

c--; z--;

ДА


Работа над ошибками:



1. Расчет определителя 2го порядка по введенным четырем целым числам.

Программа:

 /*Расчет определителя 2го порядка по введеным 4-м целым числам*/



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

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



main () /*главная функция*/

{

 int a[2][2],i,j,b,n=2;		 /*объявление переменных*

						 *i-строка, j-столбец, n-порядок 

 определителя*/



 clrscr (); /*очистка экрана*/

printf ("\n\n\t\tРасчет определителя %d-го порядка\n",n);

	 /*ввод значений*/

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

	{ 

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

		{

		cprintf ("Введите %d-й элемент %d-й строки - ",j+1,i+1);

		scanf ("%d",&a[j][i]);

		}

	}

/*считаем определитель*/

b=a[0][0]*a[1][1]-a[1][0]*a[0][1];

/*выводим на экран*/

/*clrscr();*/

printf ("\n\t|%-3d %3d|",a[0][0],a[0][1]);

printf ("\n\t| | = %d",b);

printf ("\n\t|%-3d %3d|",a[1][0],a[1][1]);

getch (); /*ожидание нажатия любой клавиши*/

}



Пример исполнения:






Алгоритм: 





начало

объявление переменных       i-строка, j-столбец,

n-порядок определителя 

                            

i < n

j < n

Ввод aij

j++

i++

b=a[0][0]*a[1][1]-a[1][0]*a[0][1]

Вывод значения определителя

Ожидание нажатия клавиши

конец

ДА

ДА

НЕТ

НЕТ



3.

ms20, ms21, ms045 получены следующим способом:

1) 00000000000010000000000000000000(2)=524288(10)= ms20

 ^20й бит целого длинного беззнакового числа.

2) 00000000000100000000000000000000(2)=1048576(10)= ms21

 ^21й бит целого длинного беззнакового числа.

3) 11111111111111111111111111100111(2)=4294967271(10)= ms045 или,

 01111111111111111111111111100111(2)=2147483623(10)= ms045

 ^32 бит –знак числа в длинном целом. В данном примере можно не учитывать, что не скажется на результате, так как нужно определить 20 и21 бит и сбросить 4 и 5. Необходимо лишь, чтобы вводимое число было в диапазоне от 0 до 01111111111111111111111111111111(2)=2147483647(10) и проверить правильность ввода.



У меня в компьютере получается так:







даже если 

scanf ("%ld",&a);

заменить на 

scanf ("%u",&a);

строка 12 и соответственно форматный вывод (строки 18, 21, 26, 29, 32).

Такое же непонятное и с 11111111111111111111111111100111(2)=4294967271(10)= ms045.

4.

dx=6,28/99 т.к. 99 шагов между точками таблицы. Пример выполнения программы выглядит так: 











8.

1 char ch,runne_line[41]=" 1234567890123456789012345678901234567890";

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

1234567890… в процессе отладки видно где какое знакоместо. В принципе можно убрать, но и так не мешает. Эту строку можно заменить на следующее:

 char ch,runne_line[41], runne_line[0]=’ ‘:

2 Посимвольный ввод организовал по следующим причинам.

Подсчет количества символов в бегущей строке. Необходим для того чтобы не делать лишних циклов при перезаписи из runne_line в line. Можно воспользоваться strlen (s), но тогда нужно #include<string.h> , что увеличит объем занимаемой памяти. К тому же функция strlen (s) не учитывает пробелы (пробел – ограничитель длинны строки). Поэтому невозможно организовать бегущую строку из двух и более слов. Посимвольный вывод для того чтобы обеспечить плавность сдвига строки.

Без посимвольного ввода программа выглядит так:

		/*Программа БЕГУЩАЯ СТРОКА*/

#include <conio.h>

#include <stdio.h>

#include <string.h>

	main()

{

char ch,runne_line[41];

char line[80]=" ";

int i,x=40,c,z,j;

long int t1,t=232000;

		/*i,c - количество символов в строке

		 *x,z - указатель на элемент массивов line и runne_line

		 *t,t1 -задержка времени в тиках.*/

clrscr();

printf("\n\t\tВведите заданную строку.\n");

printf("\tСтроку, не более 40 символов, закончить \"Enter\".\n");

scanf("%s",runne_line); /*вводим строку которая будет бежать*/

 for(i=40;i>=0;i--) /* для освобождения [0] и записи в него ' '*/

 {

 runne_line[i+1]=runne_line[i];

 }

 runne_line[0]=' ';

 i=strlen(runne_line);

 gotoxy(1,5);

 cprintf(" \"Y\"-Запустить БЕГУЩУЮ СТРОКУ.");

 gotoxy(11,6);

 cprintf("\"Пробел\"-Выйти из программы.");

	switch(ch=getch())

	{

	 case 'Y':/*во всех регистрах и раскладках*/

	 case 'y':

	 case 'н':

	 case 'Н':

			gotoxy(1,5);

			cprintf(" ");



		/* определяем следующий элемент в выводимом массиве line*/

		for(x=40;x<82;x++) /* цикл бесконечный*/

		{

		/*Если нажата любая клавиша выйти из цикла*/

			if(kbhit()) break;

				if(x>79) /* следующий д.б. <= 79*/

				x=0; /* иначе = 0*/

				z=x;

				/*переписываем из заданного в выводимый*/

					for(c=i;c>=0;c--,z--)

					{

						 if(z<0)

						 z=79;

						 if(z>79)

						 z=0;

						line[z]=runne_line[c];

						/*выводим на экран*/

						for(j=80;j>=1;j--)

						{

						gotoxy(j,24);

						cprintf("%c",line[(j-1)]);

						 /*сделать задержку*/

						 for(t1=t;t1!=0;t1--);

						}

					}



		}

	 break;

	 default:;

	}

}




Вывод сообщения «Y-Запустить БЕГУЩУЮ СТРОКУ.» 

                «Пробел-Выйти из программы.»

1

ch

Ввод символа  с клавиатуры в переменную ch

x=40;

КОНЕЦ

2

«Н»

«Y»

«н»

«y»

x<82

Нажата ли клавиша 

x>79

z=x;

x=0;

c>=0;

z<0

z=79;

z>79

z=0;

НЕТ

ДА

2

НЕТ

НЕТ

ДА

НЕТ

ДА

ДА

НЕТ

НЕТ

ДА

Переписать из массива runne_line[c] в line[z]

c=i;

j=80;

c--; z--;

ДА



4

3

Вывести на экран из массива line элемент (j-1)

t1!=0;

j--;

ДА

t1=t;

t1--;

ДА

НЕТ

j>=1

НЕТ

3

4