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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] текстовый файл, сложение столбцов 
V
    Опции темы
Zaulyx
Дата 30.11.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



здравствуйте все! Помогите пожалуйста. Нужно написать программу на Си: имеется текстовый файл в котором есть матрица(не обязательно квадратная) с числами с плавующей точкой. Пользователь вводит номера столбцов и операции с ними, и результирующий столбец сохраняется в другом текстовом файле. Возможно что пользователь просто напишет номера столбцов без операций. Помогите пожалуйста!
PM MAIL   Вверх
Zaulyx
Дата 6.12.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



такой вопрос: а как каждое число из матрицы занести в массив? помогите написать эту часть проги плз
PM MAIL   Вверх
taiven
Дата 6.12.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



матрица какого вида и откуда ты её берёшь, из файла?
PM   Вверх
Zaulyx
Дата 6.12.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



матрица любая по размеру с числами с плавающей точкой. беру из файла текстового
PM MAIL   Вверх
taiven
Дата 7.12.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



попробуй так:
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
   FILE *fp;
   int index = 0, i = 0, j = 0, M = 0, N = 0;
   char str[10] = {0};
   double matrix[30][30] = {0};
   double value = 0.0;
   char ch;

   if((fp = fopen("C:\\file.txt", "r"))==NULL)
   {
      printf("Error\n");
      exit(1);
   }

   while(!feof(fp))
   {
        ch = getc(fp);
        if(isdigit(ch))
        {
            while(!isspace(ch) && ch!=EOF)
            {
                str[index++] = ch;
                ch = getc(fp);
            }
            value = atof(str);
            matrix[i][j++] = value;
            M = i; N = j-1;
            if(ch=='\n'){ ++i; j = 0; }
            memset(str, '\0', 10);
        }
        index = 0;
   }

/*вывод на экран*/
    for(i = 0; i <= M; ++i)
    {
        for(j = 0; j <= N; ++j)
        {
            printf("%g\t", matrix[i][j]);
        }
        printf("%c", '\n');
    }

    fclose(fp);
    system("pause");
    return 0;
}


в итоге получишь матрицу размера MxN. но это если файл имеет правильный  формат т.е. никаких лишних пробелов в конце строк не должно быть и т.д.

Это сообщение отредактировал(а) taiven - 7.12.2008, 13:01
PM   Вверх
Zaulyx
Дата 7.12.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а как реализовать операции со столбцами? как я понимаю когда вводится номер столбца мы его записываем в переменную i, когда записываем номер второго, третьего и тд.. то мы должны все время менять переменную i  на другую..но так можно делать бесконечно.. и как быть со знаками операции?
PM MAIL   Вверх
Dmi3ev
Дата 7.12.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 41



лучше создать структуру или класс, которая (который) будет хранить индекс столбеца1, индекс столбца2, знак операции

Это сообщение отредактировал(а) Dmi3ev - 7.12.2008, 14:43


--------------------

PM MAIL   Вверх
Zaulyx
Дата 7.12.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да через структуру намного проще будет, но думаю есть какой-нибудь простой алгоритм, чтобы реализовать это без структуры, хотя не знаю..
PM MAIL   Вверх
taiven
Дата 7.12.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



Цитата

а как реализовать операции со столбцами? как я понимаю когда вводится номер столбца мы его записываем в переменную i, когда записываем номер второго, третьего и тд.. то мы должны все время менять переменную i  на другую..но так можно делать бесконечно..

честно говоря не совсем понимаю, что ты имеешь ввиду... 
вот тебе вывод первого столбца:
Код

for(i = 0, j = 0; i <= M; ++i)
        {
            if(j > N || j < 0)
            {
                printf("%s\n", "Takogo stolbca ne sushestvuet"); 
                break;
            }
            printf("%g\n", matrix[i][j]);
        }

поменяй j на единицу и будет считывать второй столбец и т.д. или я что-то непонимаю?
Цитата

и как быть со знаками операции? 

в смысле?
PM   Вверх
Zaulyx
Дата 7.12.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет, смотри. вводится какая-либо операция допустим 2+4 или 3/5 где цифры это номера столбцов т.е. в первом случае 2й столбец складывается с 4м, а во втором числа 3его столбца делятся на числа 5го. т.е. 

for (i=1; i=M; i++)
matrix[2][j]+matrix[4][j]
 и полученный результат выводится 

