Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2011, 18:37   #1
Kerragin
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 34
Вопрос Нерекурсивные\Рекурсивные процедуры и функции

помогите решить эти задачки через функции.они решены,но только не через функции,но препод требует чтоб были через функции

1)Даны две дроби A/B и C/D (А, В, С, D — натуральные числа).Составить программу для умножения дроби на дробь. Результат
должен быть несократимой дробью.

Код:

#include<iostream>
int main()
{int a,b,c,d,p,n,i;
using namespace std;
cout<<"vvedite a"<<endl;
cin>>a;
cout<<"vvedite b"<<endl;
cin>>b;
cout<<"vvedite c"<<endl;
cin>>c;
cout<<"vvedite d"<<endl;
cin>>d;
p=a*c;
n=b*d;
i=2;
while (i<=p)
{

if (p%i==0 && n%i==0)
{p=p/i;
n=n/i;}
else
i++;
}
cout<<p<<"/"<<n;
}

2)Найти все натуральные n-значные числа, цифры в которых
образуют строго возрастающую последовательность (например,
1234, 5789).

Код:

#include <string>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {

string symbols = "123456789";

int n = static_cast<int>(symbols.length());

for(int i=1; i<=n; i++)
for(int j=0; j<=n-i; j++)
cout << symbols.substr(j, i) << endl;

return 0;
}

Тема "Нерекурсивные процедуры и функции"

3)Дано n различных натуральных чисел. Напечатать все перестановки

Код

#include <iostream>
#include <algorithm>

int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
size_t len = sizeof(arr) / sizeof(int);

do
{
for (int i = 0; i < len; i++)
std::cout << arr[i] << " ";
std::cout << std::endl;
} while (std::next_permutation (arr, arr + len));

return 0;
}


Тема "Рекурсивные процедуры и функции"
Kerragin вне форума Ответить с цитированием
Старый 02.06.2011, 19:09   #2
Kerragin
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 34
По умолчанию

люди помогите!!!
Kerragin вне форума Ответить с цитированием
Старый 02.06.2011, 19:31   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,603
По умолчанию

Первая задача написана неправильно. Сокращение дроби должно идти через НОД.
Вторая задача тоже написана неправильно
И третья тоже. Третью лучше всего с помощью рекурсии.

Прототип функции:
тип_возвращаемого_значения имя_функции ( параметры);

Пример: int max(int a, int b); функция, находящая максимум из 2 чисел a и b

Тело функции:
тип_возвращаемого_значения имя_функции ( параметры)
{
операторы
}
В чем проблема, чтобы переписать код через функции? Есть, конечно, заморочки с передачей массивов, структур и классов в качестве параметров функции, но это не тот случай.

Задача 3:
Код:
/* Напечатать все перестановки элементов массива из N элементов */

#include <stdio.h>

/*  N >= 3  */
#define N 5

void perestanovka(int k[], int temp[], int arr_sz,int startposition);

void main(){
   int temp[N]; /*Массив для хранения перестановок*/
   int k[N]={1,2,3,4,5}; /*Заданный для перестановки массив*/
   int arr_sz=sizeof(k)/sizeof(k[0]); /* размер массива */ 

   perestanovka (k, temp, arr_sz, 0);
}

void perestanovka(int k[], int temp[], int arr_sz,int startposition){
   int vs[N];   /*копия массива */
   int i,j,l;   /*cчетчики*/
   int tmp;   /*элемент для хранения при перестановке*/
   int sz;      /*размер оставшейся части*/

   sz = arr_sz - startposition - 1;
   
   for ( i = startposition ; i < arr_sz ; i++){
      /*Создание копии*/
      if(startposition!=0)
         for (j=0; j<arr_sz; j++)
            vs[j]=temp[j];

      /*Перестановка начальных элементов массива*/      
      if (startposition==0)
         temp[startposition] = k[i];
      else  
         temp[startposition]=temp[i];

      /*Копирование оставшейся части массива*/
      if(startposition==0)
         for( j=0,l = startposition+1 ; j < arr_sz ; )            
            (i != j) ? (temp[l]=k[j],l++,j++) : j++;               
      else         
         for( j=startposition,l = startposition+1 ; j < arr_sz ; )            
            (i != j) ? (temp[l]=vs[j],l++,j++) :j++;
      
      if (sz==2){
         /*Распечатка*/
         for (j=0; j<arr_sz; j++)
            printf ("%d ", temp[j]);
         printf("\t");

         /*Перестановка оставшихся 2 элементов*/
         tmp=temp[arr_sz-2];
         temp[arr_sz-2]=temp[arr_sz-1];
         temp[arr_sz-1]=tmp;

         /*Распечатка*/         
         for (j=0; j<arr_sz; j++)
               printf ("%d ", temp[j]);
         printf("\t");

         /*Восстановление после перестановки оставшихся 2 элементов*/
         tmp=temp[arr_sz-2];
         temp[arr_sz-2]=temp[arr_sz-1];
         temp[arr_sz-1]=tmp;
         }
      else 
         perestanovka(k, temp, arr_sz, startposition+1);      
   }
}
НОД для задачи 1
Код:
int nod(int a, int b){
	int k;
	if(a>b)
	{k=a;}
	else
	{k=b;}
	while (!(((a%k)==0)&&((b%k)==0)))
	{
		k--;
	}
	return(k);

}
Алгоритм же такой: дробь несократима если НОД равен единице.
Ищем НОД p и n, делим на него p и n.

