0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 21
|
||||||
1 | ||||||
немогу найти, почему висьнет программа...04.06.2009, 10:40. Показов 1255. Ответов 9
Метки нет Все метки)
(программа
0
|
|
04.06.2009, 10:40 | |
Ответы с готовыми решениями:
9
Немогу понять почему в программе выкидует ошибка Почему немогу покорить частоту 3720 или выше ? Немогу разобраться, почему выводит каждое число по 20 раз? Почему после смени Сд Рома на ноуте немогу запустить установочний диск? |
![]() 2254 / 769 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||||||||||||||||||||||||||||||
04.06.2009, 12:09 | 2 | ||||||||||||||||||||||||||||||
При каком вводе зависвает программа? Нет времени,чтобы изучать всю программу,уж извини.
Добавлено через 17 минут 8 секунд смутило очень сильно : в функции matrix :
дальше.
Зависает определенно из-за рекурсии.Суть рекурсии в том,чтобы свести задачу к более простой,от меньшего числа данных,например.У тебя рекурсия выглядит так :
Добавлено через 4 минуты 54 секунды Ну а это что? ![]()
:'( Добавлено через 3 минуты 11 секунд Вечером приду - помогу посерьезней
1
|
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 21
|
|
05.06.2009, 06:35 [ТС] | 3 |
я исправила кое-что,теперь осталось :1.-при выводе результат рекурсии, программа ругается на А1, В1, D, если нажимать "продолжить", то она все считает =(. 2.-при расчете матрицы программа просит еще 3 раза вводить массивы А и В, и считает по 3 введенному, а не по тому где я ввожу в меня ввода данных =(
Остальное работает =) Код
[CPP]#include "stdafx.h" // подключается файл stdafx.h
#include <stdio.h> //Функции ввода - вывода для стандартных потоков #include <conio.h> //Функции для работы с терминалом в текстовом режиме #include <ctype.h> //Функции и макросы проверки и преобразования символов #include <stdlib.h> //Функция для работы с динамической памятью #include <string.h> //Функция работы со строками #include <math.h> //функция для работы с математическими функциями #include <malloc.h> #include "locale.h" //Функция для подключения русского языка void zad_rec(); // задание рекурсии void zad_matrica(); //задание матрица void inform_rec(); //онформация рекурсия void inform_matrica(); //информация матрица int input(int,char,char); //ввод размерности double input_massiv1(int,double **); //ввод массива а double input_massiv2(int,double **); //ввод массива в void output(int,char, char, char,double , double**, double **, double **); //вывод double recursia(int); //рекурсия double matrix(int,double **, double**, double **, double **,double **); //матрица int zashita_rec(); // Функция защиты при вводе N в рекурсии int zashita_matrica(); // Функция защиты при вводе N в матрице int zashita_elem(); // Функция защиты при вводе элементов в матрице void main() { setlocale(LC_ALL,"Russian"); char c='\0'; char typeTask='\0', //тип задания typeInput='\0', //способ ввода данных typeOutput='\0'; //способ вывода данных int N=20; double itog=0; //рекурсия double **A,**A1; double **B, **B1; double **D; int i, j; int k=2; do { //textbackground(BLACK); system("cls"); c=0; printf("1. Выбор задания\n"); printf("2. Ввод данных\n"); printf("3. Расчет\n"); printf("4. Вывод результата\n"); printf("5. Информация\n"); printf("6. Текст задания\n"); printf("7. Выход\n"); printf("Выберите пункт меню:\n"); while ((c = _getch()) < '1'|| c > '7') printf("\rВыберите пункт меню: \n"); switch(c) { // ВЫБОР ЗАДАНИЯ case '1': system("cls"); c = '\0'; printf("1. Матрицы\n"); printf("2. Рекурсия\n"); printf("Выберите тип задания >>> \n"); while ((c = _getch()) < '1' || c > '2') printf("\rВыберите тип задания >>> \n"); typeTask = c; // Флаговая переменная определяющая тип задания break; // ВВОД ДАННЫХ case '2': system("cls"); c = '\0'; switch(typeTask) { case '1': system("cls"); if(typeTask == '2' || typeTask == '1') { printf("1. С клавиатуры\n"); printf("2. Из файла\n"); printf("Выберите способ ввода данных >>> \n"); while ((c = _getch()) < '1' || c > '2') printf("\rВыберите способ ввода данных >>>\n "); typeInput = c; /* Флаговая переменная определяющая способ ввода данных */ N=input(N,typeInput,typeTask); { A=(double**)malloc(N*sizeof(double*)); B=(double**)malloc(N*sizeof(double*)); A1=(double**)malloc(N*sizeof(double*)); B1=(double**)malloc(N*sizeof(double*)); D=(double**)malloc(N*sizeof(double*)); for (i=0; i<N; i++) { A[i]=(double*)realloc(0,N*sizeof(double)); B[i]=(double*)realloc(0,N*sizeof(double)); A1[i]=(double*)realloc(0,N*sizeof(double)); B1[i]=(double*)realloc(0,N*sizeof(double)); D[i]=(double*)realloc(0,N*sizeof(double)); } **A=input_massiv1(N , A); **B=input_massiv2(N , B); } } break; case '2': system("cls"); if(typeTask == '2' || typeTask == '1') { printf("1. С клавиатуры\n"); printf("2. Из файла\n"); printf("Выберите способ ввода данных >>> \n"); while ((c = _getch()) < '1' || c > '2') printf("\rВыберите способ ввода данных >>>\n "); typeInput = c; /* Флаговая переменная определяющая способ ввода данных */ N=input(N,typeInput,typeTask); } break; default: printf("Ошибка: задание не выбрано."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } break; // РАСЧЁТ case '3': system("cls"); c = '\0'; switch(typeTask) { case '1': system("cls"); if(typeInput=='1'||typeInput=='2') { **A1=matrix(N, A, B, A1, B1, D); **B1=matrix(N, A, B, A1, B1, D); **D=matrix(N, A, B, A1, B1, D); printf("Расчет произведен."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } else { printf("Ошибка: данные не введены."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } break; case '2': system("cls"); if(typeInput=='1'||typeInput=='2') { itog=recursia(N); printf("Расчет произведен."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } else { printf("Ошибка: данные не введены."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } break; default: printf("Ошибка: задание не выбрано."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } break; /* ВЫВОД РЕЗУЛЬТАТА */ case '4': system("cls"); if(itog==NULL && k==NULL) { printf("Ошибка: расчет не произведен."); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } else { c = '\0'; printf("1. На экран\n"); printf("2. В файл\n"); printf("Выберите способ вывода результата >>> "); while ((c = _getch()) < '1' || c > '2') printf("\rВыберите способ вывода результата >>> "); typeOutput = c; // Флаговая переменная определяющая способ вывода данных output(N, typeInput, typeTask, typeOutput, itog , A1, B1, D); } break; // ИНФОРМАЦИЯ case '5': system("cls"); { c = '\0'; switch(typeTask) { case '1': system("cls"); inform_matrica(); break; case '2': system("cls"); inform_rec(); break; default: printf("Задание не выбрано"); } printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); break; } /* ТЕКСТ ЗАДАНИЯ */ case '6': system("cls"); c = '\0'; switch(typeTask) { case '1': system("cls"); zad_matrica(); break; case '2': system("cls"); zad_rec(); break; default: printf("Задание не выбрано"); } printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); break; /* ВЫХОД */ case '7': system("cls"); printf("Выйти?\r\n"); printf("1. Да\n"); printf("2. Нет\n"); printf(">>>\n"); while ((c = _getch()) != '1' && c != '2') printf("\r>>> \n"); if (c == '1') { c = '7'; } else { c = '\0'; } break; } } while(c!='7'); } void inform_matrica() { printf("\n\t\tИнформация о задании № 1:\n"); printf(" Задание по матрицам № 717а.\n"); printf(" Версия 1.2\n"); printf(" 2009 год\n"); printf(" Разработчик : Скопина Кристина,\n"); printf(" студентка ВятГУ гр. ПС-11\n"); } void inform_rec() { printf("\n\t\tИнформация о задании № 2:\n"); printf(" Задание по рекурсии № 214.\n"); printf(" Версия 1.2\n"); printf(" 2009 год\n"); printf(" Разработчик : Скопина Кристина,\n"); printf(" студентка ВятГУ гр. ПС-11\n"); } void zad_matrica() { printf("\n\t---------------------------------------------------------------------"); printf("\n\t Задание(матрица): "); printf("\n\t---------------------------------------------------------------------"); printf("\n\t \n"); printf("\t Две треугольные матрицы А и В порядка n заданны в виде \n"); printf("\t последовотельности (n+1)n\2 чисел: сначала идет n элементов \n"); printf("\t первой строки,затем n-1 элементов второй строки, начиная со второго \n"); printf("\t элемента, и т.д. (из последней n строки берется только n элемент).\n"); printf("\t Получить в аналогичном виде: \n"); printf("\t матрицу А*В. \n"); printf("\t \n"); printf("\n\t---------------------------------------------------------------------"); } void zad_rec() { printf("\n\t---------------------------------------------------------------------"); printf("\n\t Задание(рекурсия): "); printf("\n\t---------------------------------------------------------------------"); printf("\n\t "); printf("\n\t Пусть a0=Cos(1)*Cos(1), a1=-Sin(1)*sin(1), "); printf("\n\t ak=2a(k-1)-a(k-2), k=2,3.... "); printf("\n\t найти сумму квадратов(от 1 до N) ! "); printf("\n\t "); printf("\n\t---------------------------------------------------------------------"); } // ФУНКЦИЯ ДЛЯ ВВОДА N int input(int N ,char typeInput , char typeTask) { FILE *W; char file[256]; int const maxNat=10; //ограничение на размерность матрицы int const maxNatt=80; //ограничение на рекурсию if(typeTask == '2') //ввод данных для рекурсии { if(typeInput == '1') //с клавиатуры { system("cls"); do { printf("\n\n\tВведите число N(1 ... %d) = ", maxNatt); N=zashita_rec(); if (N>maxNatt) { printf("\n Вы ввели неправильное число."); printf("\n Нажмите любую клавишу."); _getch(); } } while (N>maxNatt); } else //из файла { do { printf("\nУкажите путь к файлу:"); scanf("%s",file); W = fopen(file,"r"); } while(W==NULL); fscanf(W,"%d %f %f",N); fclose(W); } } else //ввод данных для матрицы { if(typeInput == '1') //с клавиатуры { system("cls"); do { printf("\t Введите размерность массива ( 1 ... %d ) : ",maxNat); N=zashita_matrica(); if (N>maxNat) { printf(" Вы ввели неправильное число."); printf("\n Нажмите любую клавишу.\n"); _getch(); } } while (N>maxNat); } else //из файла { do { printf("\nУкажите путь к файлу:"); scanf("%s",file); W = fopen(file,"r"); } while(W==NULL); fscanf(W,"%d",N); fclose(W); } } return N; } /* ФУНКЦИЯ ДЛЯ ВВОДА ЭЛЕМЕНТОВ МАССИВА */ double input_massiv1(int M ,double **A) { int i,j; printf(" Заполните массив A:\n"); for ( i=0; i<M; i++) for ( j=0; j<(M-i); j++) { printf ("A[%d][%d] = ",i,j); A[i][j]=zashita_elem(); } return **A; } double input_massiv2(int M ,double **B) { int i,j; printf(" Заполните массив B:\n"); for ( i=0; i<M; i++) for ( j=0; j<(M-i); j++) { printf ("B[%d][%d] = ",i,j); B[i][j]=zashita_elem(); } return **B; } /* ФУНКЦИЯ ДЛЯ ВЫВОДА ДАННЫХ */ void output(int N,char typeInput, char typeTask, char typeOutput,double itog, double **A1, double **B1, double **C) { int i, j; FILE *W; char file[256]; if(typeTask == '2') //вывод для рекурсии { if(typeOutput == '1') //на экран { printf("\n\tПри N = %d результат равен : %.15lf",N,itog); printf("\nНажмите любую клавишу для продолжения...\n"); _getch(); } else //в файл { printf("\nУкажите путь к файлу, в который хотите сохранить результат: "); scanf("%s",&file); W = fopen(file,"a++"); fprintf(W,"\n\tПри N = %d результат равен : %.15lf",N,itog); fclose(W); printf("Результат сохранен"); printf("\nНажмите любую клавишу для продолжения..."); _getch(); } } if(typeTask == '1') //вывод для матрицы { if(typeOutput == '1') //на экран { printf("Введен массив A, размерности %d",N); printf("\n"); for (i=0;i<N;i++) { for (j=0;j<(N-i);j++) { printf("%g ",A1[i][j]); } printf("\n"); } printf("Введен массив B, размерности %d",N); printf("\n"); for (i=0;i<N;i++) { for (j=0;j<(N-i);j++) { printf("%g ",B1[i][j]); } printf("\n");} printf(" Решение:"); printf("Массив А*В\n"); for (i=0;i<N;i++) { for (j=0;j<(N-i);j++) { printf("%g ",C[i][j]); } printf("\n");} printf("\nНажмите любую клавишу для продолжения..."); _getch(); } else //в файл { printf("\nУкажите путь к файлу, в который хотите сохранить результат: "); scanf("
0
|
2342 / 498 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
05.06.2009, 07:11 | 4 |
про первую ошибку не понял.
у меня на ваш код при выводе результат рекурсии не ругается. опишите подробнее. со второй проще. зачем у вас в функции matrix, которя должна только расчитывать, стоит вызов ![]()
1
|
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 21
|
||||||
06.06.2009, 20:24 [ТС] | 5 | |||||
Сейчас ни чего не виснет, только почему-то "чтение из файла матрицы" очень странно идет. в текстовике я вводу:
2 1 2 3 4 5 6 Программа считывает N=2, а дальше какие-то числа -6б27744е+66 Почему так? Код
0
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
|
06.06.2009, 20:30 | 6 |
если виснет - 95% что где-то бесконечный цикл получается. Проверь все циклы на предмет срабатывания условия выхода.
0
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
06.06.2009, 20:43 | 7 |
Разбей программу на модули, а то смотреть на тысячу строк кода как-то страшно ))
0
|
0 / 0 / 0
Регистрация: 08.12.2008
Сообщений: 21
|
|
07.06.2009, 19:41 [ТС] | 8 |
и так по функциям программа разбита, все понятно
сейчас работает нормально, только почему-то из файла матрицу не считывает, берет числа из памяти
0
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
07.06.2009, 21:48 | 9 |
![]()
0
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
|
|
07.06.2009, 22:03 | 10 |
кто-нибудь, уберите этот ужОс.
под хайд.
0
|
07.06.2009, 22:03 | |
Помогаю со студенческими работами здесь
10
Немогу понять как работает программа Почему не работает программа? Помогите найти ошибки.
Найти ошибку почему программа всегда пишет, что зарегистрирована Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |