Консультация № 177700
06.04.2010, 11:39
43.65 руб.
0 13 2
Доброго времени суток дорогие эксперты!

требуется решить 3ку задачек не сложных на С.

1)Дана вещественная последовательность a1, a2,... , an. Определить максимальное количество идущих подряд положительных членов последовательности. Вывести найденный фрагмент.
2)Дано целое неотрицательное число <2^16. Получить число перестановкой битов каждого байта данного числа в обратном порядке.
3)Строку, представляющую собой запись вещественного числа в форме с фиксированной точкой, преобразовать в строку, представляющую собой запись того же числа в форме с плавающей точкой в нормализованном виде.

Дополнения: 1) используется стандартный Turbo c
2)система windows vista home premium

Обсуждение

Неизвестный
06.04.2010, 19:14
общий
Юдин Евгений Сергеевич:
Вообще-то не следует задавать несколько вопросов в одном.
Неизвестный
07.04.2010, 02:40
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.

надеюсь всё будет правильно.А в третей задаче не понимаю что такое в "нормализованом виде".


Приложение:
//первая задача

int a=0,b=0,c;
int mass[20]={-9,2,1,34,5,6,2,4,-6,34,5,-6,3,-5,2,4,2,4,6,7};
for(int i=0;i<20;i++){
if(mass[i] > 0){a++;}
else a=0;

if(a > b){b=a;c=i+1;}}
for(int j=c-1;j>=(c-b);j--){
cout<<mass[j]<<"\n";}
cout<<"Maksimalnoje Kolicestvo "<<b<<"\n";

//--------------------------------------------------------

//вторая задача
short a=144;
do{
if(fmod(a,2) == 0)
cout<<0;
else cout<<1;
a=a/2;
}
while(a != 0);
//---------------------------------------
Неизвестный
08.04.2010, 14:26
общий
Valeraja:
используется стандартный Turbo c

Это разве не подразумевает, что программа должна быть на С, а не С++, а потоковый ввод/вывод и конструкции с объявлением переменной в for, мне кажется, к нему не относятся?..
Неизвестный
08.04.2010, 15:24
общий
спасибо что ответили на задачи) следующий раз учту это.

программа должна быть на си Valeraja... просто до с++ мы не дошли а такие задачи дают уже

Неизвестный
08.04.2010, 16:51
общий
А что мешает вместо cout использовать printf , а переменую обьявить не в операторе for?Или в турбо си этого делать нельзя?
Неизвестный
08.04.2010, 17:48
общий
Valeraja:
Понятно, что можно, но надо учитывать, что, во-первых, задавая такой вопрос, человек может этих вещей не понимать, а во-вторых, ответ должен всегда соответствовать вопросу, если же есть какие-то сомнения, надо в ответе на них указать.
давно
Академик
320937
2216
10.04.2010, 18:24
общий
Юдин Евгений Сергеевич:
Добрый вечер! Ответ на первую задачу. Проверено в TurboC 2.0 и Code::Blocks/G++

Код:

/* 1)Дана вещественная последовательность a1, a2,... , an.
Определить максимальное количество идущих подряд положительных
членов последовательности. Вывести найденный фрагмент.
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* в этой реализации под последовательностью понимается массив */
enum {MAX_SIZE=100}; /* максимальная длина последовательности */
int in_positives; /* признак: в подпоследовательности? */
int size; /* используемая длина массива */
int i; /* номер текущего элемента последовательности */
int first; /* номер первого элемента максимальной подпоследовательности */
int curr_len; /* текущая длина подпоследовательности */
int max_len; /* максимальная длина подпоследовательности */
float v[MAX_SIZE];

size = 0;
/* ввод данных */
printf("Вводите данные, CTRL-Z для окончания\n");
printf("v[%d]=",size);
for(;size<MAX_SIZE && scanf("%f", &v[size])!= EOF;)
{
size++;
printf("v[%d]=",size);
};

