IPB

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V < 1 2 3  
Ответить в эту темуОткрыть новую тему
> С++ нахождения площади и периметра треугольника по координатам, Переход от Pascal к C++
InFuz
сообщение 6.4.2010, 9:08
Сообщение #41


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Final

Код
# include <iostream.h>
# include <stdio.h>
# include <math.h>
# include <conio.h>
# include <alloc.h>

//-----------------------------------------------------------------
    int Chislo(int x)
    {
      int j;
      if (x<4) return 1;
      else
       {
         for (j=2; j<ceil(sqrt(x))+1; j++)
         if (x%j==0) return 0;
       }
       return 1;
    }
//-----------------------------------------------------------------
    void swap(int *p)
    {
      int t=p[0];
      p[0]=p[1];
      p[1]=t;
    }
//-----------------------------------------------------------------
    void sort1(int *mas1, int n)
    {
      int again,i;
      do
      {
    again=0;
    for(i=0;i<n-1;i++)
    {
      if(mas1[i]>mas1[i+1])
      {
        swap(mas1+i);
        again=1;
      }
    }
      }
      while(again);
    }
//-----------------------------------------------------------------
    void sort2(int *mas2, int k)
    {
      int again,i;
      do
      {
    again=0;
    for(i=0;i<k-1;i++)
    {
      if(mas2[i]<mas2[i+1])
      {
        swap(mas2+i);
        again=1;
      }
    }
      }
      while(again);
    }
//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      int t,k,i2,j,j2,i,n; j=0; k=0;
      cout<<"n="; cin>>n;
      int* mas1 = new int[n];
      int* mas2 = new int[n];
      cout<<"El-ma \n"<<"\n";
      for (i=0; i<n; i++)
      {
    cin>>mas1[i];
      }
      for (i=0; i<n; i++)
      {
    cout<<"\nmas1["<<i<<"]="<<mas1[i];
      }
      cout<<"\n";
      sort1(mas1,n);
      for (i=0; i<n; i++)
      {
    cout<<"\nmas1["<<i<<"]="<<mas1[i];
      }
      cout<<"\n";
      for (i=0; i<n; i++)
      {
    if (Chislo(mas1[i])==1) {mas2[j]=mas1[i]; j=j+1; k=k+1;}
      }
      for (j=0; j<k; j++)
      {
    cout<<"\nmas2["<<j<<"]="<<mas2[j];
      }
      cout<<"\n";
      sort2(mas2,k);
      for (j=0; j<k; j++)
      {
    cout<<"\nmas2["<<j<<"]="<<mas2[j];
      }
      delete []mas1;
      delete []mas2;
      getch();
    }


Один вопрос
swap пишиться для экономии места и времени или нет?
что измениться если написать

Код
void sort1(int *mas1, int n)
    {
      int again,i,t;
      do
      {
    again=0;
    for(i=0;i<n-1;i++)
    {
      if(mas1[i]>mas1[i+1])
      {
        t=p[i];
        p[i]=p[i+1];
        p[i+1]=t;
        again=1;
      }
    }
      }
      while(again);
    }
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 6.4.2010, 13:32
Сообщение #42


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Ответ: конкретно так работать не будет, потому что переменная p в функции sort не объявлена.
А вообще, swap я написал для наглядности кода, он так понятнее.
Естественно, можно и в теле sort1/sort2 менять местами элементы массива - не возбраняется.

Остальное не глядел, работает, в принципе?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 6.4.2010, 19:13
Сообщение #43


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Ну вот тот что сверху полностью рабочий вариант, в точности совпадающий с тем что требовалось в задании.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 20.4.2010, 14:38
Сообщение #44


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Лаба №6

Создать двоичный файл и записать в него n вещественных чисел. Сформировать массив из элементов исходного файла, внеся в него числа, превосходящие среднее значение положительных элементов файла. Задание должно быть выполнено в виде 2 программ. Первая должна сформировать бинарный файл. Вторая должна выполнить задание в соответствии с вариантом (см. выше).

Сделал 1 часть.
Во второй части сделал пока чтобы читала файл и записывала это все дело в массив, не понял что значит "внеся в него числа, превосходящие среднее значение положительных элементов файла", это просто что ли любых чисел которые соответствуют условию натыкать?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 20.4.2010, 15:36
Сообщение #45


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Нет, все числа из файла, удовлетворяющие условию, я так понял задание.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 20.4.2010, 16:33
Сообщение #46


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



А я понял, вроде. Надо из файла брать (и добавлять в массив) только те числа которые соответствуют условию.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 20.4.2010, 18:27
Сообщение #47


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



