Нужно чуть подправить программы. Массив и структура.

Тема в разделе "C/C++/C#", создана пользователем -, 26 янв 2011.

  1. Гость

    1. Двумерный массив. Вводим количество спортсменов, далее вводим имя для каждого. Для каждого из них рандомно выводятся результаты (6 попыток). После ищется максимальный элемент и выводится под именем спортсмена. Так вот вопрос: рядом с каждым максимальным элементом нужно в скобочках указать номер попытки, т.е. номер элемента массива. Не могу понять как сделать. Спасибо.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Двумерный массив</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    //---------------------------------------------------------------------------

    #pragma hdrstop
    #include <stdio.h>
    #include <stdlib.h>

    //---------------------------------------------------------------------------

    #pragma argsused
    int main(int argc, char* argv[])
    {
    int c[20];
    char fio[20][15];
    int m,res,i,j,max,result;
    printf("Vvedite kol-vo sportsmenov\n");
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
    result=0;
    printf("Vvedite familiy %d sportsmena\n",i+1);
    scanf("%s",fio[i]);
    max=0;
    printf("Resultati %d sportsmena: ",i+1);
    for(j=0;j<6;j++)
    {
    res=rand()%150+150;
    printf("%d ",res);
    if(res>max)
    max=res;
    result=max;
    }
    c[i]=result;
    printf("\n");
    getchar();
    }
    printf("Luchshii resultat:\n");
    for(i=0;i<m;i++)
    printf("%15s",fio[i]);
    printf("\n");
    for(i=0;i<m;i++)
    printf("%15d",c[i]);
    getchar();
    return 0;
    }
    //---------------------------------------------------------------------------
    2. Структура. Нужно вывести анкетные данные учеником, которые учатся на "отлично" и "хорошо", т.е. без троек. Сначало вводим имя, фамилию, дату рождения, вводим количество предметов и оценки по ним. И вот нужно вывести Фамилию и Имя ученика, который учится без троек. Так вот в чем вопрос: программа не хочет верно выводить. Помогите в чем загвостка. Спасибо.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Структура</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    //---------------------------------------------------------------------------

    #pragma hdrstop
    #include <stdio.h>

    //---------------------------------------------------------------------------
    #pragma argsused
    int main(int argc, char* argv[])
    {
    const n=1;
    struct students
    {
    char name[8],surname[12];
    int day,month,year,pr;
    int ball[4];
    };
    students s[10];
    int i,j;
    for(i=0;i<n;i++)
    {
    printf("Informaciya o %d studente\n",i+1);
    printf("Vvedite imya\n");
    scanf("%s",s[i].name);
    printf("Vvedite familiy\n");
    scanf("%s",s[i].surname);
    printf("Data rojdeniya DD MM YYYY\n");
    scanf("%d%d%d",&s[i].day,&s[i].month,&s[i].year);
    printf("Vvedite kolichestvo predmetov\n");
    scanf("%d",&s[i].pr);       // s[i].pr - количество предметов
    getchar();
    printf("Ocenki\n");
    for(j=0;j<s[i].pr;j++)
    {
    printf("Vvedite ocenku %d predmeta\n",j+1);
    scanf("%d",&s[i].ball[j]);    // s[i].ball[j] - оценки
    }
    }
    printf("Imya     Familiya    Data rojdenia   Ocenki\n");
    for(i=0;i<n;i++)
    {
    printf("%-8s%-12s%5d/%d/%d",s[i].name,s[i].surname,s[i].day,
    s[i].month,s[i].year);
    for(j=0;j<s[i].pr;j++)
    printf("%5d",s[i].ball[j]);
    printf("\n");
    }
    printf("\n");
    printf("Studenti uspevaushie na 4 and 5:");
    for(i=0;i>n;i++)
    {
    if(s[i].ball[j]>3)
    printf("%-8s%-12s",s[i].name,s[i].surname);
    else
    printf("otsutstvuyt");
    }
    getchar();getchar();
    return 0;
    }
    //---------------------------------------------------------------------------
     
  2. IrineK

    IrineK Гость

    Нужно ввести еще массив переменных try_out[20] по количеству спортсменов и текущую try_num для запоминания j при определении максимума:

    int main(int argc, char* argv[])
    {
    int c[20];
    int try_out[20];
    char fio[20][15];
    int m,res,i,j,max,result,try_num;
    printf("Vvedite kol-vo sportsmenov\n");
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
    result=0;
    printf("Vvedite familiy %d sportsmena\n",i+1);
    scanf("%s",fio);
    max=0;
    printf("Resultati %d sportsmena: ",i+1);
    for(j=0;j<6;j++)
    {
    res=rand()%150+150;
    printf("%d ",res);
    if(res>max)
    {max=res;
    try_num=j+1;
    }
    }
    c=max;
    try_out=try_num;
    printf("\n");
    getchar();
    }
    printf("FIO Luchshii resultat Nomer popytki\n");
    for(i=0;i<m;i++)
    {printf("%15s",fio);
    printf("%15d",c);
    printf("%15d",try_out);
    printf("\n");
    }

    getchar();
    return 0;
    }


    Замечу, что рандомайз у вас получится однообразный, поскольку не загружен seed.
     
  3. Гость

    Спасибо брат, помог очень)))) Еще бы на структуры))
     
  4. IrineK

    IrineK Гость

    Извини, брат, я - сестра.
    Структуры посмотрю завтра в обеденный перерыв.
     
  5. IrineK

    IrineK Гость

    Во второй задаче нужно
    1) ввести флаг, чтобы "банить" студентов с тройками;
    2) ввести счетчик, чтобы вывести ссобщение про отсутствие успевающих на 4 и 5 (можно выводить также, сколько успевает);
    3) переписать последний цикл.

    Имеем:
    int main(int argc, char* argv[])
    {
    int const n=2;
    struct students
    {
    char name[8],surname[12];
    int day,month,year,pr;
    int ball[4];
    };
    students s[10];
    int i,j,flag;
    int count=0;
    for(i=0;i<n;i++)
    {
    printf("Informaciya o %d studente\n",i+1);
    printf("Vvedite imya\n");
    scanf("%s",s.name);
    printf("Vvedite familiy\n");
    scanf("%s",s.surname);
    printf("Data rojdeniya DD MM YYYY\n");
    scanf("%d%d%d",&s.day,&s.month,&s.year);
    printf("Vvedite kolichestvo predmetov\n");
    scanf("%d",&s.pr); // s.pr - количество предметов
    getchar();
    printf("Ocenki\n");
    for(j=0;j<s.pr;j++)
    {
    printf("Vvedite ocenku %d predmeta\n",j+1);
    scanf("%d",&s.ball[j]); // s.ball[j] - оценки
    }
    }
    printf("Imya Familiya Data rojdenia Ocenki\n");
    for(i=0;i<n;i++)
    {
    printf("%-8s%-12s%5d/%d/%d",s.name,s.surname,s.day,
    s.month,s.year);
    for(j=0;j<s.pr;j++)
    printf("%5d",s.ball[j]);
    printf("\n");
    }
    printf("\n");
    printf("Studenti uspevaushie na 4 and 5:");
    for(i=0;i<n;i++)
    {
    flag=1;
    for(j=0;j<s.pr;j++)
    if(s.ball[j]<4)
    {
    flag=0;
    break;
    }
    if(flag)
    {
    printf("%-8s%-12s",s[i].name,s[i].surname);
    count++;
    }
    }

    if(!count) printf("otsutstvuyt");
    getchar();getchar();
    return 0;
    }[/i][/i]
    [i]

    Удачи.
    Если что, меня быстрее можно найти на [url="allproblems.ucoz.ru"]http://allproblems.ucoz.ru[/url].[/i]
     
  6. Гость

    Всем спасибо за помощь))
     
  7. Гость

    IrineK, и правда рандомайз однообразный(( как это можно исправить?
     
  8. IrineK

    IrineK Гость

    Рандомайз нужно реализовывать двумя строками.
    Первая: srand(seed);
    Вторая: rand() или манипуляции над этой функцией.

    Если вы не пишете первую строку, то по умолчанию берется srand(1). Тогда при каждом запуске будет одинаковый набор сгенерированных чисел. Чтобы этого избежать, необходимо каждый раз загружать новый seed. Это несложно реализовать, если обратиться к функции time. Она возвращает системное время, с каждой секундой меняющее свое значение.

    На практике выполняем следующие действия:
    1) #include <time.h>
    2) где-то в начале main() пишем: srand ( time(NULL) );
    Все остальное - без изменений.

    Почитать можно по адресу: http://www.cplusplus.com/reference/clibrary/cstdlib/srand
    На www.cplusplus.com вообще собраны отличные материалы, правда, на английском языке.
    Anyway, English is a must for a successful developer in the modern world.
     
  9. Гость

    вот рабочая структура:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Структура</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <iomanip.h>
    #include <iostream.h>
    #include <vcl.h>
    //---------------------------------------------------------------------------

    const int n=25, m=20;
    struct student
    {char   surname[m],
    name[m];
    unsigned int day,
    month,
    year,
    ball[3];
    };
    int main()
    {student stud[n];
    cout<<"Kol-vo studentov: ";
    int k, kol=0;
    cin>>k;
    for (int i = 0; i < k; i++) {
    cout<<"VVedite informaciy o "<<i+1<<" - studente"<<endl;
    cout<<"Surname: ";
    cin>>stud[i].surname;
    cout<<"Name: ";
    cin>>stud[i].name;
    cout<<"Birthday (day, month, year) ";
    cin>>stud[i].day>>stud[i].month>>stud[i].year;
    cout<<"Ball (fisica,mathematica,himiya) ";
    cin>>stud[i].ball[0]>>stud[i].ball[1]>>stud[i].ball[2];
    }
    cout<<endl;
    cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i = 0; i < k; i++) {
    if (stud[i].ball[0]==5&&stud[i].ball[2]==5||stud[i].ball[0]==4&&stud[i].ball[2]==4)
    kol++;
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<
    setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    cout<<endl<<endl;
    cout<<"Result:"<<endl;
    if (kol>0)
    {cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i=0;i<k;i++)
    if (stud[i].ball[0]>3&&stud[i].ball[1]>3&&stud[i].ball[2]>3)
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    else cout<<"No student";
    getchar();getchar();
    return 0;
    }
    //---------------------------------------------------------------------------
    нужно её немного изменить, т.е. составить задачу из двух структур, вынести строчки<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">строчки</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    unsigned int day,
    month,
    year,
    ball[3];
    из структуры и создать еще одну.
    вот так:<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">примерно</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <iomanip.h>
    #include <iostream.h>
    #include <vcl.h>
    //---------------------------------------------------------------------------

    const int n=25, m=20;
    unsigned int day,
    month,
    year,
    ball[3];
    struct student
    {char   surname[m],
    name[m];
    };
    int main()
    {student stud[n];
    cout<<"Kol-vo studentov: ";
    int k, kol=0;
    cin>>k;
    for (int i = 0; i < k; i++) {
    cout<<"VVedite informaciy o "<<i+1<<" - studente"<<endl;
    cout<<"Surname: ";
    cin>>stud[i].surname;
    cout<<"Name: ";
    cin>>stud[i].name;
    cout<<"Birthday (day, month, year) ";
    cin>>stud[i].day>>stud[i].month>>stud[i].year;
    cout<<"Ball (fisica,mathematica,himiya) ";
    cin>>stud[i].ball[0]>>stud[i].ball[1]>>stud[i].ball[2];
    }
    cout<<endl;
    cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i = 0; i < k; i++) {
    if (stud[i].ball[0]==5&&stud[i].ball[2]==5||stud[i].ball[0]==4&&stud[i].ball[2]==4)
    kol++;
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<
    setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    cout<<endl<<endl;
    cout<<"Result:"<<endl;
    if (kol>0)
    {cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i=0;i<k;i++)
    if (stud[i].ball[0]>3&&stud[i].ball[1]>3&&stud[i].ball[2]>3)
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    else cout<<"No student";
    getchar();getchar();
    return 0;
    }
    //---------------------------------------------------------------------------
    но как составить вторую структуру, чтобы все работало не получается, помогите если не сложно.
     
  10. RiCrO

    RiCrO Гость

    Не врубаюсь в вашу логику...

    Что вам создать нужно? Структуру вторую? Копию предыдущей?

    Ну так напиши struct student_2 { } и внеси свои строчки.
     
  11. Гость

    RiCrO, нужно вынести эти строчки из структуры, и что то еще дописать, чтобы программа работала.
     
  12. RiCrO

    RiCrO Гость

    Очевидно. Две структуры работать не будут с одними и теми же данными. Если создашь подобные данные, но с другими названиями, например surname_second - будет работать.

    Но это для новичков, которые не знают понятия наследования и классы.

    Делается это так:

    Код (C++):
    struct student
    {
    char    surname[m],
    name[m];
    unsigned int day, month, year, ball[3];
    };

    struct student_2 : public student
    { ... // любые новые данные
    };
    Спросишь, что такое public? Отвечаю - это спецификатор доступа. В данном случае он является открытым. Это значит что вторая структура имеет доступ к данным и методам первой, базовой структуры.
     
  13. RiCrO

    RiCrO Гость

    Брр... Выносите. Не вижу проблемы. Вам достаточно убрать точечный оператор там, где он используется с вашими переменными.

    <!--shcode--><pre><code class='c++'>int main(int argc, char* argv[])
    {
    int const n=2;
    struct students
    {
    char name[8],surname[12];
    int day,month,year,pr;
    int ball[4];
    };
    students s[10];
    int i,j,flag;
    int count=0;
    for(i=0;i<n;i++)
    {
    printf("Informaciya o %d studente\n",i+1);
    printf("Vvedite imya\n");
    scanf("%s",s.name);
    printf("Vvedite familiy\n");
    scanf("%s",s.surname);
    printf("Data rojdeniya DD MM YYYY\n");
    scanf("%d%d%d",&s.day,&s.month,&s.year);
    printf("Vvedite kolichestvo predmetov\n");
    scanf("%d",&s.pr); // s.pr - количество предметов
    getchar();
    printf("Ocenki\n");
    for(j=0;j<s.pr;j++)
    {
    printf("Vvedite ocenku %d predmeta\n",j+1);
    scanf("%d",&s.ball[j]); // s.ball[j] - оценки
    }
    }
    printf("Imya Familiya Data rojdenia Ocenki\n");
    for(i=0;i<n;i++)
    {
    printf("%-8s%-12s%5d/%d/%d",s.name,s.surname,s.day,
    s.month,s.year);
    for(j=0;j<s.pr;j++)
    printf("%5d",s.ball[j]);
    printf("\n");
    }
    printf("\n");
    printf("Studenti uspevaushie na 4 and 5:");
    for(i=0;i<n;i++)
    {
    flag=1;
    for(j=0;j<s.pr;j++)
    if(s.ball[j]<4)
    {
    flag=0;
    break;
    }
    if(flag)
    {
    printf("%-8s%-12s",s.name,s[i].surname);
    count++;
    }
    }

    if(!count) printf("otsutstvuyt");
    getchar();getchar();
    return 0;
    }[/CODE]

    Выполнение кода небрежное... Попробуй ввести дату вида 11.03.89 и получишь забавный результат. Хотя конкретно придраться не к чему. Но я бы пользовался getline().[/i]
     
  14. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    IrineK
    Сестра! Не подавай плохой пример! Используй тэги!
     
  15. IrineK

    IrineK Гость

    Простите великодушно. Вы о чем?
     
  16. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Я о том, что когда ты пишешь сообщение с кодом С/С++, код нужно ставить в
    Код (C++):
    ТЭГ С++
    (небольшая квадратная кнопка "С++") над редактируемым сообщением.
    Я думаю ваш код в сообщении №5 мало кто читать будет, а если и будет то с большим отвращением.

    Добавлено: Да, и банальный отступ в блоках то же бы не помешал.
     
  17. RiCrO

    RiCrO Гость

    К сожалению, общих стандартов написания программ ещё не был создан. Всё зависит только от конкретного человека и его культуры написания программ.
     
  18. Гость

    вы не на тот код смотрите, я ниже выложил другой:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Структура</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <iomanip.h>
    #include <iostream.h>
    #include <vcl.h>
    //---------------------------------------------------------------------------

    const int n=25, m=20;
    struct student
    {char   surname[m],
    name[m];
    unsigned int day,
    month,
    year,
    ball[3];
    };
    int main()
    {student stud[n];
    cout<<"Kol-vo studentov: ";
    int k, kol=0;
    cin>>k;
    for (int i = 0; i < k; i++) {
    cout<<"VVedite informaciy o "<<i+1<<" - studente"<<endl;
    cout<<"Surname: ";
    cin>>stud[i].surname;
    cout<<"Name: ";
    cin>>stud[i].name;
    cout<<"Birthday (day, month, year) ";
    cin>>stud[i].day>>stud[i].month>>stud[i].year;
    cout<<"Ball (fisica,mathematica,himiya) ";
    cin>>stud[i].ball[0]>>stud[i].ball[1]>>stud[i].ball[2];
    }
    cout<<endl;
    cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i = 0; i < k; i++) {
    if (stud[i].ball[0]==5&&stud[i].ball[2]==5||stud[i].ball[0]==4&&stud[i].ball[2]==4)
    kol++;
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<
    setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    cout<<endl<<endl;
    cout<<"Result:"<<endl;
    if (kol>0)
    {cout<<setw(20)<<"Surname"<<setw(20)<<"Name"<<setw(18)<<"Birthday"<<setw(20)<<"Ball(fis,math,him)"<<endl;
    for (int i=0;i<k;i++)
    if (stud[i].ball[0]>3&&stud[i].ball[1]>3&&stud[i].ball[2]>3)
    cout<<setw(20)<<stud[i].surname<<setw(20)<<stud[i].name<<setw(8)<<""<<setw(2)<<setfill('0')<<stud[i].day<<'/'
    <<setw(2)<<setfill('0')<<stud[i].month<<'/'<<stud[i].year<<setfill(' ')<<setw(16)<<stud[i].ball[0]<<' '<<stud[i].ball[1]<<' '<<stud[i].ball[2]<<endl;
    }
    else cout<<"No student";
    getchar();getchar();
    return 0;
    }
    //---------------------------------------------------------------------------
     
  19. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Константин93
    У тебя жесткий диск на 20 мегабайт и ты экономишь на пробелах?

    P.S.:
    Да и еще, если бы я был твоим преподом и ты делал эту программу для меня то я бы тебя изнасиловал за это.
     
  20. Гость

    lazybiz, мне препод сам сказал так делать, а не через printf и scanf. "Чем непонятней код, тем круче программист" - мой препод.
     
Загрузка...

Поделиться этой страницей