Вторая задача неправильна, так как 1589 строго возрастающая последовательность. Просто проверяем, чтобы 1 цифра была меньше 2, 2 меньше 3, 3 меньше 4 и 4 меньше 5
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 02.06.2011, 19:53   #4
Kerragin
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 34
По умолчанию

а можно по подробнее с 2й задачей?
Kerragin вне форума Ответить с цитированием
Старый 03.06.2011, 17:50   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,603
По умолчанию

Вторая задача:
Константой N в программу зашита значность
Код:
/*
2)Найти все натуральные n-значные числа, цифры в которых
образуют строго возрастающую последовательность (например,
1234, 5789).
(без рекурсии)
*/
#define N 3

#include <stdio.h>

typedef char* strng;
strng int_to_st(int result);
strng create_string(int sz);
void reverse_string(strng m);
void delete_string(strng m);
void check_string(strng m);
strng increase_size(strng m,int t);
strng increase_size(strng m,int t,strng h);
void copy_string(strng m,strng n, int sz);
void print_string(char* t);
int len_string(char* m);
void terminate_string(char* m, int sz);
int razrad(int m);
int change_sign(int m);
void check_string(strng m);

int main(void)
{
	int i;
	int starting_num=10;
	strng num;
	for (i=1;i<N-1;i++)
	{
		starting_num *= 10;
	}
	int end_num = starting_num*10;
	while (starting_num < end_num)
	{
		num = int_to_st(starting_num);
		check_string(num);
		starting_num++;
	}
	return 0;
}

strng int_to_st(int result)
{
	int st;
	int rzrd;
	strng m,h;
	int i=0;
	
	if(result<0)
	{
		i=1,result=change_sign(result);	
		h=create_string(2);
	}
	
	rzrd=razrad(result)+1;
	m=create_string(rzrd);
	if (result!=0)	
		for(st=0;st<rzrd && result!=0;st++)
		{
			m[st]=(result%10) +'0';
			result=(result-(result%10))/10;		
		}
	else
		m[0]='0';

	if (i==1)
	{
		h[0]='-';
		m=increase_size(m,1,h);
		delete_string(h);
	}
	reverse_string(m);
	return (m);
}

strng create_string(int sz)
{
	strng m;
	m = new char[sz];
	terminate_string(m, sz);
	return (m);
}
void delete_string(strng m){delete[] m;}
strng increase_size(strng m,int t)
{
	strng k;
	int ln1=len_string(m);
	ln1++;
	k = new char[ln1+t];
	terminate_string(k, ln1+t);
	copy_string(m,k, ln1);
	delete_string(m);
	return (k);
}
	
void check_string(strng m)
{
	
	int ln1=len_string(m);
	int i,k;
	for(i=0,k=0;i<ln1;i++)
	{
		if (i+1<ln1)
		{
			if ((int)m[i] < (int)m[i+1])
				k++;
		}
	}
	if (k == 2)
	{
		print_string(m);printf("\n");	
	}
}

strng increase_size(strng m,int t,strng h)
{
	strng k;
	int cnt,j;
	int ln1=len_string(m);
	int ln2=len_string(h);
	ln1++;
	k = new char[ln1+t];
	terminate_string(k, ln1+t);
	copy_string(m,k, ln1);
	for(cnt=ln1-1,j=0;j<ln2;cnt++,j++)
		k[cnt]=h[j];	
	delete_string(m);
	return (k);
}
void copy_string(strng m,strng n, int sz)
{
	int i;
	for (i=0;i<sz&&m[i]!='\0';i++)	
		n[i]=m[i];
}
void print_string(char* t)
{
	int i;
	int ln1=len_string(t);
	for (i=0;i<ln1;i++)	
		printf("%c",t[i]);	
}
int len_string(char* m)
{
       int i=0;
       while (m[i] != '\0')
           ++i;
       return i;
}
void terminate_string(char* m, int sz) { m[sz-1]='\0';}
int razrad(int m)
{
	int result=0;
	if (m==0)	
		return(1);	
	if (m < 0)	
		m = change_sign(m);	
	for( ; m > 0 ; )
	{
		m = (m - m % 10)/10;
		result++;		
	}
	return result;
}

int change_sign(int m)
{
	return(-m);
}

void reverse_string(strng m)
{
	int c, i, j;
	for (i = 0, j = len_string(m)-1; i < j; i++, j--) 
		{
		c = m[i];
		m[i] = m[j];
		m[j] = c;
		}
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивные функции NiaSpa Помощь студентам 3 04.03.2010 11:53
Рекурсивные функции. Geg[C/c++] Общие вопросы C/C++ 2 11.10.2009 11:28