if (size==0)
printf("Последовательность пуста\n");
else
{
in_positives = 0;
max_len = 0;
curr_len = 0;
for (i=0; i<size; i++)
{
if (v[i]<=0 && in_positives)
{
in_positives = 0;
if (curr_len > max_len)
{
max_len = curr_len;
first = i-max_len;
}
curr_len=0;
}
else if (v[i]>0)
{
in_positives = 1;
curr_len++;
}
}
if (in_positives && curr_len>max_len)
{
max_len = curr_len;
first = i-max_len;
}
printf("Наибольшая подпоследовательность положительных элементов ");
for (i=first; i<first+max_len; i++)
printf("%4.2f;", v[i]);
printf("\n");
printf("Ее длина %d\n", max_len);
}

system("Pause");
return 0;
}

давно
Академик
320937
2216
12.04.2010, 09:37
общий
Юдин Евгений Сергеевич:
Код:

/*
2)Дано целое неотрицательное число <2^16. Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Задача решается перестановкой "по месту"
*/
#include <stdio.h>
#include <stdlib.h>

void print_binary(const unsigned short val);

int main()
{
int i;
int num;
int len = sizeof(unsigned short)*8;
int hi, lo; /* левый и правый биты в цикле */

printf("num=");
scanf("%u", &num);
printf("Введенное число\n");
print_binary(num);

for (i=0; i<len/2; i++)
{
hi = (num & (1 << (len-i-1)))!=0; /* левый бит */
lo = (num & (1 << i))!=0; /* правый бит */

/* если установлен левый бит, установить правый бит,
иначе сбросить правый бит */
num = (hi ? num | 1<<i : num & ~(1<<i));

/* если установлен правый бит, установить левый бит,
иначе сбросить левый бит */
num = (lo ? num | 1<<(len-i-1) : num & ~(1<<(len-i-1)));
}
printf("Число с переставленными битами\n");
print_binary(num);

system("pause");
return 0;
}

void print_binary(const unsigned short val)
/* печать беззнакового двухбайтового целого в битовой форме */
{
int i;
int len = sizeof(unsigned short)*8; /* бит в числе */

for (i=len-1; i>=0; i--)
putchar(val & (1 << i) ? '1' : '0');
putchar('\n');
}

давно
Академик
320937
2216
12.04.2010, 10:57
общий
Юдин Евгений Сергеевич:
Код:

/*
2)Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого байта данного числа в обратном порядке.
Перестановка битов каждого байта в отдельности. Решение с использованием другого числа.
*/
#include <stdio.h>
#include <stdlib.h>

void print_binary(const unsigned short val);
unsigned char reverse(const unsigned char val);

int main()
{
int num1, num2;
unsigned char ch;
unsigned char hi, lo;

printf("num1=");
scanf("%u", &num1);
printf("Введенное число\n");
print_binary(num1);

hi = 0xFF & (num1 >> 8); /* левый байт */
lo = 0xFF & num1; /* правый байт */

printf("Число с переставленными битами\n");
num2 = (reverse(hi)<<8) | reverse(lo);
print_binary(num2);

system("pause");
return 0;
}

void print_binary(const unsigned short val)
/* печать беззнакового двухбайтового целого в битовой форме */
{
int i;
int len = sizeof(unsigned short)*8; /* бит в числе */

for (i=len-1; i>=0; i--)
putchar(val & (1 << i) ? '1' : '0');
putchar('\n');
}

unsigned char reverse(const unsigned char val)
{
/* Перестановка битов байта*/
int i;
unsigned char res;

res = val & 1;
for (i=1; i<8; i++)
{
res = (res << 1) | ((val >> i) & 1);
}
return res;
}

давно
Академик
320937
2216
12.04.2010, 12:33
общий
Юдин Евгений Сергеевич:
Ответ на 3-ю задачу.
Код:

