Строка 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:;
}
}
Пример исполнения:
Алгоритм:
Работа над ошибками:
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 (); /*ожидание нажатия любой клавиши*/
}
Пример исполнения:
Алгоритм:
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:;
}
}