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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2010, 17:28   #1
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
Сообщение Вопрос - Гистограмма

Написал программу, которая печатает гистограмму длин вводимых слов. Она работает нормально, но у меня есть пара вопросов на счёт неё.

1. Часть программы, которая считает количество слов вынес в отдельную функцию для удобства, но в таком случае мне приходится вводить слова дважды, поскольку чтение из потока происходит дважды. Каким образом можно решить эту проблему? Может ли функция возвращать два значения?
2. Так как я совсем не знаю, как работает bool в С (если он тут вообще есть), я использовал две числовые константы вместо true, false. Каким образом в С объявляться буленовская переменная?

Код:
#include "stdafx.h"
#include "stdlib.h"
#define IN 1
#define OUT 0

int wordcount()
{
	int stream, count_wrd, state;

	count_wrd = 0;
	state = OUT;

	while ((stream = getchar()) != '\n')
	{
		if ((stream == ' ') || (stream == '\t')) state = OUT;
		else if (state == OUT)
		{
			state = IN;
			++count_wrd;
		}
	}
	return count_wrd;
}

int _tmain(int argc, _TCHAR* argv[])
{

	int i, *word, c, wcount, length, nc;

	wcount = wordcount();
	word = malloc(wcount*sizeof(int));
	length = nc = 0;

	while ((c = getchar()) != '\n')
	{
		if (c == ' ')
		{
			length = 0;
			++nc;
		}
		else	++length;

		word[nc] = length;
	}

	for (i = 0; i < wcount; ++i)
		printf (" %d", word[i]);

	printf("\n");

	for (i = 0; i < wcount; ++i)
	{
		for (nc = 0; nc < word[i]; ++nc)
			printf("_");
		printf("\n");
	}

	free(word);
	return 0;
}
Liverpool FC supporter.
Unknown_Object вне форума Ответить с цитированием
Старый 30.06.2010, 17:38   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

в C нет булевых пременных, вместо них обычно используют char со значениями 1 и 0. Еще можно прописать директивы:
Код:
#define true 1
#define false 0
NiCola999 вне форума Ответить с цитированием
Старый 30.06.2010, 18:15   #3
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

Код:
#include "stdafx.h"
#include "stdlib.h"

int *new_word(int *word_prev, int w_count)
{
	int *tmp = (int *) malloc(w_count * sizeof(int));
	
	for (int i = 0; i < w_count-1; i++)
		tmp[i] = word_prev[i];
	return tmp;
}

int _tmain(int argc, _TCHAR* argv[])
{

	int i, *word, c, wcount, length, nc;

	length = nc = 0;
	wcount = 1;
	word = (int *)malloc(sizeof(int));

	while ((c = getchar()) != '\n')
	{
		if (c == ' ')
		{
			length = 0;
			++nc;
			wcount++;
			word = new_word(word, wcount);
		}
		else
			++length;
		word[nc] = length;
	}

	for (i = 0; i < wcount; ++i)
		printf (" %d", word[i]);

	printf("\n");

	for (i = 0; i < wcount; ++i)
	{
		for (nc = 0; nc < word[i]; ++nc)
			printf("_");
		printf("\n");
	}

	free(word);
	return 0;
}
В си, 0 - это false все остальное это true
include <Qt>
sever-42 вне форума Ответить с цитированием
Старый 30.06.2010, 18:53   #4
Unknown_Object
 
Аватар для Unknown_Object
 
Регистрация: 18.07.2009
Сообщений: 9
По умолчанию

Спасибо большое. У нас функция для подсчёта слов возвращает как значение динамический массив?
Liverpool FC supporter.
Unknown_Object вне форума Ответить с цитированием
Старый 30.06.2010, 22:45   #5
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

int *new_word(int *word_prev, int w_count) возвращает ссылку на массив.
include <Qt>
sever-42 вне форума Ответить с цитированием
Старый 17.08.2010, 10:04   #6
Stelka
Новичок
Джуниор
 
Регистрация: 17.08.2010
Сообщений: 1
По умолчанию

У меня получилось без массива. а вот с массивами не разберусь
#include <stdio.h>
#include <conio.h>

main()
{ char c;
printf ("Введите десять слов\n");
while ((c=getchar())!='\n')
if (c!=' ')
printf("_");
else
printf("\n");
_getch();}
Stelka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Гистограмма ~Az@liya~ Паскаль, Turbo Pascal, PascalABC.NET 3 15.06.2010 11:14
qBasic, факториал и гистограмма Russia Помощь студентам 2 19.05.2010 18:57
Дисперсия. Гистограмма p4serhiy Помощь студентам 2 15.04.2010 08:34
Гистограмма по числам из массива sokla Помощь студентам 1 06.01.2010 12:15
C++ Гистограмма xxxPascalxxx Помощь студентам 1 05.11.2009 15:05