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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2012, 19:29   #1
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию задача из Прата С, функции

Всем привет. Помогите пожалуйста разобрать с задачей из Прата С.
Всю голову сломал уже, никак не допру как решить.
Код:
Напишите функцию, которая обычно принимает один аргумент — адрес строки 
и выводит эту строку один раз. Однако если задан второй аргумент типа int, не 
равный нулю, то эта функция выводит строку столько раз, сколько было  
осуществлено вызовов этой функции к моменту ее данного вызова. (Обратите внимание, 
что количество выводимых строк не равно значению второго аргумента, оно 
равно числу вызовов функции к моменту последнего вызова.)
мой недокод:
Код:
#include <conio.h>
#include <iostream>
using namespace std;

const int SIZE = 20;

void str(char *ch, int n=0);

int main()
{
	int n = 3;
	char ch[SIZE] = "Fuck you!";
	str(ch);
	str(ch);
	str(ch);
	str(ch, n);
	str(ch);
	str(ch, n);

	getch();
	return 0;
}
void str(char *ch, int n)
{
	if(n != 0)
	{
		n = 0;
		n += 1;
		for(int i=0; i<n; i++)
			cout << ch << ' ';
	}
	else
		cout << ch << endl << endl;
}
Чет я совсем застопорился на этой задаче, а надо двигаться дальше.
Suby вне форума Ответить с цитированием
Старый 26.11.2012, 20:03   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
void str(char *ch, int n)
{
	if(n != 0)
	{
		n = 0;
		// n += 1;
		for(int i=0; i<n; i++)
			cout << ch << ' ';
	}
	else
		cout << ch << endl << endl;
}
Зачем обнуляете n? Она и будет выводить строку один раз, так-как цикл for, это цикл с постпроверкой.
И не нужно n присваивать новое значение, оно уже задано во входных параметрах функции.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.11.2012, 20:58   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Suby

с использованием говнокода это можно сделать так:

Код:
size_t run_count = 0;

void print(const char* str, int repeat)
{
    if (repeat == 0)
   {
      puts(str);
      run_count++;
   }
   else
      for (size_t i=0; i<run_count; i++)
         puts(str);
}
Rififi вне форума Ответить с цитированием
Старый 26.11.2012, 21:08   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Rififi, интересно, а как без использования г-нокода? Эллипсис? Значений по умолчанию, если не изменяет склероз, в C не завезли.
Abstraction вне форума Ответить с цитированием
Старый 26.11.2012, 21:36   #5
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
void str(char *ch, int n)
{
	if(n != 0)
	{
		n = 0;
		// n += 1;
		for(int i=0; i<n; i++)
			cout << ch << ' ';
	}
	else
		cout << ch << endl << endl;
}
Зачем обнуляете n? Она и будет выводить строку один раз, так-как цикл for, это цикл с постпроверкой.
И не нужно n присваивать новое значение, оно уже задано во входных параметрах функции.
Да я это знаю, просто вконце от безысходности стал перебирать на обум все варинты, даже бредовые, а когда не выдержал - скопипастил сюда

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Значений по умолчанию, если не изменяет склероз, в C не завезли.
В точку.

Цитата:
Сообщение от Rififi Посмотреть сообщение
Suby

с использованием говнокода это можно сделать так:

Код:
size_t run_count = 0;

void print(const char* str, int repeat)
{
    if (repeat == 0)
   {
      puts(str);
      run_count++;
   }
   else
      for (size_t i=0; i<run_count; i++)
         puts(str);
}
Не понял ничего из этого кода. Здесь puts, size_t - я впервые вижу такие прибамбасы Я Начал изучать С++ менее месяца назад без опыта программирования в прошлом. Мне бы полегче как-нить, "народными" средствами так сказать
Suby вне форума Ответить с цитированием
Старый 26.11.2012, 21:45   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Suby

Не понял ничего из этого кода

А погооглить?
puts - вывод строки, size_t - целый беззнаковый тип (можно, если очень хочется, заменить на int)

Rififi, интересно, а как без использования г-нокода?

без г-нокода - это значит без использования глобальной переменной.
добавить например третий out-параметр, куда записывается счетчик запусков
идеальный вариант - в ООП-стиле, С++ stateful object. Но поскольку у него обычный Си, так шта обходимся тем что есть....
Rififi вне форума Ответить с цитированием
Старый 26.11.2012, 21:58   #7
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Но поскольку у него обычный Си, так шта обходимся тем что есть....
Если это вы про меня, то у меня не обычный С, а С++
Меня конкретно интересует, как осуществить счетчик вызовов фунции. В книге, которую я сейчас читаю об этом еще не упоминалось, а вот задача уже дается
Если бы в условии задачи было разрешено добавить еще один аргумент, то я бы решил задачку без проблем... Но здесь именно 2 аргумента, один из них докучи по умолчанию.

Последний раз редактировалось Suby; 26.11.2012 в 22:07.
Suby вне форума Ответить с цитированием
Старый 26.11.2012, 22:05   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
без г-нокода - это значит без использования глобальной переменной.
добавить например третий out-параметр, куда записывается счетчик запусков
И надеемся, что нам в него передадут что надо? Гм...
Как я понимаю, оно пишется как-то так:
Код:
#define func(a) func(a,0)

void func(const char* str, int arg){
  static int count = 0;
  int i=0;
  if(arg == 0){
    puts(str);
  } else {
    for(;i<count;++i) puts(str);
  }
  ++count;
}
Abstraction вне форума Ответить с цитированием
Старый 26.11.2012, 22:30   #9
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Ребят, спасибо за наводку! Особенно про глобальную переменную спасибо! Решил!
Код:
#include <conio.h>
#include <iostream>
using namespace std;

const int SIZE = 20;
int time = 0;                                   // вот оно!!!
void str(char *ch, int n=0);

int main()
{
	int n = 3;
	
	char ch[SIZE] = "Fuck you!";
	str(ch);
	str(ch);
	str(ch);
	str(ch, n);
	str(ch);
	str(ch, n);

	getch();
	return 0;
}
void str(char *ch, int n)
{
	time++;                        // опа на!!!
	if(n != 0)
	{
		
		for(int i=0; i<time; i++)
			cout << ch << ' ';
		cout << endl << endl;
	}
	else
		cout << ch << endl << endl;
}
Suby вне форума Ответить с цитированием
Старый 26.11.2012, 22:42   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Теперь распечатайте и сожгите. Это нужно делать через статическую переменную, как написал Abstraction.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прата С++ упр.4 гл.6 sergey_victor Общие вопросы C/C++ 1 14.08.2012 21:32
Стивен Прата. Третья Глава Pirandello_Kruger Общие вопросы C/C++ 0 07.03.2012 22:50
задача по функции С++ lesik_ Помощь студентам 3 23.09.2010 15:40
Вопрос из учебника С. Прата sunplant Общие вопросы C/C++ 3 07.04.2010 11:10
Какую купить версию книги Стивена Прата. Запутался. spamer Свободное общение 0 26.01.2010 03:01