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

Поиск:

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


Опытный
**


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

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



Вот, пробуй, я особо не тестил)
Код

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

int main()
{
   FILE *fp;
   int index = 0, i = 0, j = 0, M = 0, N = 0, column = 0;
   char str[10] = {0};
   double matrix[30][30] = {0}, result[30] = {0.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');
//---------------------------------------
    
    
    printf("%s\n", "vvedite nomer stolbca"); 
    scanf("%d", &column);
    --column;
    if(column < 0 || column > N) 
    {
        printf("%s\n", "takogo stolbca ne sushestvuet"); 
        system("pause");
        exit(1);
    }
    
    for(i = 0; i <= M; ++i) result[index++] = matrix[i][column];
    index = 0;
    
    char operation = ' ';
    for(;;)
    {
        printf("%s", "vibirite operaciyu([+][-][/][*][=]): ");
        operation = getch();
        printf("%c\n", operation);
        if(operation == '=') break;

        printf("%s\n", "vvedite nomer stolbca:");
        scanf("%d", &column);
        --column;
        if(column < 0 || column > N) 
        {
            printf("%s\n", "takogo stolbca ne sushestvuet"); 
            system("pause");
            exit(1);
        }

        switch(operation)
        {
            case '+' : 
                for(i = 0; i <= M; ++i)
                    result[index++] += matrix[i][column];

                index = 0;
            break;

            case '-' :
                for(i = 0; i <= M; ++i)
                    result[index++] -= matrix[i][column];
                
                index = 0;
            break;

            case '/' :  
                for(i = 0; i <= M; ++i)
                {
                    if(matrix[i][column]==0)
                    {
                        printf("%s\n", "obnarujena popitka deleniya na 0");
                        exit(1);
                    }
                    result[index++] /= matrix[i][column];
                
                }
                index = 0;
            break;

            case '*' : 
                for(i = 0; i <= M; ++i)
                    result[index++] *= matrix[i][column];
                    
                index = 0;
            break;

            default : printf("%s\n", "neizvestnaya operaciya"); exit(1);
        }
    }
    
    FILE *out = fopen("C:\\output.txt", "w");
    for (i = 0; i <= M; i++) 
    {
        fprintf(out, "%g\n" , result[i]);
        printf("%g\n" , result[i]);
    }

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


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


Шустрый
*


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

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



Спасибо огромное, не представляешь как помог, особенно в конце семестра

вот у меня вопросы по коду:

1. За что отвечает переменные Index и value
Index это что-то вроде i? т.е. он пробегает по строке?

2. вот функиця memset(s,c,n) как в учебнике написано размещает литеру c в первых n позициях стринга s и возвращает s. А вот в коде я не очень понял трактовку..

3. я правильно понял работу цикла?
Код
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);
        }

пока не дошли до конца файла
{
      в ch записывается текущий символ в файле
      если ch десятичная цифра или встречается "-"
          {
             то.... двигаемся к следущей цифре в строке(т.е. к след столбцу?)
              считываем эту цифру
           }
    в переменную value записываем str в double типе(т.е он сразу записывает первую строку матрицы?)
    в matrix[i][j] считываем по строчно. (т.е идет как раз заполнения массива числами из файла?)
    M=i; N=j-1; это все понятно
    Если, проходя по строке нашли конец строки то i== j=0 (но когда же мы доходим до конца строки мы должны наоборот занулить i и j++  или нет?)
Ну и собственно 2 вопрос по поводу мемсет.
4.
Код

 char operation = ' ';
    for(;;)


что значит for(;;)  ??

Это сообщение отредактировал(а) Zaulyx - 10.12.2008, 18:22
PM MAIL   Вверх
taiven
Дата 10.12.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. index это индекс smile переключает елементы массива 
Код

result[index++] -= matrix[i][column]; 
т.е тут после выполнени выражения index увеличивается на 1 и происходит переход к следующему элементу массива result.
это же можно переписать так:
Код

result[index] -= matrix[i][column];
index++; 

value временная переменная можно обойтись и без неё, т.е  вместо этого 
Код

value = atof(str);
matrix[i][j++] = value;

это
Код

matrix[i][j++] = atof(str);

2. memset обнуляет массив str(стирает предыдущую запись). т.е. заполняем его символом '\0'.
3. Всё верно вроде
Цитата

Если, проходя по строке нашли конец строки то i== j=0 (но когда же мы доходим до конца строки мы должны наоборот занулить i и j++  или нет?)

i это строки, j стобцы (matrix[№строки][№столбца])


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


Опытный
**


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

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



Цитата(Zaulyx @  10.12.2008,  16:28 Найти цитируемый пост)
что значит for(;;)  ??

бесконечный цикл, за остановку которого отвечает это условие
Код

if(operation == '=') break;

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


Шустрый
*


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

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



препод попросил реализовать скобки, чтобы можно было использовать (1+2)/(3+4) такого вида....
вот я думаю какой цикл нужен?И вообще реально впихнуть это в нашу программу?
и нужно сделать динамический массив для матрицы

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


Опытный
**


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

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



Цитата

препод попросил реализовать скобки, чтобы можно было использовать (1+2)/(3+4) такого вида....

это уже анализатор выражений получается, т.е. тут надо будет разбирать строку такого вида (1+2)/(3+4), иначе я думаю не получится...
Цитата

И вообще реально впихнуть это в нашу программу?

думаю нет.
Цитата

и нужно сделать динамический массив для матрицы

ну и в чём проблема?  smile 
PM   Вверх
Zaulyx
Дата 12.12.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет сделать динамический массив это не проблема, а вот переделывать 2ю часть проги это проблема. 
я как думаю нужно сделать цикл когда встречается "(" и когда встречается ")" , то то что в скобках записывать в какой то двумерный массив, M[наш столбец получившийся][1].... только вот можно ли такое реализовать? технически это возможно как нибудь? добавить в case эти скобки...и....
PM MAIL   Вверх
taiven
Дата 13.12.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Zaulyx @  12.12.2008,  19:59 Найти цитируемый пост)
только вот можно ли такое реализовать? технически это возможно как нибудь? добавить в case эти скобки...и.... 