/*
3)Строку, представляющую собой запись вещественного числа в форме с
фиксированной точкой, преобразовать в строку, представляющую собой
запись того же числа в форме с плавающей точкой в нормализованном виде.
*/
/*
http://www.tspu.tula.ru/ivt/old_site/umr/timoi/solovieva/Computer/chisl_vpl.htm
Поэтому договорились для выделения единственного варианта записи
числа считать, что мантисса всегда меньше единицы, а ее первый
разряд содержит отличную от нуля цифру
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

int main()
{
char s1[80];
char s2[80];

int i,j;
int power;

gets(s1);
i=0;
j=0;
while (s1[i]!='\0' && s1[i]!='-' && s1[i]!= '.' && !isdigit(s1[i]))
i++;
if (s1[i]=='\0')
{
printf("Нет числа\n");
getch();
return 0;
}

if (s1[i]=='-')
{
s2[j++]='-';
i++;
}

if (s1[i]!='.' && !isdigit(s1[i]))
{
printf("Нет числа\n");
getch();
return 0;
}

s2[j++]='0';
s2[j++]='.';
power=0;
while (s1[i]!='\0' && s1[i]=='0')
i++;
while (s1[i]!='\0' && isdigit(s1[i]))
{
s2[j++]=s1[i++];
power++;
}
if (s1[i]=='.')
i++;

if (power==0)
while (s1[i]!='\0' && s1[i]=='0')
{
power--;
i++;
}

while (s1[i]!='\0' && isdigit(s1[i]))
s2[j++]=s1[i++];

s2[j++]='e';
s2[j++]=(power>=0 ? '+': '-');
if (power<0) power=-power;
s2[j++]=power %10 +'0';
while (power >= 10)
{
power/=10;
s2[j]=s2[j-1];
s2[j-1]='0'+power % 10;
j++;
}
s2[j]='\0';

puts(s2);
return 0;
}

давно
Академик
320937
2216
12.04.2010, 12:40
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич. Ответы в приложении. Задача 2 допускает две трактовки: перестановка всех битов и перестановка всех битов каждого байта в отдельности. Тестировалось в TurboC 2.0 и Code::Blocks/G++. Пожалуйста, вопросы, критику.

Приложение:
/* 1)Дана вещественная последовательность a1, a2,... , an.
Определить максимальное количество идущих подряд положительных
членов последовательности. Вывести найденный фрагмент.
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* в этой реализации под последовательностью понимается массив */
enum {MAX_SIZE=100}; /* максимальная длина последовательности */
int in_positives; /* признак: в подпоследовательности? */
int size; /* используемая длина массива */
int i; /* номер текущего элемента последовательности */
int first; /* номер первого элемента максимальной подпоследовательности */
int curr_len; /* текущая длина подпоследовательности */
int max_len; /* максимальная длина подпоследовательности */
float v[MAX_SIZE];

size = 0;
/* ввод данных */
printf("Вводите данные, CTRL-Z для окончания\n");
printf("v[%d]=",size);
for(;size<MAX_SIZE && scanf("%f", &v[size])!= EOF;)
{
size++;
printf("v[%d]=",size);
};

if (size==0)
printf("Последовательность пуста\n");
else
{
in_positives = 0;
max_len = 0;
curr_len = 0;
for (i=0; i<size; i++)
{
if (v[i]<=0 && in_positives)
{
in_positives = 0;
if (curr_len > max_len)
{
max_len = curr_len;
first = i-max_len;
}
curr_len=0;
}
else if (v[i]>0)
{
in_positives = 1;
curr_len++;
}
}
if (in_positives && curr_len>max_len)
{
max_len = curr_len;
first = i-max_len;
}
printf("Наибольшая подпоследовательность положительных элементов ");
for (i=first; i<first+max_len; i++)
printf("%4.2f;", v[i]);
printf("\n");
printf("Ее длина %d\n", max_len);
}

system("Pause");
return 0;
}


/* ==============================
2)Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант 1
*/
#include <stdio.h>
#include <stdlib.h>

void print_binary(const unsigned short val);

int main()
{
int i;
int num;
int len = sizeof(unsigned short)*8;
int hi, lo; /* левый и правый биты в цикле */

printf("num=");
scanf("%u", &num);
printf("Введенное число\n");
print_binary(num);

for (i=0; i<len/2; i++)
{
hi = (num & (1 << (len-i-1)))!=0; /* левый бит */
lo = (num & (1 << i))!=0; /* правый бит */

/* если установлен левый бит, установить правый бит,
иначе сбросить правый бит */
num = (hi ? num | 1<<i : num & ~(1<<i));

/* если установлен правый бит, установить левый бит,
иначе сбросить левый бит */
num = (lo ? num | 1<<(len-i-1) : num & ~(1<<(len-i-1)));
}
printf("Число с переставленными битами\n");
print_binary(num);

system("pause");
return 0;
}