PM MAIL   Вверх
taiven
Дата 7.12.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



вот приблизительно так можно сделать для сложения(вывод на экран):
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
   FILE *fp;
   int index = 0, i = 0, j = 0, M = 0, N = 0;
   char str[10] = {0};
   double matrix[30][30] = {0};
   double value = 0.0;
   char ch;
   if((fp = fopen("C:\\file.txt", "r"))==NULL)
   {
      printf("Error\n");
      exit(1);
   }
   while(!feof(fp))
   {
        ch = getc(fp);
        if(isdigit(ch) || ch == '-')
        {
            while(!isspace(ch) && ch!=EOF)
            {
                str[index++] = ch;
                ch = getc(fp);
            }
            value = atof(str);
            matrix[i][j++] = value;
            M = i; N = j-1;
            if(ch=='\n'){ ++i; j = 0; }
            memset(str, '\0', 10);
        }
        index = 0;
   }
//просто вывод всей матрицы на экран-------------
   printf("%s\n","matrix:");
    for(i = 0; i <= M; ++i)
    {
        for(j = 0; j <= N; ++j)
        {
            printf("%g\t", matrix[i][j]);
        }
        printf("%c", '\n');
    }
    printf("%c", '\n');
//---------------------------------------
    int size = 0;
    int *column_num;
    int count = 0, column = 0;
    double result = 0.0;

    printf("%s\n", "skolko stolbcov vi hotite slojit?: ");
    scanf("%d", &size);
    if(size <= 0) exit(0);
    column_num = (int *) malloc((size)*sizeof(int));

    printf("%s\n", "vvedite nomera stolbcov dlya slojeniya:");
    while(count < size)
    {
        scanf("%d", &column);
        --column;
        if(column <  0 || column > N) 
        {
            printf("%s\n", "takogo stolbca ne sushestvuet"); 
            exit(1);
        }
        column_num[count++] = column;
    }
    --count;

//-----сложение и вывод
    printf("\n%s\n", "rezultat:");
    for(i = 0; i <= M; ++i)
    {
        for(j = 0; j <= count; ++j)
        {
            result += matrix[i][column_num[j]];
        }
        printf( "%g\n", result);
        result = 0.0;
    }
    fclose(fp);
    free(column_num);
    system("pause");
    return 0;
}

переделай это под свои нужды и всё.  smile 

Это сообщение отредактировал(а) taiven - 8.12.2008, 14:29
PM   Вверх
taiven
Дата 7.12.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



кстати, а операция должна всегда проводиться с двумя столбцами или нет, т.е. всегда должен быть вид типа 2+4 или возможно и 2+4+3?
PM   Вверх
Zaulyx
Дата 8.12.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет сколько угодно столбцов могут участвовать в операции... Кстати я подумал как можно организовать не только сложение но и другие арифм операции. Я думаю через switch и case...это самый рациональный способ или можно более умно поступить?
PM MAIL   Вверх
Dmi3ev
Дата 8.12.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 5
Всего: 41



1
Цитата

нет сколько угодно столбцов могут участвовать в операции...

это уже попахивает созданием анализатора выражений, хоть и не самого сложно, но все же...
2
Тогда и массив может быть неизвестного размера. Значит нужно использовать указатели.
3
Читать из файла массив советую, используя ifstream, это гораздо удобнее, чем предлагает taiven:
Цитата

 while(!feof(fp))
   {
        ch = getc(fp);
        if(isdigit(ch) || ch == '-')
        {
            while(!isspace(ch) && ch!=EOF)
            {
                str[index++] = ch;
                ch = getc(fp);
            }
            value = atof(str);
            matrix[i][j++] = value;
            M = i; N = j-1;
            if(ch=='\n'){ ++i; j = 0; }
            memset(str, '\0', 10);
        }
        index = 0;
   }

Вообщем достаточно это все трудоемко... Хотя реализуемо  smile

Добавлено через 2 минуты и 8 секунд
4
Цитата

Я думаю через switch и case...это самый рациональный способ или можно более умно поступить?

можно и указатели на функции использовать. Смотреть надо.


--------------------

PM MAIL   Вверх
taiven
Дата 8.12.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 9



Цитата(Dmi3ev @  8.12.2008,  16:45 Найти цитируемый пост)

Читать из файла массив советую, используя ifstream, это гораздо удобнее, чем предлагает taiven

так я ж не против smile, просто в названии темы указан С, а не C++.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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