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

Поиск:

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


Опытный
**


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

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



не знаю, все равно не могу сообразить как сделать. пробуй сделать сам, если есть конкретные вопросы ,спрашивай.
PM   Вверх
Zaulyx
Дата 14.12.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



при вызове функции чтения из файла мы должны вбивать кол-во столбцов и строк?
PM MAIL   Вверх
Zaulyx
Дата 14.12.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



в смысле в функцию matrix_read_out(fp, &M, &N, matrix);? нет, после выполнения функции M и N, будут содержать размер матрицы

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


Шустрый
*


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

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



Код

 if((fp = fopen("C:\\file.txt.txt", "a+"))==NULL)
   {
      printf("Error\n");
      system("pause");
      exit(1);
   }
   
   
   matrix_out(fp, &M, &N, matrix);
   
   char operation = ' ';
   
   if(operation == ')')
        {
        fprintf(fp, "%g\n", result[i]);
        matrix_out(fp, &M, &N, matrix);
        memset(result, '\0', 30);             
                                         }
                                            
     printf("%s\n", "vvedite nomer stolbca"); 
    scanf("%d", &column);
    --column;
    if(column < 0 || column > N) 


вот при компиляции:
вбиваем столбец 1
вбиваем операцию -
вбиваем столбец 3
вбиваем операцию )
просит вбить столбец
выходит

но он ведь должен записать в result[i] разность столбцов а потом занулить его и записать нулевой массив в аутпут.тхт ??
или он должен быть в цикле for(;;)  ??
PM MAIL   Вверх
taiven
Дата 14.12.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



добавь case ')':break; в switch, чтобы не происходил выход.
PM   Вверх
Zaulyx
Дата 14.12.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



если я добавлю в кейс то вот это
Код

if(operation == ')')
        {
        fprintf(fp, "%g\n", result[i]);
        matrix_out(fp, &M, &N, matrix);
        memset(result, '\0', 30);             
                                         }

перестает работать...хотя оно и так не работало...ну а тут оно вообще не играет никакой роли
PM MAIL   Вверх
taiven
Дата 14.12.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну почему не играет никакой роли, запись в файл-то происходит smile
а вообще мне кажется здесь нужно в свитче сделать еще один свитч(повесить его на case '(' основного свитча), сециально для работы с выражениями в скобках, сделать в нём свой цикл for(;;), и выходить из цикла по нажатию ')'. И массив дополнительный, который будет хранить результат... но я сегодня вряд ли буду уже, что-то писать.
PM   Вверх
Zaulyx
Дата 17.12.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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







int main()
{
   FILE *fp;
   int index = 0, i = 0, j = 0, M = 0, N = 0, column = 0;
   double matrix[30][30] = {0},result_skobki[30] = {0.0}, result[30] = {0.0}, time[30][30];
   
  
   
   if((fp = fopen("C:\\file.txt.txt", "a+"))==NULL)
   {
      printf("Error\n");
      system("pause");
      exit(1);
   }
   
   
   matrix_out(fp, &M, &N, matrix);
   
   char operation = ' ';
   char oper_skobki = ' ';
                                            
     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;
    
    
    for(;;)
    
     {
        matrix_out(fp, &M, &N, matrix);   
        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 '=' : break;
            
            case '(':
                  for(;;)
    
     {
        matrix_out(fp, &M, &N, matrix);   
        printf("%s", "vibirite operaciyu([+][-][/][*][=]): \n");
        operation = getch();
        printf("%c\n", operation);
        if(oper_skobki == ')') 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(oper_skobki)
        {
            case '+' : 
                for(i = 0; i <= M; ++i)
                    result_skobki[index++] += matrix[i][column];

                index = 0;
            break;

            case '-' :
                for(i = 0; i <= M; ++i)
                    result_skobki[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_skobki[index++] /= matrix[i][column];
                
                }
                index = 0;
            break;

            case '*' : 
                for(i = 0; i <= M; ++i)
                    result_skobki[index++] *= matrix[i][column];
                    
                index = 0;
            break;
                 
             case ')' :
                  fprintf(fp, "%g/n", result_skobki);    
                 break;
                 
           case '=' : break;      
                 
                 
                  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;

}

}
}


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


Опытный
**


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

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



можно использовать строки, тогда можно будет вводить такие конструкции, как "+(", ")=" и т.д.
PM   Вверх
Zaulyx
Дата 17.12.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



т.е. 
char operation[2] ???
PM MAIL   Вверх
taiven
Дата 17.12.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



char operation[3]

Добавлено через 1 минуту и 19 секунд
и проверки делать так : if(!strcmp(operation, "+")) ...
PM   Вверх
taiven
Дата 17.12.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



короче, вот:
Код

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

int input_col(int n)
{
    int col = 0;
    printf("%s\n", "vvedite nomer stolbca:");
    scanf("%d", &col);
    --col;
    if(col < 0 || col > n) 
    {
        printf("%s\n", "takogo stolbca ne sushestvuet"); 
        exit(1);
    }
    return col;
}

//-------------------------------------------------------------------
int main()
{
   FILE *fp,*out;
   int index = 0, i = 0, j = 0, M = 0, N = 0, column = 0;
   double matrix[30][30] = {0.0}, result[30] = {0.0}, temp[30] = {0.0};
   char operation[3] = {'\0'};
   char ch;
   char str[10] = {0};
   char old_op[3] = {'\0'};

//открытие файла и запись содержимого в матрицу---------------------------
   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);
            }
            matrix[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", matrix[i][j]);
        }
        printf("%c", '\n');
    }
    printf("%c", '\n');
