C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Аватара пользователя
lerenia

C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение lerenia »

Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива 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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение deviance »

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


Цитата lerenia:



Дана матрица А(5х5)
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




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


Цитата lerenia:



до конца дописать так и не смогла там ошибка
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




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



Сформулируйте вопрос\проблему.
Аватара пользователя
lerenia

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение lerenia »

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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение deviance »

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

Прикрепите такой код, который компилируется, текстовым файлом.
Аватара пользователя
lerenia

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение lerenia »

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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение deviance »

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




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






Код:

Код: Выделить всё

	for ( j=0; jmax) x[j]=1;
		else x[j]=-1;
		return *a;

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



Код:

Код: Выделить всё

for ( j=0; jmax){
        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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение AMDBulldozer »

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



Код:

Код: Выделить всё

#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 " (у меня нет такого файла и я вообще не знаю зачем он нужен) и замены _getch() на getchar() программа компилируется без ошибок или предупреждений.
Аватара пользователя
lerenia

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение lerenia »

Цитата AMDBulldozer:



#include
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




для функции get




Цитата AMDBulldozer:



Как и вообще вся функция recurs).
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




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



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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение AMDBulldozer »

Цитата lerenia:



если бы вы прочитали задание вы бы поняли для чего она
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




Честно говоря, лень было читать до конца.

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




Цитата lerenia:



если здесь не знают что такое conio и get то что вы вообще знаете про Си?
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




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



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

Re: C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Сообщение lerenia »

Цитата AMDBulldozer:



Я, простите великодушно, всю жизнь работаю на Unix
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




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




Цитата AMDBulldozer:



Я Вам их исправил.
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия





Цитата AMDBulldozer:



P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил.
C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия




Вы удалили два слова const и изменили амперсант на указатель (не понимаю вообще смысл этого действия Изображение ) и добавили два слова int но у меня компилятор все равно выдает ошибки))) Изображение

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

Вернуться в «Программирование и базы данных»