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

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

Войти
Регистрация
Восстановить пароль
 
MaRiNk
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 62
#1

структура. вывести кто старше - C++

04.02.2013, 20:58. Просмотров 463. Ответов 4
Метки нет (Все метки)

Всем привет! Тут такое дело, мне кажется, что задача почти решена, проблемка в одном.
Дана информация о четырех студентах. Запись имеет вид: фамилия, дата рождения, факультет. Нужно вывести данные о самом старшем по возрасту студенте.

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct st {
char *F;            //familiya
enum {number,month,year} dr;              //char dr[10];        //data rogdeniya
char ngr[10];   };    //faculitet
main()   {
const int maxrec=4;
st p[maxrec];
char buf[128],Fam[50];
FILE *f=fopen ("11.txt","r+t");
if (f==NULL) {printf("Can't open file");getchar();exit(1);}
int i=0;
while (1) {                                           
      fgets(buf,128,f);                                      
      sscanf(buf,"%s %s %s",Fam,&p[i].dr,&p[i].ngr);         
      p[i].F=new char[strlen(Fam)+1];                        
      if(p[i].F==NULL) {printf("error");getchar();exit(1);}  
      strcpy(p[i].F,Fam);                                    
    i++;                                                     
    if(feof(f) || i>maxrec-1) break;     }                  
fclose(f);           
for (int h=0;h<4;h++)
    if(2013-(p[h].dr)<1994){            //мне кажется, что тут что-то не так, не могу понять что                  
    printf("\n %s %s %s",                                     
    p[h].F,                                                   
    p[h].dr,                                                  
    p[h].ngr);   }                                            
getchar();  return 0;  }
Добавлено через 18 минут
подскажите, как записать условие для вывода инфы о самом старшем студенте?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2013, 20:58     структура. вывести кто старше
Посмотрите здесь:

C++ Динамическая структура. Кто бы решил?( на C)
Структура: Вывести на экран книги 2010 года выпуска. C++
C++ Структура: вывести на экран информацию о результатах прыжков в длину, отсортированную в порядке возрастания мест
Структура (вывести время вылета по возрастанию) C++
Структура. Вывести информацию о поездах, следующих из Москвы в Санкт-Петербург C++
C++ Известны год, номер месяца и день рождения каждого из двух человек.Определить, кто из них старше с++
Структура. Вывести информацию по студентам в порядке уменьшения среднего балла C++
C++ Структура Район, вывести районы с наибольшим числом ресторанов
C++ Структура Trains, вывести все сведения о поездах, время пребывания в пути которых превышает 7 часов 10 мин
Структура "Работники". Вывести данные о работниках старше 30-ти лет без высшего образования C++
Структура STUDENT, вывести фамилии и номера групп для студентов, имеющих двойки C++
C++ Структура: вывести в консоль координаты точки, отрезка треугольника

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
05.02.2013, 00:52     структура. вывести кто старше #2
я бы сказал, что тут всё плохо... сейчас напишу Вам код пооптимальнее.

Добавлено через 48 минут
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
58
59
60
61
62
63
#include <conio.h>
#include <string>
#include <fstream>
#include <iostream>
#include <locale>
using namespace std;
 
const int maxrec = 4;
 
struct student
{
    string familia;         //фамилия
    int day, month, year;   //число, месяц, год рождения
    string fakultet;
};
 
int compare(student st1, student st2)   //возвращает: 1 если st1 старше st2
{                                       //            0 если st1 младше st2
    if(st1.year < st2.year)             //            -1 если они ровесники
        return 1;
    else if(st1.year > st2.year)
        return 0;
    else if(st1.month < st2.month)
        return 1;
    else if(st1.month > st2.month)
        return 0;
    else if(st1.day < st2.day)
        return 1;
    else if(st1.day > st2.day)
        return 0;
    else return -1;
 
}
 
int main()
{
    setlocale(LC_ALL, "");
    student arr[maxrec];
    ifstream file("11.txt");
    for(int i = 0; i < maxrec; i++)
    {
        file >> arr[i].familia >> arr[i].day
             >> arr[i].month >> arr[i].year 
             >> arr[i].fakultet;                    //читаем из файла
 
        if(file.eof())           //если встретили конец файла, аварийно завершить программу
            exit(-1);
    }
    student oldestStudent = arr[0];             //здесь будем хранить старшего студента,
                                        //предположим что это 0-ой студент
    for(int i = 1; i < maxrec; i++)
        if(compare(oldestStudent, arr[i]) == -1)
        {
            cout << "Однозначно страршего студента нет.";
           _getch();
            exit(0);
        }
        else if(compare(arr[i],oldestStudent))
            oldestStudent = arr[i];
    cout << "Самый старший студент - " << oldestStudent.familia;
 
 
}
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
05.02.2013, 00:56     структура. вывести кто старше #3
структуируйте программу.
чтение в список - отдельная операция.
поиск старшего - тоже.
вывод - тоже отдельная операция. не надо все в одну кучу лепить.
вот такой код под себя адаптируйте. нужно зачитывать из файла и
если возраст у вас задается другими типами данных, то в функции
MinByAge определять возраст и возвращать тру если первый младше второго.
все более менее аккуратненько и на плюсах а не каша с и с++ и мешанина
разных действий:


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
 
struct Student
{
    unsigned age;
    std::string name;
    std::string faculty;
 
    Student(int theAge = 0, const std::string& theName = std::string(), const std::string& theFaculty = std::string())
        : age(theAge)
        , name(theName)
        , faculty(theFaculty)
    {
    }
};
 
std::ostream& operator << (std::ostream& out, const Student& student)
{
    out << "age     : " << student.age << std::endl;
    out << "name    : " << student.name << std::endl;
    out << "faculty : " << student.faculty << std::endl;
    return out;
}
 
