Смекни!
smekni.com

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

Строка 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("&bsol;n&bsol;t&bsol;tВведите заданную строку.&bsol;n");

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

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

{

i++;

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

{

gotoxy(8,5);

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

i--;

}

else

{

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

gotoxy((i+1),4);

cprintf("%c",ch);

}

}

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

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

gotoxy(11,6);

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

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:;

}

}

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


Алгоритм:



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

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 ("&bsol;n&bsol;n&bsol;t&bsol;tРасчет определителя %d-го порядка&bsol;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 ("&bsol;n&bsol;t|%-3d %3d|",a[0][0],a[0][1]);

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

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

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

}

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


Алгоритм:

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("&bsol;n&bsol;t&bsol;tВведите заданную строку.&bsol;n");

printf("&bsol;tСтроку, не более 40 символов, закончить &bsol;"Enter&bsol;".&bsol;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(" &bsol;"Y&bsol;"-Запустить БЕГУЩУЮ СТРОКУ.");

gotoxy(11,6);

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

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:;

}

}