Использовать функцию ввода двоичного вектора

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

интервал в булевом пространстве размерности N задан своими максимальными и минимальными элементам. Вывести соответствующий интервалу троичный вектор ( 1011, 1000-->10--).

Код: Выделить всё

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;
unsigned int vvod(char s[32], int n)
{
	unsigned int b = 0;
	n = strlen(s);
	gets_s :( s);
	for (int i = 0; i < n; i++)
	{
		if (s[i] == '1') b = b | (1 << (n - i - 1));
			
	}
	return b;
}
int main()
{
	 int n;
	char str1[32];
	
	cin >> str1;
	char str2[32];
	
	cin >> str2;
	n = strlen(str1);
	
	bool fl = true;
	for (int i = 0; i < n && fl; i++)
		fl = fl && (str1[i] >= str2[i]);
	if (fl)
		for (int i = 0; i < n; i++)
		cout  << (str1[i] == str2[i] ? str1[i] : '-');	
	else
		cout << "ne interval\n";
    return 0;
}
нужно было сделать , через функцию ввода двоичного вектора , но у меня получается , что она вообще не задействована
помогите исправить
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

- Функция vvod написано достаточно криво (мало того, что алгоритм перевода усложнен без надобности, так ещё есть подозрение, что функция вообще не компилируется).

- Если вводить чисто через эту функцию, то формирование третьего элемента вектора будет более сложным, чем при строковых входных данных.

- Из всего вышеперечисленного возникает резонный вопрос: зачем вообще использовать эту функцию, если она усложняет как ввод, так и дальнейшую работу с числами?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

Romeo писал(а):- Функция vvod написано достаточно криво (мало того, что алгоритм перевода усложнен без надобности, так ещё есть подозрение, что функция вообще не компилируется).

- Если вводить чисто через эту функцию, то формирование третьего элемента вектора будет более сложным, чем при строковых входных данных.

- Из всего вышеперечисленного возникает резонный вопрос: зачем вообще использовать эту функцию, если она усложняет как ввод, так и дальнейшую работу с числами?

из-за того , что преподу нужно именно , через функцию ввода , без нее не принимает
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Хорошо, тогда вопросы по функции vvod.

- Зачем в неё передаётся параметр s, а потом он же читает с помощью gets?
- Зачем в неё передаётся параметр n, а потом его значение перетирается результатом вызова функции strlen?
- Зачем используется такой сложный алгоритм перевода, если достаточно делать сдвиг всего результата на каждой итерации, что резко упростит формулу,
- Как быть с ошибкой компиляции gets_s:(s)?

Как минимум из-за последнего пункта функцию нельзя использовать в этой программе. Я очень сомневаюсь, что преподаватель может настаивать на том, чтобы студент использовал функцию, которая не компилируется.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

Romeo писал(а):Хорошо, тогда вопросы по функции vvod.

- Зачем в неё передаётся параметр s, а потом он же читает с помощью gets?
- Зачем в неё передаётся параметр n, а потом его значение перетирается результатом вызова функции strlen?
- Зачем используется такой сложный алгоритм перевода, если достаточно делать сдвиг всего результата на каждой итерации, что резко упростит формулу,
- Как быть с ошибкой компиляции gets_s :( s)?

Как минимум из-за последнего пункта функцию нельзя использовать в этой программе. Я очень сомневаюсь, что преподаватель может настаивать на том, чтобы студент использовал функцию, которая не компилируется.
это был первоначальный вариант который давал препод , я думаю , что

Код: Выделить всё

unsigned int vvod(char s[32],int n)
{unsigned int b=0; 
for(int i=0;i<n;i++)
if(s[i]=='1') b=b|(1«(n-i-1));
return b;
это функция , а остальное предназначалось самой проге.
А насчет алгоритма , что дали тем и пользуюсь.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну хорошо. Можно тогда сделать вот так: считываешь два числа с помощью vvod, потом переводишь их в строки и оставшуюся часть программы, которая работает со строками, оставляешь, как есть :)

Написать функцию, которая из числа делает строку, осилишь?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

Romeo писал(а):Ну хорошо. Можно тогда сделать вот так: считываешь два числа с помощью vvod, потом переводишь их в строки и оставшуюся часть программы, которая работает со строками, оставляешь, как есть :)

Написать функцию, которая из числа делает строку, осилишь?

что-то типо ?

Код: Выделить всё

void main() {
	char str[1];
	int number = 123;
	cout<<(str, number);
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Нет, cout считывает данные с клавиатуры, так что не имеет никакого отношения к переводу. Более того, то, что ты написал, вообще не скомпилируется.

Нужно написать алгоритм, который проанализирует биты числа и построит по ним строку. Перевод из строки в число уже сделан в функции vvod, а нам нужно выполнить обратное преобразование.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Как минимум из-за последнего пункта функцию нельзя использовать в этой программе. Я очень сомневаюсь, что преподаватель может настаивать на том, чтобы студент использовал функцию, которая не компилируется.
Задание может быть и на поиск преднамеренной ошибки.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

Romeo писал(а):Нет, cout считывает данные с клавиатуры, так что не имеет никакого отношения к переводу. Более того, то, что ты написал, вообще не скомпилируется.

Нужно написать алгоритм, который проанализирует биты числа и построит по ним строку. Перевод из строки в число уже сделан в функции vvod, а нам нужно выполнить обратное преобразование.
не могу догнать как перевести , если не cout , sprintf не работает
Ответить