Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
#1

Есть общая структура программы, как правильно (написать)определить функции к ней? - C++

13.06.2010, 17:15. Просмотров 1244. Ответов 11
Метки нет (Все метки)

Здравствуйте!
Задача из книги Стивена Прата 2ой день ни как не могу справится,помогите плз.Кто в курсе,проходил или знает как,подскажите пожалуйста
Ниже представлен код и условие задания:

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
27
28
29
30
31
#include <cstdlib>
#include <iostream>
using namespace std;
#include <cstring> //dlya vizova funczii strlen(),strcpy()
struct stringy
{
char * str; //ukazivaet na stroku
int ct; //dlinna stroki(ne schitaya simvola '\0')
};
 
using namespace std;
 
int main()
{
stringy beany;
char testing[] = "Realnost'-ne to,chto nam viditsya.";
set(beany, testing); //pervim argumentom yavlaetsya ssilka,
//videlyaet prostranstvo dlya hranenia kopii
//[COLOR="Pink"]testing[/COLOR], ispolzuet element tipa [COLOR="Pink"]str[/COLOR]
// strukturi [COLOR="Pink"]beany[/COLOR] kak ukazatel na noviy
//blok, kopiruet [COLOR="Pink"]testing[/COLOR] v noviy blok i
//sozdaet element [COLOR="Pink"]ct[/COLOR] struktury [COLOR="Pink"]beany[/COLOR]
show(beany);//pechataet element strokovogo tipa odin raz
show(beany,2);//pechataet element strokovogo tipa dvajdi
testing[0] = 'D';
testing[1] = 'u';
show(testing);//pechataet stroku testing 1in raz
show(testing,3);//pechataet troku testing 3 raza
show("Gotovo!");
return 0;
}
Завершите написание программы,создав соответствующие функции и прототипы.Обратите внимание,что в программе должны быть 2 функции show(), и каждая из них использует аргументы ,заданные по умолчанию.
Используйте спецификатор const при объявлении аргументов там, где это оправдано.Обратите также внимание на то,что функция set() должна использовать операцию new для выделения достаточного пространства памяти под хранение заданной строки.Используемые здесь методы аналогичны методам,применяемым при задании и реализации классов.(Возможно,вам придётся изменить имена файлов заголовков и удалить директиву using, что зависит от используемого компилятора.)



я попробовал решить но неполучается правильно определить функцию set(),возможно есть ещё ошибки:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <cstdlib>
#include <iostream>
#include <cstring>
struct stringy
{
   char * str;
   int ct;
};
const stringy & set(stringy & b,char tes);
void show(const stringy be,int n = 0);
void show(const char tes,int n = 0);
 
using namespace std;
 
int main(int argc, char *argv[])
{
  stringy beany;
  char testing[] = "Realnost'-ne to,chto nam viditsya.";
  set(beany,testing);
  show(beany);
  show(beany,2);
  testing[0] = 'D';
  testing[1] = 'u';
  show(testing);
  show(testing,3);
  show("Gotovo!");
  system("PAUSE");
  return EXIT_SUCCESS;
}
const stringy & set(stringy & b,char tes) 
 {
   b.str = new char[strlen(tes)+1];
   strcpy(b.str,tes);
   return b
   //delete b.str;
  }
void show(const stringy be,int n = 0)
  {
    if (n==0) then
     cout<<be.str;
     if n>0 then 
      for(int i=0;i<n;i++)
         cout<<be.str<<endl;
  }