да, только сначала для расчёта условий надо сначала все их прочитать
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 21.4.2010, 12:17
Сообщение #48


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Гляньте пожалуйста вроде должна работать, но чот ни фига не хочет (IMG:style_emoticons/default/blush.gif)

1 часть

Код
# include <iostream.h>
# include <stdio.h>
# include <conio.h>

//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      FILE *f;
      int i,n;
      double a;
      f=fopen("binfile.dat","wb");
      cout<<"n="; cin>>n;
      fwrite(&n, sizeof(int),1,f);
      for(i=0; i<n; i++)
      {
    cout<<"a["<<i<<"]="; cin>>a;
    fwrite(&a, sizeof(double),1,f);
      }
      fclose(f);
    }


2 часть

Код
# include <iostream.h>
# include <stdio.h>
# include <conio.h>

//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      FILE *f;
      int i,n,t=-1,s=0,sym=0;
      double *a,*b;
      cout<<"n="; cin>>n;
      f=fopen("binfile.dat","rb");
      fread(a,sizeof(int),1,f);
      a-new double[n];
      fread(a,sizeof(double),n,f);
      for(i=0; i<n; i++)
      {
    if(a[i]>0)
    {
          sym=sym+a[i];
          s++;
    }
      }
      b-new double[s];
      for(i=0; i<s; i++)
      {
    if(a[i]>(sym/s))
    {
          t++;
      b[t]=a[i];
        }
      }
      for(i=0; i<t+1; i++)
      if (t=-1) cout<<"Net takix 4isel!";
      else
      {
        cout<<"\n"<<b[i]<<"\t";
    cout<<endl;
      }
      fclose(f);
      delete[]a;
      delete[]b;
      getch();
    }
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 21.4.2010, 16:03
Сообщение #49


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Есть много комментариев по 2 части.

Зачем записывать в файл n, а потом вводить его с клавы? Что-то уж одно)

fread(a,sizeof(int),1,f); - во-первых, надо сначала выделить память под указатель, а потом уж читать в него.
во-вторых, зачем читать в массив double? Формально ничего криминального, там тип входного параметра void*, но логики не вижу.
Тут уж Вы должны n прочитать.

a-new double[n]; - очепяточка?

sym=sym+a[i]; - вообще ужас))) Куда дробные части денутся?) К целому прибавлять double'ы, это надо же.

if(a[i]>(sym/s)) - а Вы в курсе, что sym / s -это целочисленное деление? Если делить одно целое на другое, то получится опять же целое. Например 10/3 = 3
А сравниваете Вы с double, так что ошибки вполне могут иметь место)

Последние две ошибки убиваются одним выстрелом: объявлением sym как double.

b-new double[s]; - и вновь очепяточка. Да, кстати, и почему именно s? Их там всегда будет меньше.

if (t=-1) cout<<"Net takix 4isel!"; - целых два косяка. Во-первых, (t==-1), во-вторых, если уж t и принимает такое значение, то цикл не прогонится не разу. Так что следует сделать if, а уж внутри if цикл.

Остальное дело вкуса. Хотя мне лично непонятно, почему в одном случае потоки cin и cout, а в другом fopen, fread, fwrite - либо STL, либо C Library)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 22.4.2010, 12:46
Сообщение #50


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Все исправил, заработала.

Гляньте еще одну прогу.

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

Код
# include <iostream.h>
# include <stdio.h>
# include <math.h>
# include <conio.h>
# include <alloc.h>

//-----------------------------------------------------------------
    double Sred(int *a, int I, int I2)
    {
      int i,s=0,sym=0;
      for(i=I+1; i<I2-1; i++)
      {
    sym=sym+a[i];
        s++;
      }
      return (sym/s);
    }
//-----------------------------------------------------------------
    void MaxMin(int *a, int n)
    {
      int b,i,max=0,imax;
      for(i=0; i<n; i++)
      {
    if(a[i]>max)
        {
      imax=i;
      max=a[i];
        }
      }
      int min=0,imin;
      for(i=0; i<n; i++)
      {
    if(a[i]<min)
        {
      imin=i;
      min=a[i];
        }
      }
      b=max;
      a[imax]=a[imin];
      a[imin]=max;
    }
