Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

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

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:49, 09-05-2013

 

Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


lerenia, на то, что код писали не Вы, указывают два факта:
Цитата lerenia:
Дана матрица А(5х5) »
В коде определена константа n равная 3. Она используется для формирования массива и для проведения операций над ним.
Цитата lerenia:
до конца дописать так и не смогла там ошибка »
Я посмотрел "туда" - "там" все правильно.

Сформулируйте вопрос\проблему.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:42, 10-05-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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);
}
}
Но она все равно не работает!((((((((((

Отправлено: 23:03, 10-05-2013 | #3


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:01, 11-05-2013 | #4


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:03, 11-05-2013 | #5


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


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); (?)

Последний раз редактировалось deviance, 11-05-2013 в 02:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:55, 11-05-2013 | #6


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


Внес изменения чтобы программа хотя бы компилировалась
Код: Выделить весь код
#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() программа компилируется без ошибок или предупреждений.

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Последний раз редактировалось AMDBulldozer, 11-05-2013 в 02:50.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:39, 11-05-2013 | #7


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата AMDBulldozer:
#include <conio.h> »
для функции get

Цитата AMDBulldozer:
Как и вообще вся функция recurs). »
если бы вы прочитали задание вы бы поняли для чего она

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

Отправлено: 12:49, 11-05-2013 | #8


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


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

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

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

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Последний раз редактировалось AMDBulldozer, 11-05-2013 в 18:06.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:19, 11-05-2013 | #9


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Цитата AMDBulldozer:
Я Вам их исправил. »
Цитата AMDBulldozer:
P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил. »
Вы удалили два слова const и изменили амперсант на указатель (не понимаю вообще смысл этого действия ) и добавили два слова int но у меня компилятор все равно выдает ошибки)))
А мистер deviance, вообще назвал мою работу плагиатом и вообще не увидел ошибок сказал что там все правильно, каждый раз когда пишу на это форуме либо указывают на тупость либо хамят, это местная фишка этого форума?

Отправлено: 18:06, 11-05-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Потоковый ввод и ввод с клавиатуры. Рекурсия

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Ввод с клавиатуры значения в переменную river123 Скриптовые языки администрирования Windows 8 28-05-2018 00:17
Разное - [решено] Массивы. Ввод параметра для строк и столбцов с клавиатуры,а заполнение матрицы random lenaustkz84 Программирование и базы данных 13 19-01-2012 09:03
C/C++ - [решено] Потоковый ввод/вывод котвася Программирование и базы данных 4 06-08-2010 10:39
C/C++ - Ввод формул Doom77 Программирование и базы данных 7 05-11-2009 00:49
Ввод строки с клавиатуры DJ@XON Программирование в *nix 1 06-07-2009 22:25




 
Переход