void show(const char tes,int n = 0)
  { 
    int count = 0;
    if (n==0) then
      cout<<tes[i]<<endl;
    if (n>0) then 
      while(n > count)
       {
           cout<<tes[i]<<endl;
           count++;
        }
 
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2010, 17:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть общая структура программы, как правильно (написать)определить функции к ней? (C++):

общая структура функции на С++ - C++
Как выглядит общая структура функции на С++?

Как правильно написать в функции main() конструктор? - C++
Задача такая:Написать программу которая описывает студентов и группу,причем за студентов и группу отвечает свой класс. У меня есть...

Как правильно определить тип функции и ее аргументы? - C++
По заданию нужно вынести каждое действие в функции, у меня с ними не лады (:wall:) Вот приведу пример моей первой функции TCHAR...

Определить длину строки. Проверить, есть ли в ней слово “one”. - C++
Всем привет Вобщем запара с лабороторкой по инфе, нада помощь Задача: Дана строка не более 20 английских символов....

Дана строка. Определить, сколько в ней символов *, ;, : [Есть код на Pascal] - C++
Нужно перевести этот код на С++ Uses crt; Var s: String; i,k1,k2,k3: Integer; BEGIN Clrscr; Writeln('Введите строку: ');...

Как правильно написать статью и составить к ней семантическое ядро? - SEO
Как правильно написать статью и составить к ней семантическое ядро? Сколько должно быть символов на странице? Сколько ключевых слов...

11
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
15.06.2010, 12:26 #2
Это вы имели ввиду?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdlib.h>
#include <iostream>
#include <string.h>
struct stringy
{
   char * str;
   int ct;
};
const stringy & set(stringy & b,char tes);
void set (stringy &, char []);
void show(const stringy be, int n=1);
void show( char tes[],int n=1);
 
using namespace std;
 
int main(int argc, char *argv[])
{
  stringy beany;
  char testing[] = "Realnost'-ne to,chto nam viditsya.";
  set(beany,testing);
  show(beany);
  show(beany,2);
  testing[0] = 'D';
  testing[1] = 'u';
  show(testing);
  show(testing,3);
  show("Gotovo!");
  system("PAUSE");
  return EXIT_SUCCESS;
}
void set(stringy & b,char tes[]) 
 {
   b.str = new char[strlen(tes)+1];
   strcpy(b.str,tes);
  }
void show(const stringy be, int n)
{
    int i;
    for (i=0; i<n; i++)
    {
        cout<<be.str;
        cout<<endl;
    }
    cout<<endl;
 }
void show( char tes[],int n)
{ 
    int count = 0, i=0, j;
    for (i=0; i<n; i++)
    {
        for (j=0; j<strlen(tes); j++)
            cout<<tes[j];
        cout<<endl;
    }
    cout<<endl; 
}
1
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
17.06.2010, 02:09  [ТС] #3
Вы меня избавили от головной боли!=)Спасибо вам
Я думал,что функция Set должна возвращать ссылку на объект stringy,но оказалось что это просто функция не возвращающая ни чего
Простите!А можно у Вас поинтересоватся на счёт того,что операция NEW должна ведь работать в паре с DELETE, но в программе delete не используется.Разве такое возможно?Ведь память должна быть возвращена обратно в кучу.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.06.2010, 03:05 #4
C++
1
show(beany);
мало аргументов
0
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
17.06.2010, 03:13  [ТС] #5
Цитата Сообщение от accept Посмотреть сообщение
C++
1
show(beany);
мало аргументов
В задании так уже составлено было. Я просто думал,что не void фнкция должна быть.
Кстати,мне тут мысль пришла!Ведь new выделяет память во время работы функции,тогда получается так,что она же(функция) её и освобождает без применения delete. Все переменные и выделенная память освобождается,или с кучей всё по другому происходит?(нужно применить delete)
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.06.2010, 03:51 #6
C++
1
2
3
#include <stdlib.h>
#include <iostream>
#include <string.h>
заголовки должны быть одного вида

так
C++
1
2
3
#include <stdlib.h>
#include <iostream.h>
#include <string.h>
или так
C++
1
2
3
#include <iostream>
#include <cstdlib>
#include <cstring>
Добавлено через 39 секунд
у тебя до delete ещё не дошла очередь
для всех new нужны delete'ы

Добавлено через 6 минут
аргумент по-умолчанию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include <iostream>
 
using namespace std;
 
int f(int n = 1);
 
int main(void)
{
    
    f();
    
    return 0;
}
 
int f(int n)
{
    cout << 'x' << n << endl;
}
в определении должен отсутствовать

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void show(const stringy be, int n = 1);
 
...
 
