Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача на работу с файлами 
:(
    Опции темы
1122
Дата 6.4.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Есть следующая задача:
В текстовом файле хранится вещественная матрица. Записать ее в другой файл таким образом, чтобы в первом столбце находились минимальные элементы строк, а в последнем – максимальные.
Подскажите пожалуйста алгоритм решения и функции, которыми пользоваться. Если можно, то пример кода. Заранее спасибо.
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Алгоритм:
1. Считываешь матрицу из файла.
2. Сортируешь каждую строку матрицы по возрастанию.
3. Записываешь получившуюся матрицу в др. файл.

Добавлено через 1 минуту и 34 секунды
Цитата(1122 @  6.4.2008,  00:37 Найти цитируемый пост)
Если можно, то пример кода

Нельзя! Что значит пример кода? Пример кода может быть "как унаследовать один класс от другого", а для конкретных задач не пример кода, а решение. Хочешь научиться - попытайся написать его сам. Не хочешь - go в Центр Помощи.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



да, спасибо...
А вот такая задача:
В текстовом файле хранится историческая информация: дата в формате dd.mm.yyyy (число.месяц.год) и краткое сообщение о событии. Записать в другой файл эти исторические события в хронологическом порядке.
Подскажие пожалуйста алгоритм...
PM MAIL   Вверх
bsa
Дата 6.4.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



пишешь структуру: 
Код
struct Event {
   unsigned year, month, day;
   char text[256];
};
Затем пишешь функцию сравнения:
Код
int compare(const void *e1, const void *e2){
...
}
Которой передаются два указателя на структуры Event. Она возвращает 0, если содержимое равно, -1 если дата у e1 меньше, чем у e2 и +1, если у e2 больше, чем у e1.
Затем считываешь весь файл в массив таких структур.  И используешь qsort для сортировки этого массива, затем записываешь его обратно в файл.
PM   Вверх
1122
Дата 6.4.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Цитата(archimed7592 @  6.4.2008,  01:10 Найти цитируемый пост)
Алгоритм:
1. Считываешь матрицу из файла.
2. Сортируешь каждую строку матрицы по возрастанию.
3. Записываешь получившуюся матрицу в др. файл.

Вот у меня вопрос, а как считать матрицу из файла. У меня почему-то абра-кадабра получается после того, как я считываю циферки из файла с помощью fscanf'а в массив типа инт?
PM MAIL   Вверх
bsa
Дата 6.4.2008, 15:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



1122, ты бы хоть показал, как ты это делаешь.
PM   Вверх
1122
Дата 6.4.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Как преобразовать считанный  из файла сhar-массив в int-массив?
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



1122, а ты его читай не char-массивом, а числами...
Код

int x;
fscanf(fp, "%d", &x); // в x прочиталось число из файла



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Спасибо..

Блин..
Почему-то это не работает, не подскажите где ошибка?

Код

    i=0;
    while(!feof(fp))
    {
        fscanf(fp, "%d", &arr[i]); 
        printf("%d", arr[i]);
        i++;
    }


Просто не выводит ничего на экран.
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Код

    if (!fp)
        printf("oops :)\n");
    i=0;
    while(!feof(fp))
    {
        fscanf(fp, "%d", &arr[i]); 
        printf("%d", arr[i]);
        i++;
    }

А так чё выведет? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Ничего smile
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



А покажи код полностью.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Код

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100


int main()
{
    int ch, n, i, f, a, q, j, b;
    char mass[N], mass2[N];
    int arr[N];
    FILE *fp;

    if((fp=fopen("text.txt", "r+t")) == NULL)
    {
        printf("Oshibka");
        exit(1);
    }
/////////////////////////////////////////////////////
    for(i = 0; i < N; i++)
    {
        if(ch == EOF)
        {
            mass[i] = '\0';
            break;
        }
        ch = getc(fp);
        mass[i] = ch;

    }
//////////////////////////////////////////////////////
    if (!fp)
        printf("oops :)\n");
    i=0;
    while(!feof(fp))
    {
        fscanf(fp, "%d", &arr[i]); 
        printf("%d", arr[i]);
        i++;
    }



    //mass2[i] = '\0';
    printf("%s\n", mass);
    //printf("%s", mass2);

    fclose(fp);
    getch();
    return 0;
}

PM MAIL   Вверх
1122
Дата 6.4.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Или вот... аналогичная задача, нужно считать из типизированного файла числа (кстати, что значит типизированный? это не текстовой? если да, то какой?).
Пользуюсь этим кодом:
Код

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100


int main()
{
     int ch, i = 0;
     int arr1[N], arr2[N];
     FILE *fp;

     if ((fp=fopen("text.txt", "r+t")) == NULL)
     {
          printf("Oshibka\n");
          getch();
          exit(1);
     }
     while(ch != EOF)
     {
          ch = getc(fp);
          arr1[i] = ch;
          i++;     
     }

    for(i = 0; i <= N; i++)
    {
        printf("%d ", arr1[i]);
    }

    getch();
    return 0;
}


На экран выводятся совершенно левые числа.. абра-кадабра :(
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(1122 @  6.4.2008,  17:14 Найти цитируемый пост)
    for(i = 0; i < N; i++)
    {
        if(ch == EOF)
        {
            mass[i] = '\0';
            break;
        }
        ch = getc(fp);
        mass[i] = ch;
    }

Закомментируй этот кусок - ты же сначала считываешь данные из файла здесь(по всей видимости ты считываешь файл до конца), после чего естественно, что feof вернёт true...

Добавлено через 4 минуты и 57 секунд
Цитата(1122 @  6.4.2008,  18:02 Найти цитируемый пост)
кстати, что значит типизированный? это не текстовой? если да, то какой?

Не знаю... спроси у преподавателя, что он под этим понимает.

Цитата(1122 @  6.4.2008,  18:02 Найти цитируемый пост)
На экран выводятся совершенно левые числа.. абра-кадабра :( 

Дай ка угадаю: для файла, заполненного пробелами на экран выведется много чисел 32 smile.
Тебе нужно разобраться в чём разница между символом текста, текстом и собственно числом.
Текст "123" состоит из символов '1','2','3'. getc возвращает первый символ('1') после чего ты преобразовываешь его в число. На самом деле никакого преобразования нет, ибо символ - это и есть число, представляющее код данного символа. Для пробела(' ') это 32, к примеру(в известных мне кодировках).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



ок. Спасибо за помощь.
Вот еще вопрос возник, как быть в такой ситуации:
Есть массив чисел (кратный 7, например 21 число). Нужно брать из этого массива по 7 чисел и анализировать на наличие какой-нибудь цифры. Если данная цифра (например ноль) есть в выбранной семерке, то ее дальше не рассматривать. После анализа вывести на экран данный массив, но без этих групп цифр (по 7 шт), в которых встретились, например, нули. Подскажите алгоритм пожалуйста.

Это сообщение отредактировал(а) 1122 - 6.4.2008, 20:20
PM MAIL   Вверх
archimed7592
Дата 6.4.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(1122 @  6.4.2008,  20:18 Найти цитируемый пост)
Подскажите алгоритм пожалуйста. 

Код

Для каждого кортежа из 7 чисел в массиве // for
    Для каждого числа из кортежа // for
         Проанализировать число, если подходит, то break.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
1122
Дата 6.4.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Вот придумал такой код:

Код

    for(i=0; i<=N; i++)
    {
        if(i%7==0)
        {
            for(j = b; j <= i; j++)
            {
                if(arr1[j] != 0)
                {
                    f = 0;
                }
                else f = 1;
            }
            if(f == 0)
            {
                for(j = b; j <= i; j++)
                {
                    arr2[a] = arr1[j];
                    a++;
                }
            }
            b = i;
        }
    }


Но он выдает опять же абру-кадабру из цифр.
PM MAIL   Вверх
opjox
Дата 6.4.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



Цитата(1122 @  6.4.2008,  18:02 Найти цитируемый пост)
нужно считать из типизированного файла числа (кстати, что значит типизированный? это не текстовой? если да, то какой?).

В дельфях это бинарные файлы, из которых можно читать данные только одного типа (соответственно, сдвиги в файле будут фактически равны sizeof(int)*n, но там нужно будет указать только n). В Си нет такой строгой типизации, но если подразумевается именно это, то работа, наверно, будет примерно такой:

Код

#include <stdio.h>

#define num 3

int main()
{
  
  if(FILE * f = fopen("test.int", "wb")) { // ключ 'b' открывает файл как бинарный
    int mas[num] = {0, 255, 65535};
    if(fwrite(mas, sizeof(int), num, f) != num) printf("not write\n");
    fclose(f);
  } else printf("not create file\n");

  if(FILE * f = fopen("test.int", "rb")) { // опять открываем как бинарный, но теперь на чтение
    int mas[num];
    if(fread(mas, sizeof(int), num, f) == num) {
      for(int i=0; i<num; i++) printf("%d\n", mas[i]);
    } else printf("not read\n");
    fclose(f);
  } else printf("not open file\n");

  return 0;
}


Цитата(1122 @  6.4.2008,  20:53 Найти цитируемый пост)
Вот придумал такой код:
...
Но он выдает опять же абру-кадабру из цифр.

Если я правильно понял условия задачи, то:
Код

#include <stdio.h>

#define jmp 2
#define n 3

bool FindDig(int in, int find); // поиск цифры в числе

int main()
{
  int mas[jmp*n] = {15, 16, 17, 18, 15, 16};
  bool out[n] = {1, 1, 1}; // все true

  for(int i=0; i<n; i++) {
    for(int j=0; j<jmp; j++) {
      if(FindDig(mas[i*jmp + j], 0)) {
        out[i] = false;
        break;
      }
    }
  }

  for(int i=0; i<n; i++) { // вывод
    if(out[i]) {
      for(int j=0; j<jmp; j++) printf("%d ", mas[i*jmp+j]);
    }
    printf("\n");
  }

  return 0;
}


jmp в твоем случае будет 7, а n = 21/jmp 
Функцию нахождения цифры в числе (FindDig) реализуй сам


PM MAIL ICQ   Вверх
1122
Дата 6.4.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Спасибо за помощь.
PM MAIL   Вверх
archimed7592
Дата 7.4.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(1122 @  6.4.2008,  20:53 Найти цитируемый пост)
    for(i=0; i<=N; i++)
    {
        if(i%7==0)
        {

Такую абракадабру обычно пишут так:
Код

for(int i = 0; i < N; i += 7)
{
   // ...
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.