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

Поиск:

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


Шустрый
*


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

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



а как мне вбивать если хочу (1+2)/(3+4)?
в какой последовательности и когда вбивать скобку?
PM MAIL   Вверх
taiven
Дата 17.12.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так:
Код

1
+
2
/(
3
+
4
)=

проверки на правильность или неправильность ввода нет, поэтому вводить надо внимательно.

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


Шустрый
*


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

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



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


Опытный
**


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

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



и ещё учти, что со вложенными скобками прога не работает.
PM   Вверх
Zaulyx
Дата 18.12.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня встала загвостка насчет динамического массива.
прочитал этот топик http://forum.vingrad.ru/topic-189118.html
но там все рассмотрено для integer массива, а вот с double проблемы возникли
Код

#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, result[30] = {0.0}, temp[30] = {0.0};
   char operation[3] = {'\0'};
   char ch;
   char str[10] = {0};
   char old_op[3] = {'\0'};
  
  printf("vvedite kol-vo stolbcov");
  scanf("%i", &M);
  printf("vvedite kol-vo strok");
  scanf("%i", &N);
  matrix=(double *)calloc(N, sizeof(*matrix)*M);
  
//îòêðûòèå ôàéëà è çàïèñü ñîäåðæèìîãî â ìàòðèöó---------------------------
   if((fp = fopen("C:\\file.txt.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);
    free(matrix);
    system("pause");
    return 0;

}


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


Опытный
**


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

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



А зачем тебе вообще выделять память динамически? И какой массив ты хочешь сделать динамическим?

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


Шустрый
*


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

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



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 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;
}
void calc(double **mtrx, double *res, int m, int n, const char *op, int col)
{
        int i = 0;
        if(!strcmp(op, "+")) 
        {
            col = input_col(n);
            for(i = 0; i <= m; ++i) res[i] += mtrx[i][col];
        }
        if(!strcmp(op, "-")) 
        {
            col = input_col(n);
            for(i = 0; i <= m; ++i) res[i] -= mtrx[i][col];
        }
        if(!strcmp(op, "/")) 
        {
            col = input_col(n);
            for(i = 0; i <= m; ++i)
            {
                if(mtrx[i][col]==0)
                {
                    printf("%s\n", "obnarujena popitka deleniya na 0");
                    exit(1);
                }
                res[i] /= mtrx[i][col];    
            }
        }
        if(!strcmp(op, "*")) 
        {
            col = input_col(n);
            for(i = 0; i <= m; ++i) res[i] *= mtrx[i][col];
        }
}

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

   printf("vvedite kol-vo strok: ");
   scanf("%i", &M);
   matrix = (double**)malloc(M * sizeof(double));
   printf("vvedite kol-vo stolbcov: ");
   scanf("%i", &N);
   for(int a = 0; a < N; a++) matrix[a] = (double*)malloc(N * sizeof(double));

//открытие файла и запись содержимого в матрицу---------------------------
   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;

        calc(matrix, result, M, N, operation, 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;
                }
                
                calc(matrix, temp, M, N, operation, 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);
    for(int a = 0; a < N; a++) free(matrix[a]);
    free(matrix);
    system("pause");
    return 0;
}

незнаю правда или я правильно выделяю и освобождаю память (сишными методами никогда не пользуюсь, тем более для многомерных массивов).

и вообще в таком виде в динамическом выделении памяти толку мало, если уж выделять память динамически, то сначала, нужно подсчитать, сколько реально строк и столбцов в файле...

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


Шустрый
*


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

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



спасибо огромное! теперь у меня может даже будет зачет по инфе=)
PM MAIL   Вверх
Zaulyx
Дата 19.12.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а что значит и зачем мы записываем (double**) по синтаксису?
PM MAIL   Вверх
taiven
Дата 19.12.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот тут почитай комментарии(там на C++, но я думаю ты разберёшься, идея та же в принципе)
PM   Вверх
Zaulyx
Дата 19.12.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хм... там я не нашел ответа на вопрос
Код

matrix = (double**)malloc(M * sizeof(double));

вот в этой строчке каково назначение (double**)? т.е. это указатель на указатель на double... а зачем мы это пишем?

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


Опытный
**


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

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



а, ты имеешь в виду зачем (double**) именно перед функцией malloc?
PM   Вверх
Zaulyx
Дата 19.12.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот именно в этой строчке зачем мы пишем double**? вот как я понял malloc возврщает void  а нам нужен double... вот как это сформулировать по нормальному?(если я конечно правильно думаю..)
PM MAIL   Вверх
taiven
Дата 19.12.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

вот как я понял malloc возврщает void  а нам нужен double

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

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


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

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

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

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


 




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


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

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