typedef std::list<Student> StudentList;
 
bool ReadStudents(const std::string& fileName, StudentList& lst)
{
    // тут читаем из файла. но лень. эмулируем это чтение:
 
    lst.push_back(Student(17, "Student17", "Faculty1"));
    lst.push_back(Student(18, "Student18", "Faculty2"));
    lst.push_back(Student(19, "Student19", "Faculty3"));
    lst.push_back(Student(20, "Student20", "Faculty4"));
 
    return true;
}
 
bool MinByAge(const Student& student1, const Student& student2)
{
    return student1.age < student2.age;
}
 
int main()
{
    StudentList students;
    const bool isOk = ReadStudents("students.txt", students);
    if (!isOk)
    {
        std::cout << "Failed to read students from file." << std::endl;
        return -1;
    }
 
    if (students.empty())
    {
        std::cout << "There are no students." << std::endl;
        return 0;
    }
    
 
    StudentList::const_iterator oldestStudentIter = std::max_element(
        students.begin(), students.end(), &MinByAge);
 
    std::cout << "Oldest student:" << std::endl;
    std::cout << *oldestStudentIter << std::endl;
 
    return 0;
}
сказанное относится к первому посту. во втором уже получше.
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
05.02.2013, 01:00     структура. вывести кто старше #4
Цитата Сообщение от DU Посмотреть сообщение
структуируйте программу.
чтение в список - отдельная операция.
поиск старшего - тоже.
вывод - тоже отдельная операция. не надо все в одну кучу лепить.
вот такой код под себя адаптируйте. нужно зачитывать из файла и
если возраст у вас задается другими типами данных, то в функции
MinByAge определять возраст и возвращать тру если первый младше второго.
все более менее аккуратненько и на плюсах а не каша с и с++ и мешанина
разных действий:


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
 
struct Student
{
    unsigned age;
    std::string name;
    std::string faculty;
 
    Student(int theAge = 0, const std::string& theName = std::string(), const std::string& theFaculty = std::string())
        : age(theAge)
        , name(theName)
        , faculty(theFaculty)
    {
    }
};
 
std::ostream& operator << (std::ostream& out, const Student& student)
{
    out << "age     : " << student.age << std::endl;
    out << "name    : " << student.name << std::endl;
    out << "faculty : " << student.faculty << std::endl;
    return out;
}
 
typedef std::list<Student> StudentList;
 
bool ReadStudents(const std::string& fileName, StudentList& lst)
{
    // тут читаем из файла. но лень. эмулируем это чтение:
 
    lst.push_back(Student(17, "Student17", "Faculty1"));
    lst.push_back(Student(18, "Student18", "Faculty2"));
    lst.push_back(Student(19, "Student19", "Faculty3"));
    lst.push_back(Student(20, "Student20", "Faculty4"));
 
    return true;
}
 
bool MinByAge(const Student& student1, const Student& student2)
{
    return student1.age < student2.age;
}
 
int main()
{
    StudentList students;
    const bool isOk = ReadStudents("students.txt", students);
    if (!isOk)
    {
        std::cout << "Failed to read students from file." << std::endl;
        return -1;
    }
 
    if (students.empty())
    {
        std::cout << "There are no students." << std::endl;
        return 0;
    }
    
 
    StudentList::const_iterator oldestStudentIter = std::max_element(
        students.begin(), students.end(), &MinByAge);
 
    std::cout << "Oldest student:" << std::endl;
    std::cout << *oldestStudentIter << std::endl;
 
    return 0;
}
сказанное относится к первому посту. во втором уже получше.

Согласен... пример с перегрузкой операторов гораздо круче.
MaRiNk
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 62
05.02.2013, 19:33  [ТС]     структура. вывести кто старше #5
нет, нет, нет! вот то, что мне нужно было!
возможно вы писали тоже самое, но у меня те коды не запускались
а вот этот идет прекрасно!
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
//4 studenta.F,dr,facultet.vyvesti dannye o samom starshem
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct st {
char *F;            //familiya             //enum {number,month,year} dr;//
int dr;              //god rogdeniya
char ngr[10];   };    //facultet
main()   {clrscr();  int k;int x=2013;
const int maxrec=4;
st p[maxrec];
char buf[128],Fam[50];
FILE *f=fopen ("11.txt","r+t");
if (f==NULL) {printf("Can't open file");getchar();exit(1);} ////
int i=0;
while (1) {                                                  //
      fgets(buf,128,f);                                      //
      sscanf(buf,"%s %d %s",Fam,&p[i].dr,&p[i].ngr);         //
      p[i].F=new char[strlen(Fam)+1];                        //
      if(p[i].F==NULL) {printf("error");getchar();exit(1);}  ////
      strcpy(p[i].F,Fam);                                // x=p[i].dr;
      if (p[i].dr<x){ k=i;  x=p[i].dr;}                       //
    i++;                                                     //
    if(feof(f) || i>maxrec-1) break;     }
fclose(f);  int max=p[0].dr;
int maxh;
 for (k=0;k<maxrec;k++)     if(p[k].dr<max){max=p[k].dr;maxh=k;}
 for (k=0;k<maxrec;k++)     if(p[k].dr==max)
printf("\nsamuj starshiy student %s %i %s",  p[k].F,  p[k].dr,  p[k].ngr);
getchar();  return 0;  }
Добавлено через 2 минуты
но все-равно, спасибо вам за потраченные усилия! Побольше бы таких отзывчивых людей!=)
Yandex
Объявления
05.02.2013, 19:33     структура. вывести кто старше
Ответ Создать тему
Опции темы

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