Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С++] Процедура и функции


Автор: Ангелинка 20.3.2007, 10:18
Приверище всем smile ...ооочень нужна ваша помощь smile ...
У меня вот такие 3 задачки:
1. Два натуральных числа называются «дружественными», если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284). Найти все пары «дружественных чисел», которые не больше данного числа N. 
2. Вычислить площадь правильного шестиугольника со стороной a, используя функцию вычисления площади треугольника. 
3. Описать рекурсивную логическую функцию Simm(S, i, j), проверяющую, является ли симметричной часть строки S, начинающаяся i-м и кончающаяся j-м ее элементами.
И вот такой код:
Код

#include <fstream.h>
#include <conio.h>
#include <iomanip.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
#include <string.h>


char s[100];
int simm;
int mas[10000]={0};

void F(int);

void F (int N)
    {
       int i,j;
       int S,n;
       n=0;
       for (i=1; i<N; i++)
          {
        S=0;
        for (j=1; j<=i/2; j++)
        if (i%j==0)
        S+=j;
        mas[n]=S;
        n++;
          }
}

void Z1()
{
  int N;
  int i,j;
  cout << "Введите N: \n";
  cin  >> N;
  F(N);
  for (i=1; i<N; i++)
  for (j=1; j<N; j++)
    if ( (mas[i-1]==j) && (mas[j-1]==i) && (i!=j))
       cout << mas[i-1] << " дружественное числу " << mas[j-1]<<endl;
}

float Sqr (int a)
  {
     float S;
     S=(sqrt(3)*pow(a,2))/4;
     return S;
  }

void Z2(int a)
{

float Sum;
Sum=6*Sqr(a);
cout<<"S="<<Sum<<endl;
}

int SIMM ( int i, int j)
{
   int n=strlen(s),simm=1;
   if (n/2 >=i)
      {
     if (s[i]!=(s[n-j]))
     simm=0;
      }
     else
     simm=SIMM(i+1,j+1);
     return simm;
}

void main()
{
clrscr;
int k;
cout << "Введите номер задания : ";
cin >> k;

switch( k )
{
    case 1:
       {
          Z1();
          break;
       }

    case 2:
       {
          int a;
          float Sum;
          cout << "Введите длину стороны: \n";
          cin  >> a;
          Z2(a);
          break;
       }

    case 3:
       {
          int i,j,prov;
          int n=strlen(s);
          cout << "Введите строку: \n";
          cin  >> s;
          if (n%2==0)
          prov=SIMM(0,1);
          else
          prov=SIMM(0,1);
          cout<<"Ответ: \n";
          if (prov)
          cout<<"‘Строка симметрична­  :)";
          else
          cout<<"‘Строка несимметрична  :(";
          break;
       }

    default: (cout<<"ЌҐЇа ўЁ«м­® ўўҐ¤Ґ­ ­®¬Ґа § ¤ зЁ\n");
    break;
}
getch();
return;
}

не могли бы вы помочь... smile 

я не знаю как это сделать динамикой smile ...
не понимаю почему не работает в основной программе clrscr...
не уверенна что первая задача вообще работает правильно (она выводит слишком много пар этих дружественных чисел...она должна быть реализована процедурой, причем ввод и вывод данных должен быть из основной программы-а у меня так не получается smile )...
и в третьей задаче...там нужен запрос i-того и j-того эллемента...а я не знаю как так сделать... smile 

Очень надеюсь на вашу помощь... smile ...заранее благодарна smile 

Автор: Lamak 20.3.2007, 11:06
вот третья:
Код


#include <iostream.h>
#include <conio.h>
#include <iomanip.h>

bool SIMM (char* s, int i, int j)
{
     if(s[i]==s[j])
     {
        if((i==j)||(i==j+1))
                return true;
        return SIMM(s,i+1,j-1);
     }
     else
        return false;
}
//---------------------------------------------------------------------------
int main()
{
      char *s="a123321er";
     
      if(SIMM(s,1,6))
        cout<<"Simm  :)";
      else
        cout<<"No Simm  :(";
      getch();
      return 0;
}


Автор: Lamak 20.3.2007, 11:59
Цитата

1. Два натуральных числа называются «дружественными», если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284). Найти все пары «дружественных чисел», которые не больше данного числа N. 

Чё то не понятно:
220=2*2*5*11;  2+2+5+11 = 20;??? smile 
284=2*2*71;      2+2+71     = 75;??? smile 
 Что же такое «дружественные» числа?

Добавлено @ 12:08 
Цитата

