Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2008, 16:33   #1
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию С++.Задача на строки.Помогите найти ошибки

Задача такая :
Ввести строку, в которой есть bin код числа ( с возможными пропусками ). Определить и напечатать значение числа в 10-й системе. Включить то, что в строке будет введеныи другие символы.
У меня получилось примерно вот что: правда в институте два часа назад почти все шло,а дома вообще делать ничего не хочет. Помогите пожалуйста нати ошибки, а то плакала моя стипуха

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define size 60
void main ()
Код:
{   char str[size],newstr[size-1],*q=newstr;
     int i,j=0,bin,sum;
     clrscr();
printf("\t=*= Vvedit dvijkovuj kod chusla: =*=\n");
scanf("%s",&str); 
       for(i=0; i<size; i++) {
                if (str[i]=='1' || str[i]=='0')
	              newstr[j]=str[i];
	              j++;
       }
  bin= atoi (q);
  sum=0; і=0;
  while (bin!=0) {
	sum+=(bin%10)*pow(2,i);
	bin/=10;
	i++;
  }
    
  printf ("\t\t=*=Desjatkova Sch=*=\n");
  printf ("%d",sum);
  getch();
  }
Бог умер. Воскрес и мстит.

Последний раз редактировалось NamelessEndless; 26.05.2008 в 17:12.
NamelessEndless вне форума Ответить с цитированием
Старый 26.05.2008, 16:52   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Где инициализируется переменная j? Зачем здесь atoi, если задание состоит в том, чтобы реализовать именно её и с чего Вы взяли, что она превратит в нужное число двоичную, а не десятичную его запись? Зачем, наконец, pow, если возведение двойки в степень реализуется сдвигом? И оформляйте листинги тэгом CODE.
B_N вне форума Ответить с цитированием
Старый 26.05.2008, 17:08   #3
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

Уфф, вы меня так вопросами умными не заваливайте,сего лишь эту С++ месяц учу. )))
1)Проинициализировала вроде...Программа сама запускается, но дома вообще ничего не выводит,все виснет.На другом компе переводило, но не все.
2) atoi - преобразует строкув знаение типа int. А если я не переведу, то как я потом в 10-й код буду переводить?О_о..
3)в сдвигах я путаюсь, а с pow легче.
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 26.05.2008, 17:17   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

atoi переводит в число десятичную запись, а у Вас - двоичная. Уберите её, не нужна она здесь. А число образуется последовательной выборкой нулей и единиц из того массива, что Вы заполнили и возведением их (за вычетом символа '0', разумеется) в степень (сразу говорю, это - самый неоптимальный вариант)
B_N вне форума Ответить с цитированием
Старый 26.05.2008, 17:25   #5
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
atoi переводит в число десятичную запись, а у Вас - двоичная. Уберите её, не нужна она здесь. А число образуется последовательной выборкой нулей и единиц из того массива, что Вы заполнили и возведением их (за вычетом символа '0', разумеется) в степень (сразу говорю, это - самый неоптимальный вариант)
Эмм, а можно поподробней
Я же не буду единицу в степень сунуть.Мне ее вроде надо на 2 в степени умножить.
Если например у меня число 1010,
то 1*2(в степени3) + 1*2(в степени 1)..
И еще,я ше не буду сhar умножать на 2..
Ничего не понимаю,совсем запуталась....

То есть, допустим: я ввела 10ывапфы10,
Если все равботает верно, в новом массиве, типу сhar ,окажутся 1010.
Потом я это перевожу именно в число,а не в строку.
И потом с этого числа уже беру 1 и умножаю их на 2 в степени.
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 26.05.2008, 18:06   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Тот случай, когда быстрее написать

Код:
#include <stdio.h>

int main()
{
	char str[256], *p;
	unsigned long result = 0;
	int i = 0;

	printf("Enter binary representation:"); 
	scanf("%s", str);

	p = str;

	while(*p && i < 32) {
		if(*p == '1' || *p == '0') {
			if (i) result <<= 1;
			result |= (*p - '0');
			i ++;
		}
		p ++;
	}

	printf("Decimal representaton: %u\n", result);
	
	fflush(stdin);
	getchar();
	return 0;
}
B_N вне форума Ответить с цитированием
Старый 26.05.2008, 23:18   #7
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

О_о..Неужели все было так просто(ну,для вас просто..))..А я ,... кгм, лана не буду себя обижать.Огромное вам спасибо

А можно еще вопрос *извините, но просто я после нормативов несоображающая* : почему в нас размер строки задан 256, а в цикле пишет пока не 32 ?О_о..И ..Я еще не совсем понимаю сокращения, вот здесь if (i) result <<= 1;
result |= (*p - '0');
что делается? А то я оооочень примерно понимаю..
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 26.05.2008, 23:42   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от NamelessEndless Посмотреть сообщение
.....почему в нас размер строки задан 256, а в цикле пишет пока не 32 ?О_о..И ..Я еще не совсем понимаю сокращения, вот здесь if (i) result <<= 1; result |= (*p - '0'); что делается? А то я оооочень примерно понимаю..
256 задано "про запас". строки вообще очень не рекомендуется вводить через scanf, для этого больше подходит fgets. К 32-м это 256 не имеет никакого отношения, 32 - это разрядность типа long, который имеет переменная result, которую мы постепенно сдвигаем вверх. Это ограничение не даст "вылезти" за пределы её разрядности. Объяви я result как short, пришлось бы ограничивать шестнадцатью. "<<= 1" это сдвиг влево на один разряд (умножение на два) с последующим присвоением результата, "result |= (*p - '0')" - двоичное ИЛИ с текущим разрядом строки, вернее с тем, что получается после вычитания символа '0' из текущей цифры - числа 0 или 1.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна срочная помощь немогу найти свои ошибки delphin100 Общие вопросы Delphi 3 03.06.2008 08:38
найти сумму элементов строки jenja Общие вопросы Delphi 2 02.04.2008 17:49
Задача на строки!! Помогите, плиз) Кasa Помощь студентам 4 03.03.2008 11:26
помогите найти причину ошибки! НиКС БД в Delphi 3 10.05.2007 15:55
С++ Найти самое длинное слово строки k0z7_g0b1in Общие вопросы C/C++ 3 22.04.2007 17:37