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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2010, 20:00   #1
IROKEZ
 
Регистрация: 18.04.2010
Сообщений: 4
По умолчанию Не могу дописать программу

Проблема следующая, сделал все из того, что ниже, кроме вставки стула и двусвязного стека. К сожалению сколько я не бился над решением этих задач, ничего толкового так и не вышло. Все еще осложняется тем, что со списками я последний раз работал год назад на паскале, тогда я их знал отлично и подобная задача для меня проблемой не была, но сейчас я все напрочь забыл, хотя, на паскале бы мб вспомнил чего, а вот с Си проблема, да еще сроки поджимают, завтра уже сдать надо все Очень рассчитываю на вашу помощь, заранее спасибо!

Написать программу, которая вводит из файла структуры, размещает их в стеке, реализованном с помощью двунаправленного
циклического списка, и вставляет в список новый стул перед самым низким стулом. Результат (содержимое стека)
выводится в файл
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define Lmax 20
#define CHAIR struct chr
#define CLR while(fgetc(f)!='\n')

CHAIR
{
	char color[Lmax];
	int height;
	struct
	{
		char city[Lmax], factory[Lmax], sname[Lmax];
	}
	manufactur;
	char mater[Lmax];
	CHAIR *prev; // Указатель на предыдущую запись
	CHAIR *next; // Указатель на следующую запись
};

// Формирование стека стульев. На входе имя входного файла
CHAIR* stack(char name[])
{
	CHAIR *tek, *stack=NULL; // tek - указатель на текущую запись
	FILE *f;

	f=fopen(name,"r");
	if(f==NULL)
	{
		puts("File not found");
		exit(1);
	}
	else
	{
		while(!feof(f))
		{
			//Выделение памяти для новой записи
			tek=(CHAIR*)malloc(sizeof(CHAIR));
			if(fgets(tek->color,Lmax,f))
			{
				tek->color[strlen(tek->color)-1]='\0'; // Замена \n на \0
				fscanf(f,"%d",&tek->height);
				CLR;
				fgets(tek->manufactur.city,Lmax,f);
				tek->manufactur.city[strlen(tek->manufactur.city)-1]='\0';

				fgets(tek->manufactur.factory,Lmax,f);
				tek->manufactur.factory[strlen(tek->manufactur.factory)-1]='\0';

				fgets(tek->manufactur.sname,Lmax,f);
				tek->manufactur.sname[strlen(tek->manufactur.sname)-1]='\0';

				fgets(tek->mater,Lmax,f);
				tek->mater[strlen(tek->mater)-1]='\0';

				tek->next=stack;
				//tek->prev=stack;
				stack=tek;
			}
		}
		free(tek);
	}
	return(stack); // Возврат указателя на вершину стека
}

// Вставка стула
// Результат - указатель на вершину измененного списка
CHAIR* Insert(CHAIR *stack)
{
	CHAIR *tek, *prev, *p; // Указатель на текущую запись
	int MinHeight=32768; // Указатель на стул с минимальной высотой

	tek=stack;
	// Поиск стула с минимальной высотой
	while(stack && tek)
	{
		if(tek->height<MinHeight)
		MinHeight=tek->height;
		tek=tek->next; // Движение по списку
	}
	printf("\nMinHeight %d\n",MinHeight);
	return(stack);
}

void print(CHAIR* stack)
{
	while(stack!=NULL)
	{
		printf("\n");
		printf("Color: %s\n", stack->color);
		printf("Height: %d\n", stack->height);
		printf("Material: %s\n", stack->mater);
		printf("City: %s\n", stack->manufactur.city);
		printf("Factory: %s\n", stack->manufactur.factory);
		printf("Surname: %s\n", stack->manufactur.sname);
		stack=stack->next;
	}
}

// Вывод результата в файл
void Output(CHAIR* stack, char name[])
{
	FILE *f2=fopen(name,"w");

	// Вывод списка в файл
	while(stack!=NULL)
	{
		fprintf(f2,"Color: %s\n",stack->color);
		fprintf(f2,"Height: %d\n",stack->height);
		fprintf(f2,"City: %s\n",stack->manufactur.city);
		fprintf(f2,"Factory: %s\n",stack->manufactur.factory);
		fprintf(f2,"Surname: %s\n",stack->manufactur.sname);
		fprintf(f2,"Material: %s\n",stack->mater);
		stack=stack->next; // Движение по списку
	}
	fclose(f2);
}

main()
{
	CHAIR *first; // Указатель на вершину стека
	char namei[Lmax], nameo[Lmax]; // Названия входного и выходного файла

	printf("Enter name of input file: ");
	gets(namei);
	//printf("Enter name of output file: ");
	//gets(nameo);
	first=stack(namei); // Формирование стека
	print(first);
	first=Insert(first);
	print(first);
	/*if(first!=NULL)
	{
		Output(first,nameo);
		printf("The result put to file %s\n",nameo);
	}*/
	return 0;
}
IROKEZ вне форума Ответить с цитированием
Старый 19.04.2010, 19:41   #2
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

зачем ты так насилуеш свой мозг

может быть поставиш проше вопрос и решить его тогда проше
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу прогу дописать! ATJ Общие вопросы C/C++ 0 18.04.2010 19:45
Не могу дописать, Паскаль строки Айдар Помощь студентам 5 10.02.2010 21:45
С++ не могу дописать kolashik Помощь студентам 1 31.10.2009 17:40
ассемблер, не могу дописать... blackbanny Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 05.10.2009 13:32
Помогите дописать программу на Delphi 7 не могу понять что здесь не так matrix8325 Помощь студентам 1 30.04.2009 23:34