опять проблемы с динамикой :( 

А где здесь динамика?

Автор: Ангелинка 20.3.2007, 12:17
Lamak, спасибки за третью задачку smile ...но она у меня не компилируется...выдает ошибку declaration sintax error в в пятой строчке после SIMM  smile ...и...(я понимаю моя наглость безгранична smile )...ты бы не мог мне сказу написать как будет с запросом строки и вводом i и j...а то мне же так надо, а если я сейчас сама исправлять начну, то у меня только ошибок еще больше станет smile ...

а дружественные числа это....ну ты привел неправильный пример...там в задачке сказано "равно сумме всех делителей (кроме его самого) другого"...то есть там 
220=2+3+4+...+...+...на что там еще делится 284
а 284=2+4+5+10+...+...+на что делится 220...

т.е. надо найти все возможные делители числа (кроме его самого), сложить их...и по этому принципу обработать все числа до введенного с клавиатуры N...и сравнить еще потом...

Автор: Ангелинка 20.3.2007, 15:08
да...просто препод говорит что все лабы должны быть решены динамически... smile ...а я в этом ничего не понимаю...вот и спрашиваю как сделать так чтобы все это работало динамически...
 smile 

Автор: Lamak 20.3.2007, 15:43
держи:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
int sum_delit(int x)
{
     int i;
     int Sum=0;
     for(i=1;i<x;i++)
     {
         if(x%i==0)
         {
             Sum+=i;

         }
     }
     return Sum;
}
//=====================
void Z1(int N)
{
        int i,j,k1,k2;
        for(i=2;i<N;i++)
        {
          k1=sum_delit(i);
          k2=sum_delit(k1);
          if((k2==i)&&(k1!=i)&&(i<k1))
                cout<<endl<<i<<" "<<k1;
        }
}
//---------------------------------------------------------------------------
float Sqr (int a)
{
     float S;
     S=(sqrt(3)*pow(a,2))/4;
     return S;
}
//=====================
float Z2(int a)
{
    float Sum;
    Sum=6*Sqr(a);
    return Sum;
}
//---------------------------------------------------------------------------
bool SIMM(char* s, int i, int j)
{
     if(s[i]==s[j])
     {
        if((i==j)||(i==j+1))
                return true;
        return SIMM(s,i+1,j-1);
     }
     else
        return false;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
      int k;
      cout << "vvedite nomer zadania: ";
      cin >> k;
      switch( k )
      {
          case 1:
          {
                int n;
                cout << "Veddite N: ";
                cin >> n;
                Z1(n);
                break;
          }

          case 2:
          {
                int a;
                float Sum;
                cout << "vvod dlina storoni : \n";
                cin  >> a;
                cout<<"S="<<Z2(a)<<endl;
                break;
          }

          case 3:
          {
                int i,j;
                char s[100];
                cout << "\nvvod string: ";
                cin  >> s;
                cout << "\nvvod i: ";
                cin >> i;
                cout << "\nvvod j: ";
                cin >> j;
                if (SIMM(s,i,j))
                      cout<<"Simm  :)";
                else
                      cout<<"No Simm  :(";
                break;
          }

          default:
                cout<<"neverno vveli nomer\n";
          break;
      }
      getch();
      return 0;
}
//---------------------------------------------------------------------------


Добавлено @ 15:54 
Цитата(Ангелинка @  20.3.2007,  14:08 Найти цитируемый пост)
препод говорит что все лабы должны быть решены динамически... 

как на меня то он просто гонит smile  тут динамика нафиг не нужна smile !
 smile да и я себе вяло представляю как её сюда засунуть! smile 


Автор: Ангелинка 20.3.2007, 16:19
Lamak, СПАСИБО ОГРОМНЕЙШЕЕ smile ...ооочень помог... smile 
но у меня опять почему то не работает  smile ....теперь выдает 2 ошибки : во второй строчке - unable to open vcl.h....и в той же в которой и была ошибка в 49... smile 
помоги пожалуйста...оно протестует против типа bool...я помню препод говорил что в С++ его нету....и если мы хотим его использовать должны написать enum bool(false, true)...я эту строчку вписывала во все места кода...и ничего хорошего не получается...я прям не знаю что с этой бедой делать... smile 

Автор: Lamak 20.3.2007, 22:53
эта библиотека тебе не нужна я просто забыл удалить
Код

//#include <vcl.h>

попробуй так
Код

int SIMM(char* s, int i, int j)
{
     if(s[i]==s[j])
     {
        if((i==j)||(i==j+1))
                return 1;
        return SIMM(s,i+1,j-1);
     }
     else
        return 0;
}

должно заработать

Добавлено @ 23:01 
а если хочеш чтоб с bool работало
 напиши в 7 строке, перед "int sum_delit(int x)":
Код

enum bool{false=0, true=1};

Автор: agl 21.3.2007, 00:35
Немного измененый алгоритм Lamak'a
3)
Код

#include <iostream>
#include <conio.h>
using namespace std;
int SIMM (char* s, int start, int end)
{
     if(start < end)
     {
         if(s[start] != s[end]) return 0;
         else  SIMM(s,start+1,end-1);
     }

      return 1;
}
//---------------------------------------------------------------------------
int main(void)
{
      char s[]="a123321er";
      
      if(SIMM(s,1,6))
        cout<< "Simm  :)\n";
      else
        cout<<"No Simm  :(\n";
      
      getch();
      return 0;
}


Автор: apook 21.3.2007, 07:19
Я чесно говоря не врублаюсь что это за функция SIMM? что она
делает вообщее. Проверяет что-то 
Код

#include <iostream.h>
#include <conio.h>

enum bool{ false, true };

bool SIMM( char *s, int i, int j )
{
if( i<j )
{
    if( s[ i ] != s[ j ] )
        return false;
    else
        SIMM( s, i+1, j-1 );
    }
return false;
}


void main()
{
int i, j;
char s[ 100 ];

cout << "\nvvod string: ";
cin.get( s, 100 );
cout << s;
cin.ignore();

cout << "\nvvod i: ";
cin >> i;
cout << "\nvvod j: ";
cin >> j;

if( SIMM(s, i, j) )
    cout << "Simm  :)";
else
    cout << "No Simm  :(";

getch();
return;
}

 

Автор: agl 21.3.2007, 09:11
Цитата(Ангелинка )
3. Описать рекурсивную логическую функцию Simm(S, i, j), проверяющую, является ли симметричной часть строки S, начинающаяся i-м и кончающаяся j-м ее элементами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)