Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Потоковый ввод и ввод с клавиатуры. Рекурсия (http://forum.oszone.net/showthread.php?t=260262)

lerenia 09-05-2013 20:49 2147307

Потоковый ввод и ввод с клавиатуры. Рекурсия
 
Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива X в соответствии с заданием и возвращать указатель на этот массив. Кроме того, программа должна содержать функцию для вывода на экран и в файл исходной матрицы и результирующего массива, а также рекурсивную функцию определения в соответствии с заданием величины Y.
В программе не должно быть глобальных переменных.
Вот моя задача: Дана матрица А(5х5). Определить массив Х из 5 элементов, каждый из которых равен 1, если сумма модулей элементов соответствующего столбца больше наибольшего по модулю элемента матрицы и –1 в противном случае. Определить величину Y, как сумму положительных элементов первой строки матрицы, расположенных после первого нулевого элемента.
я попыталась с этими потоками разобраться вот что получилось, правда до конца дописать так и не смогла там ошибка
Код:

#include<stdio.h>
#include <conio.h>
#include<locale.h>
#include <math.h>
#define n 3
void input_keyboard(int a[n][n])//Ввод с клавиатуры
{
        int i,j;
    printf("Введите элементы матрицы А: \n");
        for (int i=0; i<n; i++)
                for (int j=0; j<n; j++)
                        scanf ("%d", &a[i][j]);
}
void input_file(int(*a)[n])//Ввод из файла
{       
        FILE *fp;
        fp=fopen("lab3.txt","r");
        if (fp)
        {
                for (int i=0;i<n; i++)
                        for(int j=0; j<n; j++)
                                fscanf(fp, "%d",&a[i][j]);
                fclose(fp);
        }
}
int form_x(int a[n][n], void (*pf)(int [n][n]))//формирую массив х(нахожу максимум сумму столбцов, и сравнить!!!!)
{
        int sum[n], max,i,j;
        static int x[n];
        pf(a);
        max=abs(a[0][0]);//нахождение максимального элемента матрицы
        for ( i=0; i<n; i++)
                for ( j=0; j<n; j++)
                        if (abs(a[i][j]) > max)
                                max=abs(a[i][j]);
        for ( j=0; j<n; j++)//сумма элеменов столбцов
        {
                sum[j]=0;
        for ( i=0; i<n; i++)
                sum[j]=sum[j]+a[i][j];
        sum[j]=abs(sum[j]);
        }
        for ( j=0; j<n; j++)
                if (sum[j]>max) x[j]=1;
                else x[j]=-1;
                return *x;
}
void output(const int x[], const int a[][n] )
{
  int i,j;
  printf("Матрица А:\n");
  for (i=0;i<n;i++)
  {
    for (j=0;j<n;j++)
      printf("%5d",a[i][j]);
      printf("\n");
  }
printf("Массив Х:\n");
for (j=0;j<n;j++)
printf("%5d",x[j]);
printf("\n");
}
int main()
{
setlocale(LC_CTYPE,"");
int a[n][n], x[n], c;
void (*pfunc)(int [n][n]);
do
{
printf("Ввод матрицы:\n1 - с клавиатуры\n2 - \
из файла\n");
scanf("%d",&c);
}
while (c!=1 && c!=2);
// Присваивание указателю адреса одной из функций:
switch (c)
{
case 1: pfunc=&input_keyboard;
break;
case 2: pfunc=&input_file;
}
output(form_x(a,x,pfunc),a);
_getch();
}


deviance 10-05-2013 09:42 2147485

lerenia, на то, что код писали не Вы, указывают два факта:
Цитата:

Цитата lerenia
Дана матрица А(5х5) »

В коде определена константа n равная 3. Она используется для формирования массива и для проведения операций над ним.
Цитата:

Цитата lerenia
до конца дописать так и не смогла там ошибка »

Я посмотрел "туда" - "там" все правильно.

Сформулируйте вопрос\проблему.

lerenia 10-05-2013 23:03 2147826

deviance, код писала я, и дефайн (а не константу, константа будет нечто другое) я ввела 3 что бы тестировать не 25 элементов а 9, согласитесь это легче, даже я там ошибки некоторые нашла, мой код теперь выглядит таким образом

Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива X в соответствии с заданием и возвращать указатель на этот массив. Кроме того, программа должна содержать функцию для вывода на экран и в файл исходной матрицы и результирующего массива, а также рекурсивную функцию определения в соответствии с заданием величины Y.
В программе не должно быть глобальных переменных.
Дана матрица А(5х5). Определить массив Х из 5 элементов, каждый из которых равен 1, если сумма модулей элементов соответствующего столбца больше наибольшего по модулю элемента матрицы и –1 в противном случае. Определить величину Y, как сумму положительных элементов первой строки матрицы, расположенных после первого нулевого элемента.
Код:

#include<stdio.h>
#include <conio.h>
#include<locale.h>
#include <math.h>
#define n 3
//Функция вода элементов матрицы с клавиатуры
void input_matr(int a[n][n])
{
        int i,j;
        printf("Введите элементы матрицы А:  \n");
        for (i=0; i<n; i++)
                for (j=0; j<n; j++)
                        scanf("%d", &a[i][j]);
}
//Функция заполнения матрицы
void input_file (int (*a)[n])
{
        int i,j;
        FILE*file;
        file=fopen("c:\\matr.txt", "r");
        if (file)
        {
                for (i=0;i<n; i++)
                        for(j=0;j<n;j++)
                                fscanf(file,"%d",&a[i][j]);
                fclose(file);
        }
}
//функция вычисления элементов мссива х
int *mas_x(int(*a)[n],int *x, void (*pfunc)(int [n][n]))
{
        pfunc(a);
        int sum[n], max,i,j;
        static int x[n];
        pfunc(a);
        max=abs(a[0][0]);//нахождение максимального элемента матрицы
        for ( i=0; i<n; i++)
                for ( j=0; j<n; j++)
                        if (abs(a[i][j]) > max)
                                max=abs(a[i][j]);
        for ( j=0; j<n; j++)//сумма элеменов столбцов
        {
                sum[j]=0;
        for ( i=0; i<n; i++)
                sum[j]=sum[j]+a[i][j];
        sum[j]=abs(sum[j]);
        }
        for ( j=0; j<n; j++)
                if (sum[j]>max) x[j]=1;
                else x[j]=-1;
                return *a;
}
//функция вывода матрицы а и х
void output(const int x[], const int a[][N] )
{
        int i,j;
    printf("Матрица А:\n");
    for (i=0;i<N;i++)
    {
                for (j=0;j<N;j++)
        printf("%5d",a[i][j]);
                printf("\n");
    }
        printf("Массив Х:\n");
    for (i=0;i<N;i++)
                printf("%5d",x[i]);
        printf("\n");
}
int main()
{
        setlocale(LC_CTYPE,"");
    int a[N][N], x[N], c;
    void (*pfunc)(int [N][N]);
        do
        {
                printf("Ввод матрицы:\n1 - с клавиатуры\n2 - \
                          из файла\n");
                scanf("%d",&c);
        }
        while (c!=1 && c!=2);
        // Присваивание указателю адреса одной из функций:
        switch (c)
        {
        case 1: pfunc=&input_matr;
                break;
                case 2: pfunc=&input_file;
                        }
        output(mas_x(a,x,pfunc),a);
        _getch();

int recurs(int p*, t, &sum)
{
        if (t==0)
                return 0;
        else sum=sum+recurs(p+1, t-1, sum);
}
}

Но она все равно не работает!((((((((((

deviance 11-05-2013 00:01 2147844

lerenia, приведенный Вами код не компилируется ( компилятор из поставки VS сообщает о 75 ошибках ).
Прикрепите такой код, который компилируется, текстовым файлом.

lerenia 11-05-2013 00:03 2147845

deviance, поэтому я и написал, здесь синтаксические ошибки, которые я не понимаю, я делала с примера одномерного массива, и другой рекурсии, поэтому ошибок куча, какие могу исправляю остальные просто не понимаю что означают(

deviance 11-05-2013 00:55 2147863

lerenia, чтобы исправить этот код, Вам придется сделать его читаемым. В частности:

Расставить фигурные скобки

Код:

        for ( j=0; j<n; j++)
                if (sum[j]>max) x[j]=1;
                else x[j]=-1;
                return *a;

Скобки - это хорошо. Правда.
Код:

for ( j=0; j<n; j++)
{
    if (sum[j]>max){
        x[j]=1;
    }  else {
        x[j]=-1;
    }               
}
return *a;


Всмотреться внимательнее в исправленный код

x4 комбо.
Код:

int main(){
...
Я слышал про вложенные процедуры, но С такого не поддерживает.
int recurs(int p* Звезда не там, Тип t, В Си нет ссылок&sum)
{
        if (t==0)
                return 0;
        else sum=sum+recurs(p+1, t-1, sum);
}
}


Всмотреться внимательнее в исправленный код еще раз

Код:

int a[N][N], x[N], c; Нет такой константы - N
pfunc(a); (?)


AMDBulldozer 11-05-2013 02:39 2147879

Внес изменения чтобы программа хотя бы компилировалась
Код:

#include<stdio.h>
#include <conio.h>
#include<locale.h>
#include <math.h>
#define n 3
//Функция вода элементов матрицы с клавиатуры
void input_matr(int a[n][n])
{
        int i,j;
        printf("Введите элементы матрицы А:  \n");
        for (i=0; i<n; i++)
                for (j=0; j<n; j++)
                        scanf("%d", &a[i][j]);
}
//Функция заполнения матрицы
void input_file (int (*a)[n])
{
        int i,j;
        FILE*file;
        file=fopen("c:\\matr.txt", "r");
        if (file)
        {
                for (i=0;i<n; i++)
                        for(j=0;j<n;j++)
                                fscanf(file,"%d",&a[i][j]);
                fclose(file);
        }
}
//функция вычисления элементов мссива х
int *mas_x(int(*a)[n],int *x, void (*pfunc)(int [n][n]))
{
        pfunc(a);
        int sum[n], max,i,j;
//      static int x[n];
        pfunc(a);
        max=abs(a[0][0]);//нахождение максимального элемента матрицы
        for ( i=0; i<n; i++)
                for ( j=0; j<n; j++)
                        if (abs(a[i][j]) > max)
                                max=abs(a[i][j]);
        for ( j=0; j<n; j++)//сумма элеменов столбцов
        {
                sum[j]=0;
        for ( i=0; i<n; i++)
                sum[j]=sum[j]+a[i][j];
        sum[j]=abs(sum[j]);
        }
        for ( j=0; j<n; j++)
                if (sum[j]>max) x[j]=1;
                else x[j]=-1;
                return *a;
}
//функция вывода матрицы а и х
void output(int x[], int a[][n] )
{
        int i,j;
    printf("Матрица А:\n");
    for (i=0;i<n;i++)
    {
                for (j=0;j<n;j++)
        printf("%5d",a[i][j]);
                printf("\n");
    }
        printf("Массив Х:\n");
    for (i=0;i<n;i++)
                printf("%5d",x[i]);
        printf("\n");
}
int main()
{
        setlocale(LC_CTYPE,"");
    int a[n][n], x[n], c;
    void (*pfunc)(int [n][n]);
        do
        {
                printf("Ввод матрицы:\n1 - с клавиатуры\n2 - \
                          из файла\n");
                scanf("%d",&c);
        }
        while (c!=1 && c!=2);
        // Присваивание указателю адреса одной из функций:
        switch (c)
        {
        case 1: pfunc=&input_matr;
                break;
                case 2: pfunc=&input_file;
                        }
        output(mas_x(a,x,pfunc),a);
        _getch();

int recurs(int *p, int t, int *sum)
{
        if (t==0)
                return 0;
        else sum=sum+recurs(p+1, t-1, sum);
}
}

Это не значит, что она работает правильно. Это даже не значит, что моя правка вообще имеет хоть какой-нибудь смысл (по крайней мере, суммирование указателя смысла точно не имеет. Как и вообще вся функция recurs). Это значит только, что на моем компьютере после удаления "#include <conio.h>" (у меня нет такого файла и я вообще не знаю зачем он нужен) и замены _getch() на getchar() программа компилируется без ошибок или предупреждений.

lerenia 11-05-2013 12:49 2147989

Цитата:

Цитата AMDBulldozer
#include <conio.h> »

для функции get

Цитата:

Цитата AMDBulldozer
Как и вообще вся функция recurs). »

если бы вы прочитали задание вы бы поняли для чего она

На этом форуме вообще опасно что то спрашивать, если здесь не знают что такое conio и get то что вы вообще знаете про Си?

AMDBulldozer 11-05-2013 17:19 2148152

Цитата:

Цитата lerenia
если бы вы прочитали задание вы бы поняли для чего она »

Честно говоря, лень было читать до конца.
Вообще-то, до сего момента я наивно полагал, что смысл подпрограммы должен быть понятен из исходного текста. И только теперь до меня дошло, что бывают подпрограммы для понимания которых необходимо знать условия задачи! :wink:

Цитата:

Цитата lerenia
если здесь не знают что такое conio и get то что вы вообще знаете про Си? »

Я, простите великодушно, всю жизнь работаю на Unix. Меня не интересуют заголовочные файлы MS-DOS. Так что Ваш риторический вопрос можно переформулировать: "если вы не знаете MS-DOS, то что вы вообще знаете про Си?" :wink:

P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил. Благо на это потребовалось меньше времени, чем на прочтение условий Вашей задачи. После этого мне тут же сообщили, что я не разбираюсь в C. :wink: Если подобный вид помощи Вам не нужен - не вопрос. Торжественно клянусь никогда больше не писть в Ваших темах! :)

lerenia 11-05-2013 18:06 2148187

Цитата:

Цитата AMDBulldozer
Я, простите великодушно, всю жизнь работаю на Unix »

и отвечаете в теме С/С++

Цитата:

Цитата AMDBulldozer
Я Вам их исправил. »

Цитата:

Цитата AMDBulldozer
P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил. »

Вы удалили два слова const и изменили амперсант на указатель (не понимаю вообще смысл этого действия :dont-know ) и добавили два слова int но у меня компилятор все равно выдает ошибки))) :)
А мистер deviance, вообще назвал мою работу плагиатом и вообще не увидел ошибок сказал что там все правильно, каждый раз когда пишу на это форуме либо указывают на тупость либо хамят, это местная фишка этого форума?

AMDBulldozer 11-05-2013 19:03 2148217

Хорошо, уговорили. Всё-таки отвечу еще раз.

Цитата:

Цитата lerenia
и отвечаете в теме С/С++ »

Если ничего другого нет, читать Википедию до полного просветления:
Цитата:

Цитата Си (язык программирования)
Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в 1969—1973 годах сотрудниками Bell Labs Кеном Томпсоном и Деннисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX.

Вообще говоря, стыдно не знать. Вы, вероятно, полагали, что его в 1971 для MS-DOS выпустили? Разочарую - Билл Гейтс в то время в школу ходил.

Цитата:

Цитата lerenia
изменили амперсант на указатель (не понимаю вообще смысл этого действия ) »

В школе это Вам называли "передачей параметра по ссылке". Кстати, в Вашей программе переменная sum как раз и имеет тип указателя на int.

Цитата:

Цитата lerenia
у меня компилятор все равно выдает ошибки »

Что могу сказать? Значит плохой у Вас компилятор. Предложенный мной текст, за исключением, разумеется, комментариев, полностью соответствует стандарту ANSI.
Замените формат Ваших комментариев с "// комментарий" на традиционный "/* комментарий */" и если после этого компилятор будет выдавать ошибки, то выбросьте его на помойку.
Максимум, в этой программе компилятор может выдать одно предупреждение (не ошибку!) об отсутствии оператора return в функции recurs.

Tramvaichik 11-05-2013 22:44 2148319

Цитата:

Цитата lerenia
А мистер deviance, вообще назвал мою работу плагиатом и вообще не увидел ошибок сказал что там все правильно, каждый раз когда пишу на это форуме либо указывают на тупость либо хамят, это местная фишка этого форума? »

Почему вы не хотите разобраться, когда вам нормально люди обьясняют?

Delirium 12-05-2013 16:50 2148664

Цитата:

Цитата lerenia
поэтому я и написал »

Цитата:

Цитата lerenia
я делала »

Так все таки как верно то? :)

lerenia, дабы не создалось ложного впечатления о форуме и отвечающих:
Ваш вопрос каждый из отметившихся здесь может решить за 15 минут. НО! Мы не решаем за вас ваши задачи, т.к. таких вопросов в день по десятку, а мы не альтруисты сидеть и выполнять за вас ваши лабораторные и прочее. Мы можем помочь, направить на верный ответ, указать на ошибку и т.п. Но после того, как был выложен хотя бы компилирующийся код AMDBulldozer, я думаю надо задуматься о корректной работе вашего ПО.

lerenia 13-05-2013 09:03 2149130

Цитата:

Цитата Delirium
Ваш вопрос каждый из отметившихся здесь может решить за 15 минут. НО! Мы не решаем за вас ваши задачи »

Я не просила решить, я просила помочь, я пыталась, делала, но в первых же сообщениях на меня нагнали что это плагиат и оказывается код у меня не компилируется, хотя наверное именно по этой причине я и попросила помощи!
Цитата:

Цитата Delirium
Так все таки как верно то? »

Это столь существенная опечатка?
Цитата:

Цитата Delirium
я делала »

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

Цитата:

Цитата Tramvaichik
Почему вы не хотите разобраться, когда вам нормально люди обьясняют? »

Потому что здесь не объясняют, а репетитор довольно дорогое удовольствие

Delirium 15-05-2013 14:07 2150446

lerenia, Вам указали на ошибки в коде. Вам сделали проект, который хотя бы компилируется без ошибок. Вам указали, где ошибки. Что еще вы считаете за помощь?
Вы проверили предложенный код? Сменили компилятор? Увидели ошибки? Если да, то в чем загвоздка. Если же нет, то ...


Время: 07:05.

Время: 07:05.
© OSzone.net 2001-