TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #20 : Декабрь 02, 2007, 06:02:55 » |
|
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> void main () { long float s,x,st,y; int k;
for (x=0;x<=M_PI/3.;x=x+M_PI/24.) { k=0; s=0; st=pow(10,15); while(st>=pow(10,-5)) { st=fabs((-pow(3,2*k+1)*x)/(pow(3,2*k)-3)); s=s+st; k=k+1; } y=pow(sin(x),7); s=s/4.;
printf("x=%f k=%d s=%f y=%f\n",x,k,s,y); } } 14-я строка OVERFLOW - переполнение, хотя первое значение к=0, т е возводит в степень 1 и 0, те получается 3 и 1, как тут может быть переполнение ?
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Alder
|
|
« Ответ #21 : Декабрь 02, 2007, 06:18:13 » |
|
TARAKAN, у тебя просто условие цикла выполняется всегда. Возьми дебаггером проверь - на первых шагах все нормально. А потом к становится равным что-то в районе 12000, просто на современных компах все очень быстро считается Вот тебе немного модифицировання программа для отладки. Для вывода следующей строки нажимай любую клавишу. Ты увидишь, что вначале все вычисляется правильно #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> void main () {
long float s,x,st,y; int k;
for (x=0;x<=M_PI/3.;x=x+M_PI/24.) { k=0; s=0; st=pow(10,15); while(st>=pow(10,-5)) { st=fabs((-pow(3,2*k+1)*x)/(pow(3,2*k)-3)); s=s+st; printf("k=%d st=%f s=%f \n",k,st,s); getch(); k=k+1; } y=pow(sin(x),7); s=s/4.; printf("x=%f k=%d s=%f y=%f\n",x,k,s,y); } }
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #22 : Декабрь 02, 2007, 06:39:34 » |
|
Alder Тогда я запутался ... у меня было st=fabs(pow(-1,k+1)*(pow(3,2*k+1)-3)*pow(x,2*k+1)/fact(2*k+1)); но видетели им не нравится факториал в знаменателе, надо вывести рекурентную формулу, вывел рекурентную формулу ... нашел в ней ошибку только что (в знаменателе 2*k+2 еще), но дела не меняет ошибка в pow все равно ... st=fabs((-pow(3,2*k+1)*x)/((pow(3,2*k)-3)*(2*k+2))); и что с ней делать ? засунул вместо 1-го, но теперь выдает эту ошибку... и что делать тогда ? =\
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Alder
|
|
« Ответ #23 : Декабрь 02, 2007, 06:52:55 » |
|
TARAKAN, скорее всего ошибка в формуле. Почему ошибка в pow я тебе уже написал - происходит переполнение при значениях к в районе 10000 и более. Как вариант - можешь выразить степень через логарифм, но тогда усложнишь выражение. Внимательнее просмотри формулу - может неправильно вывел рекурентное соотношение.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #24 : Декабрь 02, 2007, 07:12:12 » |
|
Так-с похоже целый день делать д/з это нехорошо ... банальная описка ... в самой программе ... (нашел старые бумажке где выводил формулу) ... голова совсем не работает ... #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> void main () { long float s,x,st,y; int k;
for (x=0;x<=M_PI/3.;x=x+M_PI/24.) { k=0; s=0; st=pow(10,15); while(st>=pow(10,-5)) { st=fabs(((-pow(3,2*k+1)-1)*x)/((pow(3,2*k)-1)*(2*k+2))); s=s+st; k=k+1; } y=pow(sin(x),7); s=s/4.;
printf("x=%f k=%d s=%f y=%f\n",x,k,s,y); } } Выдает ошибку (прикрепил к сообщению) ... ... значения там должны быть очень маленькими в функции ...
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Alder
|
|
« Ответ #25 : Декабрь 02, 2007, 07:18:05 » |
|
TARAKAN, пишет "Квадратный корень из отрицательного числа". Но именно корня я у тебя не вижу в программе. Может с расстановкой скобок напутал? З.Ы. Используй старый добрый Borland C++ 3.1 Это совет.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #26 : Декабрь 02, 2007, 07:54:16 » |
|
AlderПереписал всю программу нашел кучу ошибок ... ну это исправил ... тут проблема получше нашлась ... При первом шаге у нас x=0 и k=0 и получается такая вещ... st=fabs( -((pow(3,2*k)-1)*(2*k+2)) / (x*(pow(3,2*k+1)-1)) ); В числителе 0 и в знаменателе 0 ... в знаменателе все исправляется если сделать шаг не с 0 а с M_PI/24. , но вот в числителе ... если поставить степень 2k+1 (или любую другую) то вылетает ошибка с pow, а если оставить так как есть получается что st< точности и выходим из цикла ... Посмотрел все с самого начала ... условие верное ... Ладно ... принесу завтра на проверку, посмотрю еще раз в методичке условие (хотя сомневаюсь, что условие неправилньо записал) ... и если совпадет интересно, что скажет на это Александр Иванович =\ З.Ы. В нем и делаю сейчас ...
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #27 : Декабрь 03, 2007, 12:42:30 » |
|
LazarusLongЯсно, спс, уточню задание всетаки завтра и тогда доделаю. Сижу разбираюсь с методом быстрой сортировки ... в целых числах все нормально работает #include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> void sort(int *mas, long n) { long i=0, j=n; int t,p; int sr; sr=(int)floor(n/2.); p = mas[sr]; do { while ( mas[i]<p) i++; while ( mas[j]>p) j--;
if (i <= j) { t=mas[i]; mas[i]=mas[j]; mas[j]= t; i++; j--; } } while ( i<=j ); if ( j > 0 ) sort(mas, j); if ( n > i ) sort(mas+i, n-i); }
void main () { int i,j,n; int mas[20]; randomize(); do { printf("vvedite n\n"); scanf("%d",&n); } while(n>19); for(i=0;i<n;i++) { mas[i]=random(101); printf("%d ",mas[i]); } printf("\n\n\n"); sort(&mas[0],n); for(i=0;i<n;i++) { printf("%d ",mas[i]); } } Но когда пытаюсь переделать все на вещественные 1-й эл-т равен 0, а максимального эл-та после сортировки вобще нету, те сортировка идет, только сбивается указатель и значения заносятся не в ту область памяти что надо, а на +1 больше и потом при выводе получется что 1-й эл-т не заполнялся (т е равен 0), а последний мы не вывели, т к он записан на 1 ячейку дальше чем надо. (эксперементально проверил, что так оно и есть, эл-ты записываются в ячейки не i, а i+1, и последний выходит за границу). Прикрепил скрин результата, если выводить значения на 1 ячейку дальше чем занимает массив, на нем как раз видел сдвиг этот .... Конечно можно сделать так чтобы выводило результат корректно, но почему с целыми нормалньо все, а в вещественных сдвигается =\ #include<conio.h> #include<math.h> #include<stdlib.h> void sort(float *mas, long n) { long i=0, j=n; float t,p; int sr; sr=(int)floor(n/2.); p = mas[sr]; do { while ( mas[i]<p) i++; while ( mas[j]>p) j--;
if (i <= j) { t=mas[i]; mas[i]=mas[j]; mas[j]= t; i++; j--; } } while ( i<=j ); if ( j > 0 ) sort(mas, j); if ( n > i ) sort(mas+i, n-i); }
void main () { int i,j,n; float mas[20]; randomize(); do { printf("vvedite n\n"); scanf("%d",&n); } while(n>19); for(i=0;i<n;i++) { mas[i]=(float)random(10100)/100; printf("%.2f ",mas[i]); } printf("\n\n\n"); sort(&mas[0],n); for(i=0;i<n;i++) { printf("%.2f ",mas[i]); } }
|
|
« Последнее редактирование: Декабрь 03, 2007, 12:29:05 от Alder »
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Archangel
Профессор
Карма: +17/-2
Offline
Пол:
Сообщений: 999
|
|
« Ответ #28 : Декабрь 22, 2007, 01:09:25 » |
|
Задание:Разработать программу для управления светодиодами в строке. При нажатии/отпускании кнопки соответствующие светодиоды мигают с частотой 0,5 Гц, при повторном нажатии/отпускании - гаснут. Кнопки:4 - 1, 2 светодиоды 3 - 3, 4 2 - 5, 6 1 - 7, 8 1 светодиод соответствует младшему биту. КОД:#include <stdio.h> #include <sys/io.h>
int main() { int flag[4], i, mask[3], toport; flag[0]=flag[1]=flag[2]=flag[3]=1; mask[1]=0x20; mask[2]=0x10; mask[3]=0x8; char button, button_new; if(ioperm(0x378,3,1)==-1) { printf("Can't get access to i/o ports!\n"); _exit(1); } for(;;) { button=inb(0x379); usleep(20000); button_new=inb(0x379); if(button==button_new) { if(button&0x80==1) flag[0]=-flag[0]; for(i=0;i<4;i++) { if(button&mask[i]==0) flag[i]=-flag[i]; } } if(flag[0]<0) toport=toport+192; else toport=toport&252; for(i=0;i<4;i++) { if(flag[i]<0) toport=toport|3<<(2*i); else toport=toport&(~(3<<(2*i))&255); } outb(toport, 0x378); sleep(1); toport=0; outb(toport, 0x378); usleep(980000); } ioperm(0x378,3,0); return 0; }
Проблема с считыванием нажатой кнопки, кнопки подключены к LPT к выводам 15,13,12,11, указаным на рисунке. Стенд на других лабах работает, на него грешить не получается. Но почему то у меня по нажатию кнопки ничего не происходит, ни на одну кнопку не реагирует. На сколько я понял проблема в первых 30 строках, но не могу понять где имено? ЗЫ И еще маленький бок почему-то на после выполнения первых строк 20, flag[0]=8, не сильно мешает, но с чего
|
|
|
Записан
|
Птицей Гермеса меня называют. Крылья свои пожирая, сам я себя укрощаю.
|
|
|
Archangel
Профессор
Карма: +17/-2
Offline
Пол:
Сообщений: 999
|
|
« Ответ #29 : Декабрь 23, 2007, 06:53:51 » |
|
Тут с товарищем некоторые ошибки, но они не решают поставленных вопросов: 23 и 35 строки i=1(вместо i=0). 34 строка toport&63(вместо toport&252)
(Отправлено в: 22 Декабря 2007, 01:00:47)
Чего то все притихли, неужели никто не в курсе?
|
|
« Последнее редактирование: Март 15, 2008, 11:59:20 от Романыч »
|
Записан
|
Птицей Гермеса меня называют. Крылья свои пожирая, сам я себя укрощаю.
|
|
|
Storm
Верховный
Администратор
Аспирант
Карма: +29/-0
Offline
Пол:
Сообщений: 484
|
|
« Ответ #30 : Декабрь 24, 2007, 08:43:25 » |
|
toport в тип char, компиляция с ключом -O2
|
|
|
Записан
|
Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн) ---------------------------------------------------- "There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson
Проходит ирландец мимо паба....
|
|
|
Archangel
Профессор
Карма: +17/-2
Offline
Пол:
Сообщений: 999
|
|
« Ответ #31 : Декабрь 24, 2007, 12:11:15 » |
|
Я то конечно попробую, только как toport повлияет на ввод, у меня с выводом проблем не было, а вот со вводом ...
Дальнейшее обсуждение в ЛС Романыч
|
|
« Последнее редактирование: Март 15, 2008, 12:00:25 от Романыч »
|
Записан
|
Птицей Гермеса меня называют. Крылья свои пожирая, сам я себя укрощаю.
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #32 : Март 03, 2008, 06:25:25 » |
|
Здравствуйте, у меня такой вопрос, если у меня есть к примеру 2 объекта, один из них относиться к классу "Матрица", второй к классу "Вектор". 2-ой объект, относящийся к классу "Вектор" являеться полем 1-ого объекта "Матрица", то есть получаеться "класс в классе", как обратиться к методам объекта "Вектор", который в свою очередь являеться свойством 1-ого объекта "Матрица"
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #33 : Март 03, 2008, 06:46:59 » |
|
Матрица.Вектор.Метод();
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #34 : Март 03, 2008, 10:45:53 » |
|
Объясните пожалуйста, в каких случаях при использовании ссылочных аргументов в функции, компилятор создает временные переменные, а в каких нет Заранее благодарен за ответ !
|
|
|
Записан
|
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #35 : Март 05, 2008, 09:38:47 » |
|
Мне нужно создать динамический массив объектов, и сделать это нужно с помощью конструктора с параметром. Но ведь в С++ НЕЛЬЗЯ СОЗДАТЬ ДИНАМИЧЕСКИЙ МАССИВ ОБЪЕКТОВ С ПОМОЩЬЮ КОНСТРУКТОРА С ПАРАМЕТРАМИ. Как это сделать ? Некоторые соображения у меня есть, но не знаю насколько они правильны. Если есть какие-нибудь предложения то пишите. Заранее спасибо !!! class vektor { private: int sizeX; float *X;
public: vektor(int size); ~vektor(); void printVektor()const; };
vektor::vektor(int size): sizeX(size) { X=new float[sizeX]; cout<<endl<<"Created VEKTOR !!!"; }
vektor::~vektor() { delete X; cout<<endl<<"Destroyed VEKTOR !!!"; }
class matrix { private: int m,n; vektor *X[];
public: matrix(int sizeM,int sizeN); ~matrix(); void printMatrix()const; };
matrix::matrix(int sizeM,int sizeN): m(sizeM),n(sizeN) //этот конструктор с параметрами меня и волнует, правильно ли я выделил память под массив объектов ??? { int i; for(i=0;i<m;i++) { *(X+i)=new vektor(n); } cout<<endl<<"Created MATRIX !!!"; }
matrix::~matrix() { delete[]X; cout<<endl<<"Destroyed MATRIX !!!"; }
|
|
« Последнее редактирование: Март 05, 2008, 09:49:16 от artem90 »
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #36 : Март 05, 2008, 09:57:32 » |
|
Вот тебе два примера кода void swap ( int & x, int & y) { int z=y; y=x; x=z; }
main() { int a=3, b=5; swap(a,b); return 0; }
void swap ( int & x, int & y) { int z=y; y=x; x=z; }
main() { float a=3, b=5; swap(a,b); return 0; }
В первом случае переменные не будут создаваться. Во втором - будут. Почему - думай сам
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #37 : Март 05, 2008, 10:00:34 » |
|
Ну там в 1-ом случае все НОРМ, а во 2-ом НЕСООТВЕТСТВИЕ ТИПОВ ДАННЫХ!!! А разве я в своем коде где-то напортачил с типами ??
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #38 : Март 05, 2008, 10:05:28 » |
|
artem90, я не знаю. Ты задал вопрос. Я тебе привел в ответ пример. Вот тебе дословно цитата из книги При использовании ссылок необходимо следить за соответствием типа ссылки при объявлении функции и типа используемого фактического параметра. При их несовпадении компилятор создает временную переменную нужного типа, копирует в нее значение фактического параметра, а вызываемая функция работает с этой временной переменной.
А портачил ты или не портачил с типами, я, честно говоря, не в курсе.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #39 : Март 05, 2008, 10:08:26 » |
|
LazarusLong, спасибо за ответ!!! я сразу не понял, на какой вопрос ты ответил!!! я со ссылками уже разобрался, я подумал что ты на счет выделения памяти под массив динамических объектов хотел сказать !!!
|
|
|
Записан
|
|
|
|
|