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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 17:24   #1
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию Очередь на Си

Здраствуйте.
Создать файл целых чисел.За один просмотр файла создать новый файл, в котором будут находиться сначала все отрицательные числа, затем-равны нулю, наконец-то положительные числа, сохраняя порядок расположения чисел в исходном файле.
Вот я сделал код ,в нём я создаю три файла в которых записую отрицательные ,равны нулю и положительные.
Помогите пожалуйста с очередью,что б всё в один файл записывалось.
Код:
#include "stdafx.h"
#include <stdlib.h>
#define ALL_NUMBERS_FILE "allnum.txt"
#define EVEN_NUMBERS_FILE "rivni.txt" 
#define ODD_NUMBERS_FILE "otrizatelnue.txt"
#define videmni "polojitelnue.txt"
 
int main(void) 
{
    int n;
    FILE * inp;
    FILE * outp1;
    FILE * outp2;
    FILE*out;
    inp = fopen(ALL_NUMBERS_FILE, "r");
    if ( !inp ) 
    {
        printf ("File not open");
        exit(1);
    }
 outp1 = fopen(EVEN_NUMBERS_FILE, "w");
    if ( !outp1  ) 
    {
        printf ("File not open");
        exit(1);
    }
 outp2 = fopen(ODD_NUMBERS_FILE, "w");
    if ( !outp2) 
    {
       printf ("File not open");
        exit(1);
    }
    out = fopen(videmni, "w");
    if ( !out  ) 
    {
        printf ("File not open");
        exit(1);
    }
    
    while ( fscanf(inp, "%d", &n) == 1 )
{    
    if (n>0)
    { (fprintf(out, "%d\n",n)<0);
           
    }
  if (n<0)
  { (fprintf(outp2, "%d\n",n)<0);
            
  }
  if (n==0)
   { (fprintf(outp1,"%d\n",n)<0);
   }
}
     
 fclose(inp);
 fclose(outp1);
 fclose(outp2);
  fclose(out);
 return 0;
}
majuw вне форума Ответить с цитированием
Старый 21.05.2013, 17:53   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не проверял:
Код:
typedef struct item
{
   int n;
   struct item *next;
} item;
...
int zeros = 0;
item *head = NULL, *tail = NULL, *tmp;
while (fscanf(inp, "%d", &n) == 1) {  
    if (n < 0) {
        fprintf(out, "%d\n", n);
    } else if (n == 0) {
        ++zeros;
    } else {
        tmp = malloc(sizeof(*tmp));
        tmp->n = n;
        tmp->next = NULL;
        if (head) {
            tail->next = tmp;
            tail = tmp;
        } else {
            head = tail = tmp;
        }
    }
}
int i;
for (i = 0; i < zeros; ++i) {
    fprintf(out, "0\n");  
}
while (head) {
    fprintf(out, "%d\n", head->n);
    tmp = head;
    head = head->next;
    free(tmp);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.05.2013 в 19:36.
BDA на форуме Ответить с цитированием
Старый 21.05.2013, 18:37   #3
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Я понял что нужно ... потставить свой код,но какой именно.
majuw вне форума Ответить с цитированием
Старый 21.05.2013, 19:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Подумайте
Нужны входной и выходной файлы и переменная n.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.05.2013, 19:17   #5
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Вот здесь выдает ошибку tmp = malloc(sizeof(*tmp)); что нельзя void* присвоить item* но когда сделал так ошибка убралась будет ли это правильно? tmp = (item*)malloc(sizeof(item*));

Вот дописал код,выдает ошибку в n ,потом я дописал в структуру s,ошибок не стало,но и всёравно программа не работает.
Код:
#include "stdafx.h"
#include "stdlib.h"
#define allnum "allnum.txt"
#define vid "vid.txt"
typedef struct item
{ int s;
   struct item *next;
} item;
int main (void)
{int n;
FILE*inp;
FILE*fp;
inp=fopen(allnum,"r");
if (!fp)
{printf("Not open file\n");
}
fp=fopen(allnum,"w");
if (!fp)
{printf("Not open file\n");
}
int zeros = 0;
item *head = NULL, *tail = NULL, *tmp;
while (fscanf(inp, "%d", &n) == 1) {  
    if (n < 0) {
        fprintf(fp, "%d\n", n);
    } else if (n == 0) {
        ++zeros;
    } else {
        tmp = (item*)malloc(sizeof(item*));
        tmp->s = n;
        tmp->next = NULL;
        if (head) {
            tail->next = tmp;
            tail = tmp;
        } else {
            head = tail = tmp;
        }
    }
}
int i;
for (i = 0; i < zeros; ++i) {
    fprintf(fp, "0\n");  
while (head) {
    fprintf(fp, "%d\n", head->s);
    tmp = head;
    head = head->next;
    free(tmp);
	
}
}
return 0;
}

Последний раз редактировалось Stilet; 21.05.2013 в 22:32.
majuw вне форума Ответить с цитированием
Старый 21.05.2013, 19:33   #6
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

malloc возвращает указатель на void, нужно явно привести его к нужному типу. И Вы выделяете память не под указатель, а под структуру , на которую он будет указывать. Соответственно, поправьте свой код.
tools вне форума Ответить с цитированием
Старый 21.05.2013, 19:39   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Я забыл 1 скобку, но Вы смогли добавить еще ошибок
Код:
#include "stdafx.h"
#include "stdlib.h"
#define input "in.txt"
#define output "out.txt"

typedef struct item
{
    int n;
    struct item *next;
} item;

int
main(void)
{
    int n;
    FILE *in = NULL, *out = NULL;
    in = fopen(input, "r");
    if (!in) {
        printf("Not open input file\n");
        return 0;
    }
    out = fopen(output, "w");
    if (!out)
    {
        printf("Not open output file\n");
        return 0;
    }
    int zeros = 0;
    item *head = NULL, *tail = NULL, *tmp;
    while (fscanf(in, "%d", &n) == 1) {
        if (n < 0) {
            fprintf(out, "%d\n", n);
        } else if (n == 0) {
            ++zeros;
        } else {
            tmp = (item *) malloc(sizeof(*tmp));
            tmp->n = n;
            tmp->next = NULL;
            if (head) {
                tail->next = tmp;
                tail = tmp;
            } else {
                head = tail = tmp;
            }
        }
    }
    int i;
    for (i = 0; i < zeros; ++i) {
        fprintf(out, "0\n");
    }
    while (head) {
        fprintf(out, "%d\n", head->n);
        tmp = head;
        head = head->next;
        free(tmp);
    }
    fclose(in);
    fclose(out);
    return 0;
}
Не все компиляторы требуют явного приведения типов.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.05.2013, 19:48   #8
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Огромное Вам спасибо.
majuw вне форума Ответить с цитированием
Старый 21.05.2013, 19:51   #9
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

А не могли б Вы пожалуйста написать коментарии,если конечно не заняты.
majuw вне форума Ответить с цитированием
Старый 21.05.2013, 19:54   #10
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Код:
tmp = (item *) malloc(sizeof(*tmp));
тут либо с кастом и размер структуры, либо без каста и указатель (лучше первое )

Последний раз редактировалось tools; 21.05.2013 в 20:22.
tools вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очередь fenix0093 Помощь студентам 1 30.11.2012 16:15
Очередь в С++ droed.nk Помощь студентам 0 07.01.2012 15:09
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь Юлькин Общие вопросы C/C++ 4 30.05.2009 16:00