Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 29.04.2009, 19:55   #1 (permalink)
manuchehr
Новичок
 
Регистрация: 29.04.2009
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Задача по "С"

Программа "С"

Есть текстовый файл неопределенной длины- стандартный ввод(stdin), нужно отсортировать его строки в лексикографическом порядке по возрастанию и вывести их на стандартный вывод(stdout).

Программа должна запускаться из командной строки и считывать строки текста пока пользователь не сигнализирует о конце файла(стандартного ввода)комбинацией Ctrl+D (unix)или Ctrl+Z (windows).
Необходимо использовать динамическую память для хранения считываемых строк, так как заранее не известно их количество.
Программа сортирует считанные строки любым алгоритмом сортировки и выводит их на stdout.
Лексикографическое сравнение строк:
"ABC"<"ABCD","ABC"="ABC","ABC"<"ABD"
Для его выполнения можно воспользоваться функцией strmcp().
manuchehr вне форума   Ответить с цитированием

Старый 29.04.2009, 19:55
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Чтобы не заходить в тупик вы можете пролистать аналогичные темы

"Никитин" пообещал новые иски против пользователей "ВКонтакте"
Пропали кнопки "Вперёд", "Назад" и "Вверх"
Видеокамера SONY записывала в формате в "mpg", а теперь стала в "m2ts". Почему?

Старый 29.04.2009, 21:47   #2 (permalink)
blake
Новичок
 
Регистрация: 27.04.2009
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Пиши в асю 803-866 договаримся!
blake вне форума   Ответить с цитированием
Старый 01.05.2009, 00:55   #3 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Посмотри на мой пост здесь:
http://www.tehnari.ru/f22/t24167/index2.html#post199170

Тут практически идентичная задача, единственное отличие - сигнализация конца стандартного ввода
Там концом ввода считается ввод пустой строки, у тебя - комбинация. Копай функцию int enterElement() в том же листинге, напиши что понял\не понял - если будет время, попробую объяснить.
csbwalker вне форума   Ответить с цитированием
Старый 15.05.2009, 01:06   #4 (permalink)
Дария
Новичок
 
Регистрация: 05.05.2009
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

ПОЖАЛУЙСТА!!!Помогите написать программу на С. очень нужно для экзамена. заранее благодарю.
Дерево выражения вывести (используя обход дерева) в инфиксной (обычной) форме записи, учитывать приоритет операции. выражение (2+3)*4.
Дария вне форума   Ответить с цитированием
Старый 19.05.2009, 21:27   #5 (permalink)
Дария
Новичок
 
Регистрация: 05.05.2009
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ребята!!! пожалуйста помогите написать прогу!!)
Дария вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 21.05.2009, 12:55   #6 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от Дария Посмотреть сообщение
ПОЖАЛУЙСТА!!!Помогите написать программу на С. очень нужно для экзамена. заранее благодарю.
Дерево выражения вывести (используя обход дерева) в инфиксной (обычной) форме записи, учитывать приоритет операции. выражение (2+3)*4.
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct element
{
	int number;
	char operation;
	struct element *left;
	struct element *right;
};

int findLastOperation(char str[], int count)
{
int current = 0, pri, i;
int number;
int minimal = -1;

	for(i = 0; i < count; i++)
	{
		switch(str[i])
		{
			case '(':
				current += 2;
				break;
			case ')':
				current -= 2;
				break;
			case '*':
			case '/':
				pri = current + 1;
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			case '+':
			case '-':
				pri = current;
				if(pri == 0)
					return i;
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			default:
				break;
		}
	}
	if(minimal >= 0)
		return number;
	else
		return -1;
}

int stringtoi(char str[], int count)
{
char tmp[count + 1];
	if(str[0] == '(')
		str++, count--;
	if(str[count - 1] == ')')
		count--;

	strncpy(tmp, str, count);
	tmp[count] = '\0';

	return atoi(tmp);
}

struct element *build(char str[], int count)
{
struct element *el = (struct element *)malloc(sizeof(struct element));
int n = findLastOperation(str, count);

	if(n == -1)
	{
		el->operation = 0;
		el->number = stringtoi(str, count);
	} else
	{
		el->operation = str[n];
		el->left = build(str, n);
		el->right = build(str + n + 1, count - n - 1);
	}
	return el;
}

void printTree(struct element *el, int n)
{
int i;
	for(i = 0; i < n; i++)
		putchar(' ');
	putchar('|');
		
	if(el->operation == 0)
	{
		
		printf("%d\n", el->number);
	} else
	{
		
		printf("%c\n", el->operation);
		printTree(el->left, n + 1);
		printTree(el->right, n + 1);
	}
}

int main()
{
char str[] = "(2+3)*4";
struct element *tree = build(str, strlen(str));

	printTree(tree, 0);

	return 0;
}
Выражение задаётся в main строкой char str[] = "(2+3)*4";.
csbwalker вне форума   Ответить с цитированием
Старый 24.05.2009, 20:17   #7 (permalink)
бородёнок
Новичок
 
Регистрация: 28.04.2009
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

помогите с задачей на си...
задача: Строки текста, считанных с stdin, сохранить в двусвязный список, массив. Результат на stdout, реверсировать на выводе.
заранее благодарен.
бородёнок вне форума   Ответить с цитированием
Старый 01.06.2009, 11:09   #8 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

По просьбе Дарии - откомментрированная программа с построением дерева выражений:

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

/* Структура для хранения элемента бинарного дерева */
struct element
{
	int number;             /* Хранимое число */
	char operation;         /* Код операции, которую необходимо выполнить что бы получить
                                   из дочерних элементов число */
	struct element *left;   /* Указатель на левое поддерево */
	struct element *right;  /* Указатель на правое поддерево */
};

