Модераторы: 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   Вверх
Zaulyx
Дата 9.12.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот смысл моей идеи. поправьте плз код

Код

coloumn=i;
while(o!='=')
{
printf("vvedite nomer stolbca\n");
scanf("%d", &coloumn);
printf("vvedite operaciu");
gets(o);
switch(o)
{
case '+' :
for(j=0; j<=N; j++) 
result[a]+=matrix[coloumn][j];
break;
case '-' :
for(j=0; j<=N; j++)
result[a]-=matrix[coloumn][j];
break;
case'*' :
for(j=0; j<=N; j++)
result[a]*=matrix[coloumn][j];
break;
case'/' :
for(j=0; j<=N; j++)
result[a]/=matrix[coloumn][j];
break;
}

}



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


Опытный
**


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

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



А ты кроме сложения другие операции сделал уже? Оно у тебя работает? Тебе осталось только выбор операции сделать?
PM   Вверх
Zaulyx
Дата 9.12.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну как правильность я пока не могу проверить - компилятор не пашет... можно сказать на бумажке это написал...
не знаю как насчет правильности но хотел чтобы это выглядело так:
пользователь вводит номер столбца
вводит операцию
дальше идет выбор из операций записывает этот столбец в result[a]
потом вводится другой столбец. в зависимости от операции к result[a] прибавляется/вычитается и тд.. этот столбец.
и так пока пользователь не введет '='
это как я себе представляю должно работать....но на деле может и не получится, по-этому прошу поправить если я в силу своей неопытности в програмировании отклонился от своей идеи smile 
PM MAIL   Вверх
taiven
Дата 9.12.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

ну как правильность я пока не могу проверить - компилятор не пашет... можно сказать на бумажке это написал...

на бумажке это конечно круто  smile , но лучше скачай компиль себе какой-нибудь(тот же Dev C++ например).
ну и по коду:
в строке 
Код

result[a]/=matrix[coloumn][j];
 ты не учитываешь возможность деления на ноль.
в строке 
Код

result[a]-=matrix[coloumn][j];
 ты не учитываешь, что result[a](если он у тебя не инициализирован никаким столбцом) может быть равен нулю и в итоге ты можешь получить отрицательное значение... да и переменная a у тебя не изменяется...
Код

gets(o);
switch(o)

switch`у нельзя скормить строку, тут лучше сделать так
Код

char o; 
o = getch();
switch(o)
{
          //... 
 }




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


Шустрый
*


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

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



вот насчет возможности деления на ноль не знаю как учесть...
вот переработанный код
Код

printf("vvedite nomer pervogo stolbca\n");
scanf("%d", &firstCol);
result[a]=matrix[firstCol][j];

coloumn=i;
while(o!='=')
{
printf("vvedite operaciu");
o = getch();    
    
printf("vvedite nomer stolbca\n");
scanf("%d", &coloumn);

switch(o)
{
case '+' :
for(j=0; j<=N; j++) 
result[a]+=matrix[coloumn][j];
a++;
break;
case '-' :
for(j=0; j<=N; j++)
result[a]-=matrix[coloumn][j];
a++;
break;
case'*' :
for(j=0; j<=N; j++)
result[a]*=matrix[coloumn][j];
a++;
break;
case'/' :
for(j=0; j<=N; j++)
result[a]/=matrix[coloumn][j];
a++;
break;
}

}



PS и дев-Си не хочет работать) пишет проект не откомпилирован....хотя компилица успешно...не хочет запускаться и все тут

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


Опытный
**


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

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



Цитата

PS и дев-Си не хочет работать) пишет проект не откомпилирован....хотя компилица успешно...не хочет запускаться и все тут

если скомпилилось успешно, то в папке проекта должен появится экзешник, запусти его из командной строки и всё. 

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


Шустрый
*


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

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



о спасибо, а по коду есть какие-нибудь советы?

кстати твоя часть кода-считывание из файла не загружается. т.е. нажимаю на екзешный файл и вылетает...

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


Опытный
**


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

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



В смысле вылетает? С ошибкой? что пишет?
PM   Вверх
Zaulyx
Дата 9.12.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вылетает на подобии того как в паскале когда не пишешь readln; в конце и при запуске вылетает... вот и здесь что-то типо того...без ошибок..
PM MAIL   Вверх
taiven
Дата 9.12.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



запусти файл из командной строки(перетащи файл консольное окно и нажми <ENTER>)
или же вот эту часть кода 
Код

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

измени на
Код

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

и откомпиль снова
скорее всего ты путь к файлу на свой не изменил.
PM   Вверх
Zaulyx
Дата 9.12.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хм...ну я создал по адресу файл file.txt..
c:\file.txt

вот содержимое файла:
1.0 3.0 3.2 32.1
4.1 5.11 32.3 1.1

а когда запускаю пишет Error
т.е. файл не проходит проверку на null...
PM MAIL   Вверх
taiven
Дата 9.12.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй положить file.txt в папку с экзешником и поменяй это 
Код

if((fp = fopen("C:\\file.txt", "r"))==NULL)

на это
Код

if((fp = fopen("file.txt", "r"))==NULL)

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


Шустрый
*


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

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



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


Опытный
**


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

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



мда... тут либо ты создал не потому адресу, либо еще могу предположить, что у тебя расширения файлов на компе не отображаются и ты создав текстовый файл прибавил к нему .txt.
попробуй снова положить файл на диск С(файл не переименовывай) и исправь код на
Код

 if((fp = fopen("C:\\file.txt.txt", "r"))==NULL)

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


Шустрый
*


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

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



Код

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

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

   if((fp = fopen("file.txt.txt", "r"))==NULL)
   {
      printf("Error\n");
      system("pause");
      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;

printf("vvedite nomer pervogo stolbca\n");
scanf("%d", &firstCol);
result[a]=matrix[firstCol][j];

coloumn=i;
while(o!='=')
{
printf("vvedite operaciu");
o = getch();    
    
printf("vvedite nomer stolbca\n");
scanf("%d", &coloumn);

switch(o)
{
case '+' :
for(j=0; j<=N; j++) 
result[a]+=matrix[coloumn][j];
a++;
break;
case '-' :
for(j=0; j<=N; j++)
result[a]-=matrix[coloumn][j];
a++;
break;
case'*' :
for(j=0; j<=N; j++)
result[a]*=matrix[coloumn][j];
a++;
break;
case'/' :
for(j=0; j<=N; j++)
result[a]/=matrix[coloumn][j];
a++;
break;
}

}
Out = fopen("output.txt.txt", "w");
for (j=0;j<=N; j++)
fprintf(FILE Out, result[coloumn][j]);
fclose(FILE Out);
}


хм.. жалуется на то что char o не объявлена....
и жалуется на запись файла(не могу разобраться как записать массив в файл...)

Это сообщение отредактировал(а) Zaulyx - 9.12.2008, 23:43
PM MAIL   Вверх
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   Вверх
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   Вверх
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   Вверх
Zaulyx
Дата 19.12.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


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

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

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

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


 




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


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

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