void print_binary(const unsigned short val)
/* печать беззнакового двухбайтового целого в битовой форме */
{
int i;
int len = sizeof(unsigned short)*8; /* бит в числе */

for (i=len-1; i>=0; i--)
putchar(val & (1 << i) ? '1' : '0');
putchar('\n');
}

/* ===============================
2)Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант2
*/
#include <stdio.h>
#include <stdlib.h>

void print_binary(const unsigned short val);
unsigned char reverse(const unsigned char val);

int main()
{
int num1, num2;
unsigned char ch;
unsigned char hi, lo;

printf("num1=");
scanf("%u", &num1);
printf("Введенное число\n");
print_binary(num1);

hi = 0xFF & (num1 >> 8); /* левый байт */
lo = 0xFF & num1; /* правый байт */

printf("Число с переставленными битами\n");
num2 = (reverse(hi)<<8) | reverse(lo);
print_binary(num2);

system("pause");
return 0;
}

void print_binary(const unsigned short val)
/* печать беззнакового двухбайтового целого в битовой форме */
{
int i;
int len = sizeof(unsigned short)*8; /* бит в числе */

for (i=len-1; i>=0; i--)
putchar(val & (1 << i) ? '1' : '0');
putchar('\n');
}

unsigned char reverse(const unsigned char val)
{
/* Перестановка битов байта*/
int i;
unsigned char res;

res = val & 1;
for (i=1; i<8; i++)
{
res = (res << 1) | ((val >> i) & 1);
}
return res;
}


/*====================== ==============================
3)Строку, представляющую собой запись вещественного числа в форме с
фиксированной точкой, преобразовать в строку, представляющую собой
запись того же числа в форме с плавающей точкой в нормализованном виде.
*/
/*
http://www.tspu.tula.ru/ivt/old_site/umr/timoi/solovieva/Computer/chisl_vpl.htm
Поэтому договорились для выделения единственного варианта записи
числа считать, что мантисса всегда меньше единицы, а ее первый
разряд содержит отличную от нуля цифру
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

int main()
{
char s1[80];
char s2[80];

int i,j;
int power;

gets(s1);
i=0;
j=0;
while (s1[i]!='\0' && s1[i]!='-' && s1[i]!= '.' && !isdigit(s1[i]))
i++;
if (s1[i]=='\0')
{
printf("Нет числа\n");
getch();
return 0;
}

if (s1[i]=='-')
{
s2[j++]='-';
i++;
}

if (s1[i]!='.' && !isdigit(s1[i]))
{
printf("Нет числа\n");
getch();
return 0;
}

s2[j++]='0';
s2[j++]='.';
power=0;
while (s1[i]!='\0' && s1[i]=='0')
i++;
while (s1[i]!='\0' && isdigit(s1[i]))
{
s2[j++]=s1[i++];
power++;
}
if (s1[i]=='.')
i++;

if (power==0)
while (s1[i]!='\0' && s1[i]=='0')
{
power--;
i++;
}

while (s1[i]!='\0' && isdigit(s1[i]))
s2[j++]=s1[i++];

s2[j++]='e';
s2[j++]=(power>=0 ? '+': '-');
if (power<0) power=-power;
s2[j++]=power %10 +'0';
while (power >= 10)
{
power/=10;
s2[j]=s2[j-1];
s2[j-1]='0'+power % 10;
j++;
}
s2[j]='\0';

puts(s2);
return 0;
}
Неизвестный
17.04.2010, 02:26
общий
огромное спасибо всем кто поработал над всеми этими задачами... в частности Lamed .... премного благодарен дорогие эксперты
давно
Академик
320937
2216
17.04.2010, 06:52
общий
Юдин Евгений Сергеевич:
Удачи!
Форма ответа