/* Функция для определения в строке позиции операции с наименьшим приоритетом (с учетом скобок) */
/* На входе - массив символов в котором хранится строка, количество символов в строке */
/* Примечание - при обработке строки не учитывается концевой 0-маркер, поэтому функция может обрабатывать
   отдельные части строки */
int findLastOperation(char str[], int count)
{
int current = 0, pri, i, number, minimal = -1;

	for(i = 0; i < count; i++) /* Обработка всех символов строки */
	{
		switch(str[i]) /* Действия в зависимости от кода текущего символа */
		{
			case '(':
				current += 2; /* Скобка открывается. Увеличиваем базовый приоритет. */
				break;
			case ')':
				current -= 2; /* Скобка закрывается. Уменьшаем базовый приоритет. */
				break;
			case '*':
			case '/': /* Умножение и деление - приоритетные операции,
                                     к базовому приоритету прибавляем 1 и проверяем, не является
                                     ли приоритет текущей операции минимальным из уже просмотренных,
                                     если да - обновляем указатель на минимальный и значение приоритет */
				pri = current + 1;
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			case '+':
			case '-':
                                /* Действия аналогичны умножению и делению, но приоритет не увеличивается на 1 */
				pri = current;
				if(pri == 0) /* Если приоритет текущей операции 0 - то он заранее минимален, */
					return i; /* поэтому можно не продолжать дальнейший поиск */
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			default: /* Если символ - не операция */
				break;
		}
	}
	if(minimal >= 0) 
		return number; /* Возвращаем номер позиции */
	else
		return -1; /* Если minimal=-1 - то не было найдено ни одно операции */
}

/* Функция преобразования строки в целое число */
/* Учитывает возможность наличия открывающейся в начале или закрывающейся в конце скобки */
int stringtoi(char str[], int count)
{
char tmp[count + 1]; /* Временный буфер для строки */
	while(str[0] == '(') /* Убираем все скобки в начале */
		str++, count--;
	while(str[count - 1] == ')')  /* Убираем все скобки в конце */
		count--;

	strncpy(tmp, str, count); /* Копируем получившуюся после обрезки строку во временный буфер tmp */
	tmp[count] = '\0'; /* Ставим концевой 0-маркер после строки в буфере, что бы получить стандартную C-строку */

	return atoi(tmp); /* Возвращаем результат преобразования стандартной C-строки в целое число */
}

/* Рекурсивная функция построяния дерева */
/* На входе - обрабатываемая строка (возможно без 0-маркера), количество символов в строке */
struct element *build(char str[], int count)
{
struct element *el = (struct element *)malloc(sizeof(struct element)); /* Создаем новый элемент и выделяем под него память */
int n = findLastOperation(str, count); /* Ищем операцию с минимальным приоритетом - по ней будем производить разбивку */

	if(n == -1) /* Если операция не найдена - значит переданная строка это просто число */
	{
		el->operation = 0; /* Операции нет - следовательно записываем в код операции 0 */
		el->number = stringtoi(str, count); /* Записываем число */
	} else /* Если операция найдена - нужно производить дальнейшую разбивку */
	{
		el->operation = str[n]; /* Записываем в код операции код найденного символа операции */
		el->left = build(str, n); /* Вызываем функцию построения левого поддерева из левой части строки */
		el->right = build(str + n + 1, count - n - 1); /* Вызываем функцию построения правого поддерева из правой части строки */
	}
	return el; /* Возвращаем получившийся результат */
}

/* Рекурсивная функция для вывода бинарного дерева на экран */
/* На входе - указатель на начало поддерева, смещение при печати */
void printTree(struct element *el, int n)
{
int i;
	for(i = 0; i < n; i++) /* Печатаем пробелы для смещения*/
		putchar(' ');
	putchar('|');
		
	if(el->operation == 0) /* Если код операции не записан - значит это просто число, выводим его */
	{
		
		printf("%d\n", el->number);
	} else /* Если код операции записан - значит, выводим этот код на экран и запускаем обработку левого
                 и правого поддеревьев с большим смещением чем текущее */
	{
		
		printf("%c\n", el->operation);
		printTree(el->left, n + 1);
		printTree(el->right, n + 1);
	}
}

int main()
{
char str[] = "(2+3)*4"; /* Задаем обрабатываемую строку, обязательно без пробелов*/
struct element *tree = build(str, strlen(str)); /* Строим дерево по заданной строке */

	printTree(tree, 0); /* Выводим дерево на экран */

	return 0;
}
P.S. я там по ходу дела одно исправление сделал - что бы если что прога могла и вложенные скобки обрабатывать, а именно в двух местах заменил if на while (оба раза - в функции stringtoi).
csbwalker вне форума   Ответить с цитированием
Старый 22.11.2012, 17:35   #9 (permalink)
pron
Новичок
 
Регистрация: 22.11.2012
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от manuchehr Посмотреть сообщение
Программа "С"

Есть текстовый файл неопределенной длины- стандартный ввод(stdin), нужно отсортировать его строки в лексикографическом порядке по возрастанию и вывести их на стандартный вывод(stdout).

Программа должна запускаться из командной строки и считывать строки текста пока пользователь не сигнализирует о конце файла(стандартного ввода)комбинацией Ctrl+D (unix)или Ctrl+Z (windows).
Необходимо использовать динамическую память для хранения считываемых строк, так как заранее не известно их количество.
Программа сортирует считанные строки любым алгоритмом сортировки и выводит их на stdout.
Лексикографическое сравнение строк:
"ABC"<"ABCD","ABC"="ABC","ABC"<"ABD"
Для его выполнения можно воспользоваться функцией strmcp().
Чувак скинь пожалуйста код проги, очень надо, у меня такая же, а вот как написать даже не представляю, буду очень благодарен!
pron вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 12:07.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.