КИТА unofficial
Ноябрь 22, 2024, 10:18:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 [2] 3 4 ... 12   Вниз
  Печать  
Автор Тема: Вопросы в С/С++  (Прочитано 161849 раз)
0 Пользователей и 1 Гость смотрят эту тему.
TARAKAN
Tifon
Бакалавр
**

Карма: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #20 : Декабрь 02, 2007, 06:02:55 »

Код: (cpp)
#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);
}
}
Код:
pow: OVERFLOW error
14-я строка
OVERFLOW - переполнение, хотя первое значение к=0, т е возводит в степень 1 и 0, те получается 3 и 1, как тут может быть переполнение ?
Записан

Студент: По моему легче использовать printf...
EvilMax: Зато cout - это тру! = ))
Alder
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #21 : Декабрь 02, 2007, 06:18:13 »

TARAKAN, у тебя просто условие цикла выполняется всегда. Возьми дебаггером проверь - на первых шагах все нормально. А потом к становится равным что-то в районе 12000, просто на современных компах все очень быстро считается Улыбка

Вот тебе немного модифицировання программа для отладки. Для вывода следующей строки нажимай любую клавишу. Ты увидишь, что вначале все вычисляется правильно Улыбка
Код: (cpp)
#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 Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #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
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #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 Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #24 : Декабрь 02, 2007, 07:12:12 »

Так-с похоже целый день делать д/з это нехорошо ... банальная описка ... в самой программе ... (нашел старые бумажке где выводил формулу) ... голова совсем не работает ...
Код: (cpp)
#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
Администратор
Проректор
*****

Карма: +331/-16
Offline Offline

Пол: Мужской
Награды:
За II место в конкурсе поэзии (весна-2007)2 место в фотоконкурсе \За II место в фотоконкурсе \3 место в фотоконкурсе \2 место в фотоконкурсе \Лучший знаток музыки 2009Лучший знаток музыки 2010
Сообщений: 11224


just for fun


WWW
« Ответ #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 Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #26 : Декабрь 02, 2007, 07:54:16 »

Alder
Переписал всю программу нашел кучу ошибок ... ну это исправил ... тут проблема получше нашлась ...
При первом шаге у нас x=0 и k=0
и получается такая вещ...
Код: (cpp)
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 Offline

Пол: Мужской
Сообщений: 134


WWW
« Ответ #27 : Декабрь 03, 2007, 12:42:30 »

LazarusLong
Ясно, спс, уточню задание всетаки завтра и тогда доделаю.


Сижу разбираюсь с методом быстрой сортировки ... в целых числах все нормально работает
Код: (cpp)
#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 ячейку дальше чем занимает массив, на нем как раз видел сдвиг этот ....
Конечно можно сделать так чтобы выводило результат корректно, но почему с целыми нормалньо все, а в вещественных сдвигается =\
Код: (cpp)
#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 Offline

Пол: Мужской
Сообщений: 999



« Ответ #28 : Декабрь 22, 2007, 01:09:25 »

Задание:
Разработать программу для управления светодиодами в строке. При нажатии/отпускании кнопки соответствующие светодиоды мигают с частотой 0,5 Гц, при повторном нажатии/отпускании - гаснут.
Кнопки:
4 - 1, 2 светодиоды
3 - 3, 4
2 - 5, 6
1 - 7, 8
1 светодиод соответствует младшему биту.
КОД:
Код: (c)
#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 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 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 Offline

Пол: Мужской
Сообщений: 999



« Ответ #31 : Декабрь 24, 2007, 12:11:15 »

Я то конечно попробую, только как toport повлияет на ввод, у меня с выводом проблем не было, а вот со вводом ...

Дальнейшее обсуждение в ЛС
Романыч
« Последнее редактирование: Март 15, 2008, 12:00:25 от Романыч » Записан

Птицей Гермеса меня называют. Крылья свои пожирая, сам я себя укрощаю.
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #32 : Март 03, 2008, 06:25:25 »

Здравствуйте, у меня такой вопрос, если у меня есть к примеру 2 объекта, один из них относиться к классу "Матрица", второй к классу "Вектор". 2-ой объект, относящийся к классу "Вектор" являеться полем 1-ого объекта "Матрица", то есть получаеться "класс в классе", как обратиться к методам объекта "Вектор", который в свою очередь являеться свойством 1-ого объекта "Матрица" Непонимающий
 
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #33 : Март 03, 2008, 06:46:59 »

Матрица.Вектор.Метод();
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #34 : Март 03, 2008, 10:45:53 »

Объясните пожалуйста, в каких случаях при использовании ссылочных аргументов в функции, компилятор создает временные переменные, а в каких нет Непонимающий Заранее благодарен за ответ !  Улыбка
Записан
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #35 : Март 05, 2008, 09:38:47 »

Мне нужно создать динамический массив объектов, и сделать это нужно с помощью конструктора с параметром. Но ведь в С++ НЕЛЬЗЯ СОЗДАТЬ ДИНАМИЧЕСКИЙ МАССИВ ОБЪЕКТОВ С ПОМОЩЬЮ КОНСТРУКТОРА С ПАРАМЕТРАМИ. Как это сделать Непонимающий? Некоторые соображения у меня есть, но не знаю насколько они правильны. Если есть какие-нибудь предложения то пишите. Заранее спасибо !!!  Улыбка

Код: (cpp)
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 Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #36 : Март 05, 2008, 09:57:32 »

Вот тебе два примера кода
Код: (cpp)
        
void swap ( int & x, int & y)
{
     int z=y;
     y=x;
     x=z;
}

main()
{
     int a=3, b=5;
     swap(a,b);
     return 0;
}


Код: (cpp)
        
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 Offline

Пол: Мужской
Сообщений: 1107


« Ответ #37 : Март 05, 2008, 10:00:34 »

Ну там в 1-ом случае все НОРМ, а во 2-ом НЕСООТВЕТСТВИЕ ТИПОВ ДАННЫХ!!!

А разве я в своем коде где-то напортачил с типами Непонимающий??
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #38 : Март 05, 2008, 10:05:28 »

artem90, я не знаю. Ты задал вопрос. Я тебе привел в ответ пример. Вот тебе дословно цитата из книги

Цитировать
При использовании ссылок необходимо следить за соответствием типа ссылки при объявлении функции и типа используемого фактического параметра. При их несовпадении компилятор создает временную переменную нужного типа, копирует в нее значение фактического параметра, а вызываемая функция работает с этой временной переменной.
А портачил ты или не портачил с типами, я, честно говоря, не в курсе.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Артем
sprata
Mодератор
Завкаф
*****

Карма: +40/-5
Offline Offline

Пол: Мужской
Сообщений: 1107


« Ответ #39 : Март 05, 2008, 10:08:26 »

LazarusLong, спасибо за ответ!!! я сразу не понял, на какой вопрос ты ответил!!! я со ссылками уже разобрался, я подумал что ты на счет выделения памяти под массив динамических объектов хотел сказать !!!
Записан
Страниц: 1 [2] 3 4 ... 12   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.123 секунд. Запросов: 33.