Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Soldier002
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 5
#1

Прата С. С++. Посчитать количество вызовов функции - C++

08.12.2012, 22:48. Просмотров 2841. Ответов 11
Метки нет (Все метки)

Всем привет!
Закончил раздел про встроенные функции, шаблоны, полиморфизм и ссылочные переменные.
Там в конце такое задание:
Напиши функцию. Один аргумент - адрес строки, выводит строку один раз. Если задан второй аргумент int!=0, функция выводит строку столько раз, сколько было осуществлено вызовов этой функции к моменту последнего вызова. (Обратите внимание, что количество выводимых строк не равно значению второго аргумента, оно равно числу вызовов функции к моменту последнего вызова)

Как выполнить последнее условие?! Помогите, не въезжаю. В голову пришла только глобальная переменная-счетчик, но это же надо решить, по идее, с помощью методов, изложенных в данной главе!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2012, 22:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прата С. С++. Посчитать количество вызовов функции (C++):

Посчитать количество рекурсивных вызовов - C++
В коде программы определена следующая функция: int foo(int n) { if (n <= 0) return 1; return foo((n * 2) / 3) +...

непонятно считает количество вызовов рекурсивной функции - C++
Помогите пожалуйста. не могу понять как он выводит переменную n, а именно почему во второй строчке ноль? если отслеживать пошагово, то с...

Рекурсия, ряд Фибоначчи (определить количество рекурсивных вызовов функции) - C++
Здравствуйте, уважаемые форумчане ! Подскажите, пожалуйста, как определить количество рекурсивных вызовов функции ? Вот, собственно,...

Посчитать с помощью функции количество букв и цифр в строке. - C++
1. Составить процедуру, результатом работы которой является действительное значение, если символ, заданный при обращении к процедуре, - ...

Указатели на функции (Прата) - не пойму, как это работает - C++
Стивен Прата "Язык программирования C++. Лекции и упражнения" 7 глава, стр. 355, листинг 7.18. fun_ptr.cpp // fun_ptr.cpp --...

Большое количество вызовов констр-ра и дестр-ра - C++
Добрый день! Есть класс для подсчёта указателей на объект и класс, который сопровождает или поддерживает работу предыдущего, храня на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
08.12.2012, 22:56 #2
это значит, что внутри функции должна быть static переменная-счетчик, которая будет увеличиваться при каждом вызове функции и которая будет таким образом хранить информацию о том, сколько раз вызывалась функция до этого
Soldier002
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 5
08.12.2012, 22:59  [ТС] #3
static? В моей книге это упоминается только как "Используйте static ... в старых реализациях для обеспечения совместимости"
Можете мне, пожалуйста, написать краткий пример?
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
08.12.2012, 23:03 #4
это относилось к глобальным переменным.
там да, "новый" способ ограничить их область видимости одним файлом -- это помещение их в анонимное пространство имен, а старый способ -- пометить их с помощью ключевого слова static.

а если переменная -- локальная для функции, то слово static имеет другой смысл и в этом случае заменить static ничем нельзя. да и не нужно, потому что в этом случае ключевое слово static очень подходит по смыслу.
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
08.12.2012, 23:17 #5
Цитата Сообщение от Soldier002 Посмотреть сообщение
Можете мне, пожалуйста, написать краткий пример?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* old style
эта вункция видна только в данном файле
т.е. если проект состоит из нескольких(многих)
файлов, то каждый из них имеет право на собстевнныую
реализацию static type foo()
*/
static void foo ()
{
    std::cout << "i'm foo\n";
}
 
void bar ()
{
    /*
        эта переменная создастся однажды и будет
        существовать все время жизни программы
    */
    static int cout = 0;
    std::cout << "i'm bar\n";
}
Soldier002
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 5
08.12.2012, 23:26  [ТС] #6
Окей. Спасибо. Я теперь знаю, что такое static переменная
Но можно ли как-то решить мою задачу, не используя глобальные переменные?
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
08.12.2012, 23:34 #7
Цитата Сообщение от Soldier002 Посмотреть сообщение
Но можно ли как-то решить мою задачу, не используя глобальные переменные?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int bar ()
{
    static int count = 0;
    std::cout << "i'm bar\n";
    ++count;
    return count;
}
 
int main()
{
 
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
 
    return 0;
}
v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
08.12.2012, 23:39 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
void f(char *str, int n=0);
 
int main()
{
    f("String");
    f("String");
    f("String", 10);  // два раза напечатает строку
 
    return 0;
}
 
void f(char *str, int n)
{
    static int k;
    
    if (n != 0)
        for (int i=1; i<=k; i++)
            cout << str << endl;
    else
        cout << str << endl;
        
    k++;
}
Soldier002
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 5
08.12.2012, 23:47  [ТС] #9
Спасибо еще раз!
Но... почему не получается так, что эта static переменная каждый вызов функции заново объявляется?
Как я понимаю, она объявляется в самый первый вызов функции в статической памяти, а потом, так как нельзя объявить уже объявленную переменную, компилятор пропускает строчку "static int n = 0;"?
RayBor
3 / 3 / 0
Регистрация: 07.12.2012
Сообщений: 28
09.12.2012, 00:14 #10
Цитата Сообщение от Soldier002 Посмотреть сообщение
Как я понимаю, она объявляется в самый первый вызов функции в статической памяти, а потом, так как нельзя объявить уже объявленную переменную, компилятор пропускает строчку "static int n = 0;"?
Вы правильно понимаете
Pyclann
Сообщений: n/a
15.01.2013, 00:56 #11
Цитата Сообщение от activnaya Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int bar ()
{
    static int count = 0;
    std::cout << "i'm bar\n";
    ++count;
    return count;
}
 
int main()
{
 
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
    std::cout << bar() << '\n';
 
    return 0;
}
А без статик можно как-нибудь? в книжке статик со следующей главы, значит должно делаться без него...
v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
15.01.2013, 11:12 #12
Цитата Сообщение от Pyclann Посмотреть сообщение
А без статик можно как-нибудь?
Можно через глобальную переменную отслеживать сколько раз была вызвана функция
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2013, 11:12
Привет! Вот еще темы с ответами:

Функция, которая возвращает количество её вызовов - C++
Напишите функцию, которая возвращает количество её вызовов (вызвали в первый раз - возвращает 1, второй раз - 2 и т.д.).

Написать функцию, возвращающую количество своих вызовов - C++
Всем привет))) Помогите написать программу, функция которой возвращает количество её вызовов)

Вычислите, используя рекурсию, выражение y=x+2*x^2+3*x^4+ ... для некоторого n (n – количество рекурсивных вызовов) - C++
Вычислите, используя рекурсию, выражение y=x+2*x^2+3*x^4+ ... для некоторого n (n – количество рекурсивных вызовов). Заранее спасибо и...

Вывести результат нескольких вызовов пользовательской функции в одну строку - C++
Есть функция вроде void out(int k, int n) { for (int i = 0; i != n; i++) cout &lt;&lt; k &lt;&lt; &quot; &quot;; } Результат каждого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2013, 11:12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru