• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Guest
  • Дата начала
G

Guest

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">
Код:
//---------------------------------------------------------------------------

#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">
Код:
//---------------------------------------------------------------------------

#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;
}
//---------------------------------------------------------------------------
 
I

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.
 
I

IrineK

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

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.name,s.surname);
count++;
}
}

if(!count) printf("otsutstvuyt");
getchar();getchar();
return 0;
}


Удачи.
Если что, меня быстрее можно найти на .
 
I

IrineK

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

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

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

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

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

Guest

вот рабочая структура:
<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">
Код:
//---------------------------------------------------------------------------
#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">
Код:
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">
Код:
//---------------------------------------------------------------------------
#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;
}
//---------------------------------------------------------------------------
но как составить вторую структуру, чтобы все работало не получается, помогите если не сложно.
 
R

RiCrO

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

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

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

Guest

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

RiCrO

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

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

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

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

struct student_2 : public student
{ ... // любые новые данные
};

Спросишь, что такое public? Отвечаю - это спецификатор доступа. В данном случае он является открытым. Это значит что вторая структура имеет доступ к данным и методам первой, базовой структуры.
 
R

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.surname);
count++;
}
}

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

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

lazybiz

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

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

Guest

Выполнение кода небрежное...
вы не на тот код смотрите, я ниже выложил другой:
<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;
}
//---------------------------------------------------------------------------
 
L

lazybiz

Константин93
У тебя жесткий диск на 20 мегабайт и ты экономишь на пробелах?

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

Guest

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!