Показать полную графическую версию : Потоковый ввод и ввод с клавиатуры. Рекурсия
Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива 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
lerenia, на то, что код писали не Вы, указывают два факта:
Дана матрица А(5х5) »
В коде определена константа n равная 3. Она используется для формирования массива и для проведения операций над ним.
до конца дописать так и не смогла там ошибка »
Я посмотрел "туда" - "там" все правильно.
Сформулируйте вопрос\проблему.
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
lerenia, приведенный Вами код не компилируется ( компилятор из поставки VS сообщает о 75 ошибках ).
Прикрепите такой код, который компилируется, текстовым файлом.
deviance, поэтому я и написал, здесь синтаксические ошибки, которые я не понимаю, я делала с примера одномерного массива, и другой рекурсии, поэтому ошибок куча, какие могу исправляю остальные просто не понимаю что означают(
deviance
11-05-2013, 00:55
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
Внес изменения чтобы программа хотя бы компилировалась
#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() программа компилируется без ошибок или предупреждений.
#include <conio.h> »
для функции get
Как и вообще вся функция recurs). »
если бы вы прочитали задание вы бы поняли для чего она
На этом форуме вообще опасно что то спрашивать, если здесь не знают что такое conio и get то что вы вообще знаете про Си?
AMDBulldozer
11-05-2013, 17:19
если бы вы прочитали задание вы бы поняли для чего она »
Честно говоря, лень было читать до конца.
Вообще-то, до сего момента я наивно полагал, что смысл подпрограммы должен быть понятен из исходного текста. И только теперь до меня дошло, что бывают подпрограммы для понимания которых необходимо знать условия задачи! :wink:
если здесь не знают что такое conio и get то что вы вообще знаете про Си? »
Я, простите великодушно, всю жизнь работаю на Unix. Меня не интересуют заголовочные файлы MS-DOS. Так что Ваш риторический вопрос можно переформулировать: "если вы не знаете MS-DOS, то что вы вообще знаете про Си?" :wink:
P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил. Благо на это потребовалось меньше времени, чем на прочтение условий Вашей задачи. После этого мне тут же сообщили, что я не разбираюсь в C. :wink: Если подобный вид помощи Вам не нужен - не вопрос. Торжественно клянусь никогда больше не писть в Ваших темах! :)
Я, простите великодушно, всю жизнь работаю на Unix »
и отвечаете в теме С/С++
Я Вам их исправил. »
P.S. В этой теме Вы сами жаловались, что не можете исправить ошибки компиляции. Я Вам их исправил. »
Вы удалили два слова const и изменили амперсант на указатель (не понимаю вообще смысл этого действия :dont-know ) и добавили два слова int но у меня компилятор все равно выдает ошибки))) :)
А мистер deviance, вообще назвал мою работу плагиатом и вообще не увидел ошибок сказал что там все правильно, каждый раз когда пишу на это форуме либо указывают на тупость либо хамят, это местная фишка этого форума?
AMDBulldozer
11-05-2013, 19:03
Хорошо, уговорили. Всё-таки отвечу еще раз.
и отвечаете в теме С/С++ »
Если ничего другого нет, читать Википедию (https://ru.wikipedia.org/wiki/%D0%A1%D0%B8_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%8 0%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29) до полного просветления:
Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в 1969—1973 годах сотрудниками Bell Labs Кеном Томпсоном и Деннисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX.
Вообще говоря, стыдно не знать. Вы, вероятно, полагали, что его в 1971 для MS-DOS выпустили? Разочарую - Билл Гейтс в то время в школу ходил.
изменили амперсант на указатель (не понимаю вообще смысл этого действия ) »
В школе это Вам называли "передачей параметра по ссылке". Кстати, в Вашей программе переменная sum как раз и имеет тип указателя на int.
у меня компилятор все равно выдает ошибки »
Что могу сказать? Значит плохой у Вас компилятор. Предложенный мной текст, за исключением, разумеется, комментариев, полностью соответствует стандарту ANSI.
Замените формат Ваших комментариев с "// комментарий" на традиционный "/* комментарий */" и если после этого компилятор будет выдавать ошибки, то выбросьте его на помойку.
Максимум, в этой программе компилятор может выдать одно предупреждение (не ошибку!) об отсутствии оператора return в функции recurs.
Tramvaichik
11-05-2013, 22:44
А мистер deviance, вообще назвал мою работу плагиатом и вообще не увидел ошибок сказал что там все правильно, каждый раз когда пишу на это форуме либо указывают на тупость либо хамят, это местная фишка этого форума? »
Почему вы не хотите разобраться, когда вам нормально люди обьясняют?
Delirium
12-05-2013, 16:50
поэтому я и написал »
я делала »
Так все таки как верно то? :)
lerenia, дабы не создалось ложного впечатления о форуме и отвечающих:
Ваш вопрос каждый из отметившихся здесь может решить за 15 минут. НО! Мы не решаем за вас ваши задачи, т.к. таких вопросов в день по десятку, а мы не альтруисты сидеть и выполнять за вас ваши лабораторные и прочее. Мы можем помочь, направить на верный ответ, указать на ошибку и т.п. Но после того, как был выложен хотя бы компилирующийся код AMDBulldozer, я думаю надо задуматься о корректной работе вашего ПО.
Ваш вопрос каждый из отметившихся здесь может решить за 15 минут. НО! Мы не решаем за вас ваши задачи »
Я не просила решить, я просила помочь, я пыталась, делала, но в первых же сообщениях на меня нагнали что это плагиат и оказывается код у меня не компилируется, хотя наверное именно по этой причине я и попросила помощи!
Так все таки как верно то? »
Это столь существенная опечатка? я делала »
Здесь скорее любят показывать свое превосходство, нежели помогать
Почему вы не хотите разобраться, когда вам нормально люди обьясняют? »
Потому что здесь не объясняют, а репетитор довольно дорогое удовольствие
Delirium
15-05-2013, 14:07
lerenia, Вам указали на ошибки в коде. Вам сделали проект, который хотя бы компилируется без ошибок. Вам указали, где ошибки. Что еще вы считаете за помощь?
Вы проверили предложенный код? Сменили компилятор? Увидели ошибки? Если да, то в чем загвоздка. Если же нет, то ...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.