//------------------------------------------------------------


    column = input_col(N);
    
    for(i = 0; i <= M; ++i) result[i] = matrix[i][column];
    
    for(;;)
    {
        if(!strcmp(operation, ")=")) break;
        memset(operation, 3, '\0');
        printf("%s", "vibirite operaciyu([+][-][/][*][=]): ");
        scanf("%s", operation);
        if(!strcmp(operation, "=")) break;

        if(!strcmp(operation, "+")) 
        {
            column = input_col(N);
            for(i = 0; i <= M; ++i) result[i] += matrix[i][column];
        }
        if(!strcmp(operation, "-")) 
        {
            column = input_col(N);
            for(i = 0; i <= M; ++i) result[i] -= matrix[i][column];
        }
        if(!strcmp(operation, "/")) 
        {
            column = input_col(N);
            for(i = 0; i <= M; ++i)
            {
                if(matrix[i][column]==0)
                {
                    printf("%s\n", "obnarujena popitka deleniya na 0");
                    exit(1);
                }
                result[i] /= matrix[i][column];    
            }
        }
        if(!strcmp(operation, "*")) 
        {
            column = input_col(N);
            for(i = 0; i <= M; ++i) result[i] *= matrix[i][column];
        }
        
        /*скобки*/
        if(!strcmp(operation, "+(") || !strcmp(operation, "-(") || !strcmp(operation, "/(") || !strcmp(operation, "*(")) 
        {
            strcpy(old_op, operation);
            column = input_col(N);
            for(i = 0; i <= M; ++i) temp[i] = matrix[i][column];
            printf("%s", "vibirite operaciyu([+][-][/][*][=]): ");
            scanf("%s", operation);
            for(;;)
            {    
                if(!strcmp(operation, ")=") || !strcmp(operation, ")")) 
                {
                    if(!strcmp(old_op, "+(")) for(i = 0; i <= M; ++i) result[i] += temp[i];
                    if(!strcmp(old_op, "-(")) for(i = 0; i <= M; ++i) result[i] -= temp[i];
                    if(!strcmp(old_op, "/(")) for(i = 0; i <= M; ++i)
                    {
                        if(temp[i]==0)
                        {
                            printf("%s\n", "obnarujena popitka deleniya na 0");
                            exit(1);
                        }
                        result[i] /= temp[i];
                    }
                    if(!strcmp(old_op, "*(")) for(i = 0; i <= M; ++i) result[i] *= temp[i];
                    break;
                }
                
                if(!strcmp(operation, "+")) 
                {
                    column = input_col(N);
                    for(i = 0; i <= M; ++i) temp[i] += matrix[i][column];
                }
                if(!strcmp(operation, "-")) 
                {
                    column = input_col(N);
                    for(i = 0; i <= M; ++i) temp[i] -= matrix[i][column];
                }
                if(!strcmp(operation, "/")) 
                {
                    column = input_col(N);
                    for(i = 0; i <= M; ++i)
                    {
                        if(matrix[i][column]==0)
                        {
                            printf("%s\n", "obnarujena popitka deleniya na 0");
                            exit(1);
                        }
                        temp[i] /= matrix[i][column];    
                    }
                }
                if(!strcmp(operation, "*")) 
                {
                    column = input_col(N);
                    for(i = 0; i <= M; ++i) temp[i] *= matrix[i][column];
                }
                printf("%s", "vibirite operaciyu([+][-][/][*][=]): ");
                scanf("%s", operation);    
            }
        }
    }


//запись результата в файл-------------------------------------
    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;
}

вообщем опять же, я особо не тестил поэтому смотри сам. если не поймешь как пользоваться, спрашивай  smile

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


Шустрый
*


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

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



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


Опытный
**


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

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



а нет всётаки работает нормально, это я просто подумал, что оно и такие выражения будет нормально считать : 1+(1+1)*(2+2)(по всем правилам математики), но это без ввода строки и её разбора не сделать... т.е. в проге это выражение считается так: сначала это 1+(1+1), а потом умножение на (2+2).

Добавлено @ 20:04
Цитата(Zaulyx @  17.12.2008,  18:59 Найти цитируемый пост)
хм..чтото он опять вылетает при запуске... 

пути к файлам проверь.

Это сообщение отредактировал(а) taiven - 17.12.2008, 20:04
PM   Вверх
Страницы: (6) Все « Первая ... 2 3 [4] 5 6 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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