//-----------------------------------------------------------------
    int main()
    {
      clrscr();
      int b,i,I,n,I2,s=0;
      cout<<"n="; cin>>n;
      int* a = new int[n];
      cout<<"El-ma";
      for (i=0; i<n; i++)
      {
    cout<<"\na["<<i<<"]=";
    cin>>a[i];
        if(a[i]==0) s++;
      }
      if(s<2)
      {
    cout<<"Malo nylei!\n";
        return 0;
      }
      else
      {
    for (i=0; i<n; i++)
    if(a[i]==0)
        {
      I=i;
      break;
    }
    for (i=n; i>I; i--)
    {
      if(a[i]==0)
      {
        I2=i;
            break;
          }
        }
      }
      Sred(a,I,I2);
      MaxMin(a,n);
      for (i=0; i<n; i++)
    cout<<"\na["<<i<<"]="<<a[i];
      cout<<"Srednee zna4enie="<<Sred;
      delete []a;
      getch();
      return 1;
    }
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 22.4.2010, 13:53
Сообщение #51


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



return (sym/s); - опять то же самое)) Результат-то будет типа double) Но средним значением чисел {1, 1, 2} будет 1.0

Не созданы функции для отдельного нахождения минимума и максимума.
В функции MaxMin цикл не обязательно гонять два раза. Всё это можно проделать и в одном цикле.
По той же функциями. Инициализация нулями min и max не верна. Например, у Вас будет массив {-1,-2,-3}.
И что, максимальный элемент у него 0? Именно так будет считать такой алгоритм. А индекс будет вообще не инициализирован. Это же замечание касается и min.

a[imax]=a[imin]; - уж написали бы =min ))) Хотя... в принципе ошибки не вижу. Но тогда никакой временной переменной не надо.

cout<<"Srednee zna4enie="<<Sred; - какие ужасы))) Что за Sred? Как же это Вы используете идентификатор функции без параметров.

return 1; - Ваше право, но корректно завершившееся приложение в Windows обычно имеет код возврата 0.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 22.4.2010, 17:17
Сообщение #52


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Результат-то будет типа double ну так и функция типа double
отдельного нахождения это не пренципиально
вообще я хотел узнать в чем ошибка мешающая работе, а не косметический ремонт (IMG:style_emoticons/default/smile.gif)
компилятор говорит что все гуд, но когда запускаешь, (пускай даже без отрец. знач. вообще) она начинает на что-ругаться. (IMG:style_emoticons/default/huh.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 22.4.2010, 20:29
Сообщение #53


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Советую повнимательнее взглянуть сюда:
return (sym/s); - опять то же самое)) Результат-то будет типа double) Но средним значением чисел {1, 1, 2} будет 1.0

Проблема не в типе. Тип как раз верный. А вот результат вычислений косячный. У Вас будет целочисленное деление, а затем приведение к типу double. Тип правильный, а результат косячный.

Почему ругается, я тоже сказал.
max=0 и min=0.
Если у Вас нет отрицательных значений, то как раз и будут проблемы. У вас не встретится ни одного числа, которое бы удовлетворяло условию:
Код

if(a[i]<min)
{
    imin=i;
    min=a[i];
}

В итоге imin останется непроинициализированным. А Вы к нему таки обратитесь в конце.

Моё конструктивное предложение:
int imin=0, imax=0, min=a[0], max=a[0];

Я обычно делаю так.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 23.4.2010, 19:07
Сообщение #54


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



Все, готово, кое как своими кривыми ручонками отладил. (IMG:style_emoticons/default/laugh.gif)
Спасибо, чтобы без вас делал, не знаю. (IMG:style_emoticons/default/thumbsup.gif)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 23.4.2010, 19:47
Сообщение #55


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



А с делением поправили?)))
Косячить ведь будет)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
InFuz
сообщение 23.4.2010, 21:37
Сообщение #56


Студент
**

Группа: Продвинутые
Сообщений: 116
Регистрация: 13.10.2009
Город: Ульяновск
Учебное заведение: УлГУ
Вы: студент



так точно! сделал еще печать в самой процедуре.

Код
    void Sred(int *a, int I, int I2)
    {
      int i,s=0,sym=0;
      double b;
      for(i=I+1; i<I2; i++)
      {
    sym=sym+a[i];
    s++;
      }
      b=(double)sym/s;
      cout<<"Srednee zna4enie="<<b;
    }


Хотел еще спросить, что значит linker warning:no module definition file specified: using defaults
в принципе это не ошибка и работе не мешает просто хотел узнать, что она мне хочет сказать.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Vahappaday
сообщение 23.4.2010, 22:37
Сообщение #57


Аспирант
***

Группа: Продвинутые
Сообщений: 334
Регистрация: 26.4.2009
Город: Липецк
Учебное заведение: ЛГТУ
Вы: студент



Если честно, не в курсе, это чисто борландовое предупреждение... Говорят, помогает пересоздание проекта, его перемешение или что-то типа того.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

3 страниц V < 1 2 3
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 18.4.2024, 7:37

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru