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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2010, 13:55   #1
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию функция с переменным числом параметров

Написать функцию с переменным числом параметров для перевода чисел из десятичной системы счисления в троичную. Написать вызывающую функцию main, которая обращается к этой функции не менее трех раз с количеством параметров 3, 4, 7. Входные параметры передавать как текстовые строчки. Предусмотреть получение результатов через параметры функции в виде текстовой строки.

Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
	
    schar[30] ff(int n, char buff[])  {
	char mas[7], rez[7];
	if (n==7) {
		sscanf(buff, "%d %d %d %d %d %d %d", &mas[0], &mas[1], &mas[2], &mas[3], &mas[4], &mas[5], &mas[6]);	for(i=0; i<n; i++) {
		rez[i]=1;
		 while(mas[i]!=0) {
			rez[i]*=10+mas[i]%3;
			mas[i]/=3;
		 }
		}
		for(i=0; i<n; i++) {
		   while(rez[i]!=0) {
			 mas[i]*=10+rez[i]%3;
			 rez[i]/=3;
		   }
		}	
		sprintf(buffr, "%d %d %d %d %d %d %d", mas[0], mas[1], mas[2], mas[3], mas[4], mas[5], mas[6]);
		} else
	if (n==5) {
		sscanf(buff, "%d %d %d %d %d", &mas[0], &mas[1], &mas[2], &mas[3], &mas[4]);
		for(i=0; i<n; i++) {
		rez[i]=1;
		 while(mas[i]!=0) {
			rez[i]*=10+mas[i]%3;
			mas[i]/=3;
		 }
		}
		for(i=0; i<n; i++) {
		   while(rez[i]!=0) {
			 mas[i]*=10+rez[i]%3;
			 rez[i]/=3;
		   }
		}
	sprintf(buffr, "%d %d %d %d %d", mas[0], mas[1], mas[2], mas[3], mas[4]);
	} else
	if (n==3) {
		sscanf(buff, "%d %d %d", &mas[0], &mas[1], &mas[2]);
		for(i=0; i<n; i++) {
		rez[i]=1;
		 while(mas[i]!=0) {
			rez[i]*=10+mas[i]%3;
			mas[i]/=3;
		 }
		}
		for(i=0; i<n; i++) {
		   while(rez[i]!=0) {
			 mas[i]*=10+rez[i]%3;
			 rez[i]/=3;
		   }
		}
		sprintf(buffr, "%d %d %d", mas[0], mas[1], mas[2]);
	} else {
		buff[] = "Takoro HET";
	}	
  return buff;
}
//-------------------
void main()  {
		char buff[255], fin[255];
		int n;
		  printf("Enter n = ");
		  cin<<n;
		  printf("Enter data: ");
		  cin<<buff;
		  fin=ff(n, buff);
		  printf("%c", fin);
		getch();
		return 0;
}
Что то я здесь намудрил с типами данных, и данные(buff) в функцию фф не передаются, соответственно ничто в троичную сс не переводится. Будет ли это считатся "функцией с переменным числом параметров", если ЭТО каким то образом удастца запустить. Если не трудно, помогите доделать.
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.
Veselyn вне форума Ответить с цитированием
Старый 08.04.2010, 16:36   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Вот пара вариантов:
Код:
string IntToThr(int i, ...)
{
	string Result, buf; char c[100];
	va_list argptr;
    va_start(argptr, i);
	if(i!=0)
	{
		int x;
		for(int j=0; j<i; j++)
		{
			x=va_arg(argptr, int);
			while(x!=0)
			{
				itoa(x%3,c,10);
				buf.insert(0,c);
				x=x/3;
			}
			Result.insert(Result.length(),buf);
			Result.insert(Result.length()," ");
			buf.clear();
		}
	}
	va_end( argptr );
	return Result;
}

string IntToThr_s(int i, ...)
{
	string Result, buf; char c[100];
	va_list argptr;
    va_start(argptr, i);
	if(i!=0)
	{
		int x; char *s;
		for(int j=0; j<i; j++)
		{
			s=va_arg(argptr, char *);
			x=atoi(s);
			while(x!=0)
			{
				itoa(x%3,c,10);
				buf.insert(0,c);
				x=x/3;
			}
			Result.insert(Result.length(),buf);
			Result.insert(Result.length()," ");
			buf.clear();
		}
	}
	va_end( argptr );
	return Result;
}

int main(void)
{	
	printf("%s\n",IntToThr(3,10,15,3).data());
	printf("%s\n",IntToThr_s(2,"123","3").data());
	getch();
    return 0;
}
Ну если все числа находятся в одно строке, то можно воспользоваться StrToInt и перемещением указателя строки на длину числа.

что-то типа того:
Код:
if(i!=0)
{
  for(j=0; j<i; j++)
  {
    x=IntToStr(s); //наше число
    while((*s!=' ')||(*s!='\0')) s++; //сдвигаем указатель до следующего числа
  }
}
Это если все числа разделены пробелом, иначе можно просто проверять не *s!=' ', а (*s>=48)&&(*s<=58) точно не помню промежуток в котором находятся символы чисел.

Последний раз редактировалось Kostia; 08.04.2010 в 16:39.
Kostia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
присвоить из бд переменным akimov_aleks БД в Delphi 6 07.04.2010 08:24
Функция с переменным числом параметров С++ [CODER] Помощь студентам 3 22.03.2010 03:58
Функции с переменным числом параметров Matr1x Общие вопросы C/C++ 2 07.01.2010 16:55
Как создать функцию с переменным кол-во параметров? VintProg Общие вопросы Delphi 12 11.08.2009 12:49
Процедуры с переменным числом параметров Pascal Сергей089 Помощь студентам 2 04.04.2009 19:47