Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Структуры. Перевод из С в С++


Автор: Dmitriysokol 13.4.2010, 16:03
Задание: Поля структуры: фамилия, имя, возраст, структура результат: мин. сек. Определить место самого юного участника 

Код
#include <stdio.h>
#include <conio.h>

typedef struct RESULT
 {int min;
 int sec;
 };

typedef struct SPORT
 {char surname[20];
  char name[20];
  int old;
  RESULT res;
 };

void strct_in(SPORT *sp, int i);
int strct_obr(SPORT *sp, const int i);

void main()
{
 int i, n;
 SPORT sp[30];

 clrscr();
 printf ("vvedite kol-vo sportsmenov: ");
 scanf ("%d", &i);
 strct_in(sp, i);
 n=strct_obr(sp, i);
 printf ("\n n=%d",n);
 getch();
}

void strct_in(SPORT *sp, int i)
{

 printf (" surname name old rezmin rezsec:\n ");
 for (int k=0; k<i; k++)
     {
     scanf ("%s",&sp[k].surname);
     scanf ("%s",&sp[k].name);
     scanf ("%d",&sp[k].old);
     scanf ("%d",&sp[k].res.min);
     scanf ("%d",&sp[k].res.sec);
    }
}

int strct_obr(SPORT *sp,  const int i)
{
 int young, n, k=0, b=0;
 young=sp[0].old;

for (n=1; n<i; n++)
if (sp[n].old < young) young=sp[n].old, k=n;

 int rr = sp[k].res.min*60 + sp[k].res.sec;

 for (n=0; n<i; n++)
    if (sp[n].res.min*60+sp[n].res.sec < rr) b++;

 return b+1;
}

необходимо перевести в С++


Модератор: не забываем пользоваться кнопочкой "Код"

Автор: ИванМ 13.4.2010, 16:08
замени char[] на string, scanf на cin, printf на cout, перегрузи istream operator>>, ostream operator<< для своих классов, добавь алгоритмы из STL взамен своих операций и желательно убери getch() - лучше всего замени его на system("pause")

Автор: bsa 13.4.2010, 16:27
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Dmitriysokol 13.4.2010, 16:46
Я как бы теорию по С++ более менее знаю, но к  сожалению на практике могу применить только в довольно простых задачах...как раз в этой не получается. Можете дать  примерный код?

Автор: ИванМ 13.4.2010, 17:01
типа такого, проверяйте:
Код

#include <string>
#include <iostream>
#include <vector>

struct RESULT
{
    int min;
    int sec;
};

struct SPORT
{
    std::string surname;
    std::string name;
    int old;
    RESULT res;
};

std::istream& operator>>(std::istream& stream, RESULT& res)
{
    stream>>res.min>>res.sec;
    return stream;
}

std::istream& operator>>(std::istream& stream, SPORT& sport)
{
    stream>>sport.surname>>sport.name>>sport.old>>sport.res;
    return stream;
}

void strct_in(std::vector<SPORT> & s)
{
    std::cout<<" surname name old rezmin rezsec:\n ";
    for(size_t i=0;i<s.size();i++)
    {
        std::cout<<"element #"<<i+1<<std::endl;
        std::cin>>s[i];
    }
}

int strct_obr(std::vector<SPORT>& sp);

void main()
{
 int i, n; 
 std::cout<<"vvedite kol-vo sportsmenov: ";
 std::cin>>i;
 std::vector<SPORT> sp(i); 
 strct_in(sp);
 n=strct_obr(sp);
 std::cout<<"\n n="<<n<<std::endl;
 system("pause");
}

int strct_obr(std::vector<SPORT> &sp)
{
    int young, k=0, b=0;
    size_t n;
    young=sp[0].old;
    for (n=0; n<sp.size(); n++)
        if (sp[n].old < young) young=sp[n].old, k=n;

    int rr = sp[k].res.min*60 + sp[k].res.sec;

    for (n=0; n<sp.size(); n++)
        if (sp[n].res.min*60+sp[n].res.sec < rr) b++;

    return b+1;
}


Автор: mes 13.4.2010, 18:35
Цитата(ИванМ @  13.4.2010,  16:01 Найти цитируемый пост)
типа такого

ИванМ, Вы забыли написать что это так называемый "машинный " перевод с С на С++
так что Dmitriysokol Вам все равно надо напрячься, если хотите получить нормальный результат..
smile

Добавлено через 45 секунд
P.S. ой тема уже перенесена, тут может и повезет smile

Автор: SaNioK 14.4.2010, 10:01
Код

#include <iostream>
using namespace std;
class RESULT {
public:
    int min;
    int sec;
};

class SPORT {
public:
    string name;
    string surname;
    int old;
    RESULT res;
    SPORT() {
        surname = "";
        name = "";
        old = 0;
        res.min = 0;
        res.sec = 0;
    }
};

void strct_in(SPORT *sp, int i);
int strct_obr(SPORT *sp, const int i);
int main()
{
    int i, n;
    cout << "vvedite kol-vo sportsmenov: ";
    cin >> i;
    SPORT* sp = new SPORT[i];
    if (sp == 0) { cout << "Ошибка выделения памяти" << endl; return 1;}
    strct_in(sp, i);
    n=strct_obr(sp, i);
    cout << "\n n = " << n;
    return 0;
}
void strct_in(SPORT *sp, int i)
{
    cout << " surname name old rezmin rezsec:\n ";
    for (int k=0; k<i; k++) {
        cin >> sp[k].surname;
        cin >> sp[k].name;
        cin >> sp[k].old;
        cin >> sp[k].res.min;
        cin >> sp[k].res.sec;
    }
}
int strct_obr(SPORT *sp,  const int i)
{
    int young, n, k=0, b=0;
    young=sp[0].old;
    for (n=1; n<i; n++)
        if (sp[n].old < young) young=sp[n].old, k=n;
            int rr = sp[k].res.min*60 + sp[k].res.sec;

    for (n=0; n<i; n++)
        if (sp[n].res.min*60+sp[n].res.sec < rr) b++;
            return b+1;
}


Оно?

Автор: ИванМ 14.4.2010, 16:33
SaNioK, и что вы хотели сказать этим кодом?

Автор: SaNioK 14.4.2010, 21:05
2 ИванМ
А что вам собственно не нравится?
Я не знаю как у автора, но у нас преподы при переводе требовали перевод структур в классы, если вы про это.

Автор: ИванМ 14.4.2010, 21:20
SaNioK, я имел ввиду, что вы ничего нового не привнесли, а только убрали некоторые возможности из моего варианта.
На счет перевода из структур в классы - думаю, ваши преподы не совсем компетентны. Структура в C++ это такой же класс, за исключением того, что доступ по умолчанию public. В таком простом случае это и нужно. Все равно вы сами везде написали public. Только лишняя строчка кода.

Автор: SaNioK 15.4.2010, 00:54
2 ИванМ
Простите но я не смотрел ваш код, я увидел комментарий mes и решил что стоит написать.
А насчет их компетенции, скорее лишь очередная проверка знаний.

Автор: ИванМ 15.4.2010, 01:16
SaNioK, комментарий mes'а был по поводу того, что алгоритм работы программы изначально неправильный, не смотря на то, что я перевел в си++. Функция strct_obr непонятно как работает. Так что если вам не лень, можете ее исправить. Я лично вообще не понял смысл задания, просто тупо перевел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)