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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2012, 22:09   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
Подмигивание Преобразование символа в код

Доброе время суток!
Нужна помощь в доработке кода. Хочу по возможности чтобы не нужно было вводить символы, а подключать текстовый файл и считывать с него символы (считалось их количество, группировались символы, все знаки препинания считались за один символ). Опять же в коде есть проблема - работает только с латинскими буквами почему то.

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
	char	sym[10];
	float	pro;
	int		arr[20];
	int		top;
}s[20];

typedef struct node node;

void shannon(int l, int h, node s[])
{
	float pack1=0, pack2=0, diff1=0, diff2=0;
	int i,k,j;
	if((l+1)==h || l==h || l>h)
	{
		if(l==h || l>h)
			return;
		s[h].arr[++(s[h].top)] = 0;
		s[l].arr[++(s[l].top)] = 1;
		return;
	}
	else
	{
		for(i = l; i <= h-1; i++)
			pack1 = pack1 + s[i].pro;
			pack2 = pack2 + s[h].pro;
			diff1 = pack1 - pack2;
		if(diff1 < 0)
			diff1 = diff1 *- 1;
		j=2;
		while(j != h-l+1)
		{
			k = h-j;
			pack1 = pack2 = 0;
			
			for(i = l; i <=k; i++)
				pack1 = pack1 + s[i].pro;
			for(i = h; i > k; i--)
				pack2 = pack2 + s[i].pro;
			diff2 = pack1 - pack2;
			
			if(diff2 < 0)
				diff2 = diff2 *- 1;
			if(diff2 >= diff1)
				break;
			diff1 = diff2;
			j++;
		}
		k++;
		for(i = l;i <= k; i++)
			s[i].arr[++(s[i].top)] = 1;
		for(i = k+1; i <= h; i++)
			s[i].arr[++(s[i].top)] = 0;
		shannon(l,k,s);
		shannon(k+1,h,s);
	}
}

void main()
{
	int n, i, j;
	float x, total = 0;
	char ch[10];
	node temp;
	
	system("chcp 1251 > nul");
	system("cls");
	printf("Укажите сколько символов вы хотите ввсети\t: ");
	scanf("%d",&n);
	
	for(i = 0; i < n; i++)
	{
		printf("Введите символ %d ---> ",i+1);
		scanf("%s",ch);
		strcpy(s[i].sym, ch);
	}

	for(i=0;i< n;i++)
	{
		printf("\n\tВведите вероятности %s ---> ",s[i].sym);
		scanf("%f",&x);
		s[i].pro=x; 
		total=total+s[i].pro;
		
		if(total>1)
		{
			printf("\t Эта вероятность не представляется возможной. Введите новые!");
			total = total-s[i].pro;
			i--;
		}
	}

	s[i].pro = 1-total;
	
	for(j = 1;j <= n-1; j++)
	{
		for(i = 0;i < n-1; i++)
		{
			if((s[i].pro)>(s[i+1].pro))
			{
				temp.pro=s[i].pro;
				strcpy(temp.sym,s[i].sym);
				s[i].pro=s[i+1].pro;
				strcpy(s[i].sym,s[i+1].sym);
				s[i+1].pro=temp.pro;
				strcpy(s[i+1].sym,temp.sym);
			}
		}
	}
	
	for(i = 0; i < n; i++)
		s[i].top=-1;

	shannon(0,n-1,s);
	
	printf("---------------------------------------------------------------");
	printf("\n\n\n\tСимвол\tВероятности\tКод");

	for(i = n-1; i >= 0; i--)
	{
		printf("\n\t%s\t%f\t",s[i].sym,s[i].pro);
		for(j = 0; j <= s[i].top; j++)
			printf("%d",s[i].arr[j]);
	}
	printf("\n---------------------------------------------------------------");
	getch();
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 22:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А причем тут коды символов?
Найди примеры с функцией fopen(), fread(), fscanf() или ifstream изучи их и прикрути к программе
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2012, 22:19   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А причем тут коды символов?
Программа преобразует символ в двоичный код
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 22:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да ради бога - символы в Си (ANSI котороые) представляют из себя байт, который по факту и есть число от 0 до 254-х. Так что там никакой преобразовки не нужно, это не паскаль. Втыкай переменку символа в любое целочисленное или огическое выражение, и он будет участвовать в нем аки код.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2012, 22:28   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Код:
system("DIR");
	printf("\n Введите имя текстового файла:");
	gets(file);
	
	pf = fopen(file, "rt");
	if(pf == NULL)
	{
		printf("\t Файл не удалось открыть!!!");
		return;
	}
Файл открыл, а как прочитать символы в нем и рассортировать их по группам и подсчитать сколько в каждой группе символов (все знаки препинания как один символ)
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 22:31   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Втыкай переменку символа в любое целочисленное или огическое выражение, и он будет участвовать в нем аки код.
Я бы и рад, но в том то и вся "соль", чтобы методом Шеннона преобразовать символы в файле в двоичный код
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 22:42   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.programmersforum.ru/showthread.php?p=1133258
Это группировка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2012, 22:58   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Код:
	system("DIR");
	printf("\n Введите имя текстового файла: ");
	gets(file);
	
	pf = fopen(file, "rt");
	if(pf == NULL)
	{
		printf("\t Файл не удалось открыть!!!");
		return;
	}
	
	while((ch = fgetc(pf)) != EOF)
	{
		if(strchr(".,:;?!-\'\"", ch))	// Если в тексте встречаются знаки препинания
			ch = '.';					// объединить в один символ '.'
		code[ch]++;	// Считает число символов каждого типа
		
	}
Если вот так сделать? Если встречаются знаки препинания, то принимать их за один символ (.). Или код не очень.....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 22.11.2012 в 23:05.
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 23:00   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Функция towlower() - преобразует заглавный регистр к строчному?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.11.2012, 23:04   #10
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Кое-что забыл -
Код:
code[256] = {0}; - заполнение массива нулями
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код символа victor5133 C++ Builder 4 14.03.2012 14:21
Работа с массивом/строкой символов, преобразование символа с число. (Pascal, Delphi) Савва Помощь студентам 8 29.01.2012 12:27
Узнать код символа bdfy Microsoft Office Word 7 18.04.2011 04:21
Код символа Jasper92 Помощь студентам 2 29.06.2010 17:02
код символа Serg12 Помощь студентам 5 08.03.2010 15:34