void show(const stringy be, int n)
{
    /* if (n==0) then
     cout<<be.str;
     if n>0 then  */ // можно убрать, кстати, что за then ?
 
    for (int i = 0; i < n; i++)
        cout << be.str << endl;
}
Добавлено через 47 секунд
ты можешь и не void сделать, если нужно не void
0
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
17.06.2010, 12:57  [ТС] #7
Да then ни к месту.=) С Дельфи что то я решил его совместить
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
17.06.2010, 13:27 #8
Цитата Сообщение от USHЁL Посмотреть сообщение
Я думал,что функция Set должна возвращать ссылку на объект stringy,но оказалось что это просто функция не возвращающая ни чего
Если вы в функцию передаете аргумент по ссылке, то не надо возвращать измененное значение, так как будет меняться именно этот параметр, т.к. он передается по ссылке... Это можно использовать, когда надо вернуть из функции больше чем одно знчение - можно передать аргументы по ссылке и они напрямую будут изменены в функции...
По поводу delete, вы правы, надо обязательно освободить память, но в main, т.к если вы в set удалите память, то ее потом в main'e вы не сможете использовать (распечатать). Освободите ее при завершении
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char *argv[])
{
  stringy beany;
  char testing[] = "Realnost'-ne to,chto nam viditsya.";
  set(beany,testing);
  show(beany);
  show(beany,2);
  testing[0] = 'D';
  testing[1] = 'u';
  show(testing);
  show(testing,3);
  show("Gotovo!");
  system("PAUSE");
  delete [] beany.str;
  return EXIT_SUCCESS;
}
1
USHЁL
0 / 0 / 0
Регистрация: 15.11.2009
Сообщений: 93
21.06.2010, 17:24  [ТС] #9
Не много с запозданием спросил. Очень занят был.
У меня такой вот вопрос:Можно ли заменить код вашей функции:

Цитата Сообщение от NNN777 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
void show( char tes[],int n)
{ 
 int count = 0, i=0, j;
for (i=0; i<n; i++)
{
 for (j=0; j<strlen(tes); j++)
 cout<<tes[j];
 cout<<endl;
}
cout<<endl; 
}
на вот этот:

C++
1
2
3
4
5
6
7
8
9
void show(const char tes[],int n)
{ 
        for (int i=0; i<n; i++)
        {
                cout<<tes;
                cout<<endl;
        }
        cout<<endl; 
}
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
22.06.2010, 08:59 #10
Цитата Сообщение от USHЁL Посмотреть сообщение
Не много с запозданием спросил. Очень занят был.
У меня такой вот вопрос:Можно ли заменить код вашей функции:



на вот этот:

void show(const char tes[],int n)
{
for (int i=0; i<n; i++)
{
cout<<tes;
cout<<endl;
}
cout<<endl;
}
Да, можно)
1
ant3
0 / 0 / 0
Регистрация: 15.06.2017
Сообщений: 14
19.07.2017, 16:49 #11
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>
#include <cstring>
using namespace std;
 
struct stringy {
    char*str;
    int ct;
};
void set(stringy&something, char sometest[]);
 
int main()
{
    stringy beany;
    char testing[] = "Reality isn't what is used to be.";
    set(beany, testing);
    delete[]beany.str;
        return 0;
}
 
void set(stringy&something, char sometest[])
{
    
    something.str = new char[strlen(sometest)+1];
    something.str = sometest;          //strcpy(something.str, sometest);
    
}
Объясните пожалуйста почему ТАК : something.str = sometest НЕЛЬЗЯ? Спасибо
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
19.07.2017, 16:57 #12
Цитата Сообщение от ant3 Посмотреть сообщение
Объясните пожалуйста почему ТАК : something.str = sometest НЕЛЬЗЯ? Спасибо
Так можно, только делаться будет другое. Будет присвоение адреса.
Если необходимо скопировать строку, адрес начала которой у нас имеется, то надо либо в цикле пробежаться по всем элементам последовательности (символам строки) и выполнить их присвоение, либо использовать функцию strcpy. Адрес начала при этом используется как отправная точка.
1
19.07.2017, 16:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2017, 16:57
Привет! Вот еще темы с ответами:

Как правильно вернуть из функции сформированную в ней строку? - C (СИ)
Как правильно вернуть из функции сформированную в ней строку? Возвращать массив это- возвращать указатель на первый элемент. Но...

Определить, есть ли общая цифра в двух числах - Pascal ABC
Здравствуйте. Помогите решить задачу, какой день не получается. Задача: С клавиатуры вводятся 2 числа, если среди них есть общее число,...

Как правильно написать бат, запускающий программы - CMD/BAT
Нужно создать командный файл, запускающий на выполнение программы, перечисленные в командной строке (в кол-ве от 1-й до 5). После имени...

Коррекция программы так, чтобы таблица в ней отобразилась правильно - C (СИ)
Что нужно добавить в программу, чтобы столбики таблицы были друг под другом соответственно: #include &lt;iostream&gt; #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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