дело не столько в возможности или невозможности это реализовать технически, сколько в том, что хочет от тебя препод: видеть такую запись (1+2)/(3+4)(строку) для ввода или ему в принципе подходит, то что есть просто нужно доработать. 
PM   Вверх
Zaulyx
Дата 13.12.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



он просто хочет видеть доработанную программу....вот моя идея как сделать это:
значит как: считаем 1+2
записываем результат в result[i]
и result[i] дозаписываем в наш исходный файл как последний столбец (5 столбец)
дальше считаем 3+4
тоже записываем как последний (6 столбец)
потом делим 5 на 6
в итоге реализуем скобки...
дальше записываем в исходный файл исходную матрицу
и записываем result[i] который 5 /6 в оутпут файл...
думаю нужно сделать считывание матрицы как функцию,  чтобы после изменения сразу на экране всплывал 5й столбец, в кэйс или даже в while добавить симол ")", т.е. после нажатия его спрашиваем продолжить вычисления? записываем result[i] обнуляем его и продолжаем со второй скобкой... 

Это сообщение отредактировал(а) Zaulyx - 13.12.2008, 20:30
PM MAIL   Вверх
taiven
Дата 13.12.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну, ты же приблизительно знаешь, как хочешь сделать. Пробуй, а там посмотрим.
PM   Вверх
Zaulyx
Дата 13.12.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а как вот этот кусок оформить как функцию?
Код

   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');
//---------------------------------------

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


Опытный
**


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

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



приблизительно так:
Код

void matrix_out(FILE *p, int *m, int *n, double (*mtrx)[30])
{
    char ch;
    int index = 0, i = 0, j = 0;
    char str[10] = {0};

    while(!feof(p))
    {
        ch = getc(p);
        if(isdigit(ch) || ch == '-')
        {
            while(!isspace(ch) && ch!=EOF)
            {
                str[index++] = ch;
                ch = getc(p);
            }
            mtrx[i][j++] = atof(str);
            *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", mtrx[i][j]);
        }
        printf("%c", '\n');
    }
    printf("%c", '\n');
//---------------------------------------
}


ну и вызов 
Код

 matrix_out(fp, &M, &N, matrix);


вот это
Код

   double value = 0.0;
   char ch;
   char str[10] = {0};

из функции main надо убрать
PM   Вверх
Zaulyx
Дата 14.12.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



как-то так....но не знаю как доработать. Добавил в кейс ')' и после ее нажатия result[i] должен обнулятся и добавлятся новый столбец в исходный файл, а как на самом деле получается или нет не могу сказать...

Код

#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, column = 0;
   double matrix[30][30] = {0}, result[30] = {0.0}, time[30][30]={0};
   
   void matrix_out(FILE *p, int *m, int *n, double (*mtrx)[30])
{
    char ch;
    int index = 0, i = 0, j = 0;
    char str[10] = {0};

    while(!feof(p))
    {
        ch = getc(p);
        if(isdigit(ch) || ch == '-')
        {
            while(!isspace(ch) && ch!=EOF)
            {
                str[index++] = ch;
                ch = getc(p);
            }
            mtrx[i][j++] = atof(str);
            *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", mtrx[i][j]);
        }
        printf("%c", '\n');
    }
    printf("%c", '\n');
//---------------------------------------
}
   
   if((fp = fopen("C:\\file.txt.txt", "r"))==NULL)
   {
      printf("Error\n");
      system("pause");
      exit(1);
   }
  
matrix_out(fp, &M, &N, matrix);
for (i=0; i<=M; i++)
{
   for (j=0; j<=N; j++)
    {
time[i][j]=matrix[i][j];
    }
}
fclose(fp);
    
    
    printf("%s\n", "vvedite nomer stolbca"); 
    scanf("%d", &column);
    --column;
    if(column < 0 || column > N) 
    {
        printf("%s\n", "takogo stolbca ne sushestvuet"); 
        system("pause");
        exit(1);
    }
    
    for(i = 0; i <= M; ++i) result[index++] = matrix[i][column];
    index = 0;
    
    char operation = ' ';
    for(;;)
    {
        printf("%s", "vibirite operaciyu([+][-][/][*][=]): \n");
        operation = getch();
        printf("%c\n", operation);
        if(operation == '=') break;

        printf("%s\n", "vvedite nomer stolbca:");
        scanf("%d", &column);
        --column;
        if(column < 0 || column > N) 
        {
            printf("%s\n", "takogo stolbca ne sushestvuet"); 
            system("pause");
            exit(1);
        }
                    
                                                         
        switch(operation)
        {
            case '+' : 
                for(i = 0; i <= M; ++i)
                    result[index++] += matrix[i][column];

                index = 0;
            break;

            case '-' :
                for(i = 0; i <= M; ++i)
                    result[index++] -= matrix[i][column];
                
                index = 0;
            break;

            case '/' :  
                for(i = 0; i <= M; ++i)
                {
                    if(matrix[i][column]==0)
                    {
                        printf("%s\n", "obnarujena popitka deleniya na 0");
                        exit(1);
                    }
                    result[index++] /= matrix[i][column];
                
                }
                index = 0;
            break;

            case '*' : 
                for(i = 0; i <= M; ++i)
                    result[index++] *= matrix[i][column];
                    
                index = 0;
            break;
            
            case ')' :
              fopen(fp = fopen("C:\\file.txt.txt", "a");                                 
              for(i=0; i<= M; i++)                
              {
                fprinf(fp, "%g\n", result[i]);
                }
                matrix_out(fp, &M, &N, matrix);
                memset(result, '\0', M);
                index = 0;
                break;

            default : printf("%s\n", "neizvestnaya operaciya"); exit(1);
            
        }
    }
    
    FILE *out = fopen("C:\\output.txt", "w");
    for (i = 0; i <= M; i++) 
    {
        fprintf(out, "%g\n" , result[i]);
        printf("%g\n" , result[i]);
    }

    fclose(out);
    fclose(fp);
    fopen(fp = fopen("C:\\file.txt.txt", "w");  
    for (i = 0; i<=M; i++)
    {
        for(j=0; j<=N; j++)
        {
          fprintf(fp, "%g\n", time[i][j]);
        }
    {
                          
    system("pause");
    return 0;

}



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


Опытный
**


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

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



Этот код одна сплошная ошибка... Кто же функцию внутри функции main объявляет? Ты это компилировал вообще?
Ладно, вот есть выражение (1+2)/(1+3), как ты собираешься это вводить? Алгоритм, пошаговый, можешь написать?
PM   Вверх
Zaulyx
Дата 14.12.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



сначала вводим 1+2 как изначально было до введения скобок
дальше нажимаем ")" 
результат записываем в resul[i] (как и было раньше)
добавляем result[i] в исходную матрицу как последний столбец.
выводим получившуюся матрицу на экран
зануляем result[i]
теперь вводим 1+3
нажимаем ")"
результат в result[i]
добавляем в исходную матрицу как последний столбец
(Если в исходной матрице было 3 столбца теперь там их 5)
вводим 4/5
нажимаем "="
записываем в result[i]
записываем в output файл
записанные выше столбцы 4 и 5 в исходную матрицу стираем

Это сообщение отредактировал(а) Zaulyx - 14.12.2008, 15:49
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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