Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 21:46   #1
cranxx
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 10
Вопрос Структуры (сравнение)

Дана структура там есть поле ФИО, как раставить фамилии по алфавиту? Пробовал как со строками, выкидывает ошибку.
cranxx вне форума Ответить с цитированием
Старый 04.12.2010, 22:00   #2
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

вот пример:
Код:
#include <iostream.h>
#include <string.h>
struct sotr
{
char familia[20];
int day;
int mesac;
int year;
};
void main()
{
sotr sot[128];
int i,j,a,m;
char* str;
cout<<"Введите колличество сотрудников: ";
cin>>a;
for (i=0;i<a;i++)
{
cout<<"\nФамилия сотрудника №"<<i+1<<": ";
cin>>sot[i].familia;
cout<<"\nДень рождения сотрудника "<<sot[i].familia<<": ";
cin>>sot[i].day;
cout<<"\nМесяц рождения сотрудника "<<sot[i].familia<<": ";
cin>>sot[i].mesac;
cout<<"\nГод рождения сотрудника "<<sot[i].familia<<": ";
cin>>sot[i].year;
}
for (j=0;j<=a;j++)
{
for (i=1;i<a;i++)
{
if (strcmp(sot[i-1].familia, sot[i].familia)>0)
{

strcpy(str, sot[i-1].familia);
strcpy(sot[i-1].familia, sot[i].familia);
strcpy(sot[i].familia, str);

m=sot[i-1].day;
sot[i-1].day=sot[i].day;
sot[i].day=m;

m=sot[i-1].mesac;
sot[i-1].mesac=sot[i].mesac;
sot[i].mesac=m;

m=sot[i-1].year;
sot[i-1].year=sot[i].year;
sot[i].year=m;
}
}
}
for (i=0;i<a;i++)
{
cout<<sot[i].familia<<endl;
cout<<sot[i].day<<endl;
cout<<sot[i].mesac<<endl;
cout<<sot[i].year<<endl<<endl;
}
}
wm_leviathan вне форума Ответить с цитированием
Старый 04.12.2010, 22:31   #3
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Достаточно переопределить оператор "меньше" для структур и воспользоваться сортировкой стандартного списка. В данном примере структуры вставляются в список в порядке, обратном алфавитному, и после сортировки упорядочены по алфавиту.
Код:
#include <string.h>
#include <list>
#include <iostream>

struct Foo
{
    char name[32];
    int i;
    float f;
    bool b;
};

bool operator < (const Foo &a, const Foo &b)
{
    return strcmp(a.name, b.name) < 0;
}

int main(int, char *[])
{
    std::list<Foo> l;
    Foo foo1 = {"aaa", 0, 0, true};
    Foo foo2 = {"bbb", 0, 0, true};
    Foo foo3 = {"ccc", 0, 0, true};
    Foo foo4 = {"ddd", 0, 0, true};
    Foo foo5 = {"eee", 0, 0, true};
    l.push_back(foo5);
    l.push_back(foo4);
    l.push_back(foo3);
    l.push_back(foo2);
    l.push_back(foo1);
    std::cout << "Before sorting" << std::endl;
    for(std::list<Foo>::const_iterator i = l.begin(); i != l.end(); ++i) std::cout << i->name << std::endl;
    l.sort();
    std::cout << "After sorting" << std::endl;
    for(std::list<Foo>::const_iterator i = l.begin(); i != l.end(); ++i) std::cout << i->name << std::endl;
    return 0;
}
Результат:
Цитата:
Before sorting
eee
ddd
ccc
bbb
aaa
After sorting
aaa
bbb
ccc
ddd
eee

Последний раз редактировалось sergey.d; 04.12.2010 в 22:40.
sergey.d вне форума Ответить с цитированием
Старый 04.12.2010, 23:03   #4
cranxx
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 10
По умолчанию

Полное условие: Ведомость состоит из абитуриентов, сдавших вступительные экзамены в университет, содержит ФИО, адрес, оценки. Определить количество абитуриентов проживающих в городе минсе и сдавших экзамены со средним баллом не ниже 4,5, высести их фамилии в алфавитном порядке.
Код:
#include <iostream.h>
#include <string.h>
int main()
{
	struct strc{
		char fio[40];
		char adr[7];
		int ocn[4];
		double sb;
	} mstud[100];

	int nst,i,j;
	double p=4.5;
	cout<<"Vvedite kol-vo studentov"<<endl;
	cin>>nst;
for (i=0;i<nst;i++)
{
	cout<<"Vvedite FIO";
	cin>>mstud[i].fio;

	cout<<"Vvedite adres";
	cin>>mstud[i].adr;

    cout<<"Vvedite ocenki";
mstud[i].sb=0;

for (j=0;j<4;j++)
{
cin>>mstud[i].ocn[j];
	mstud[i].sb+=mstud[i].ocn[j]/4;
}
cout<<endl;
}

strc stemp;
for (i=0;i<nst-1;i++)
for (j=i+1;j<nst;j++)
if (mstud[i].sb>=p
	&& mstud[j].sb>=p
	&& strcmp(mstud[i].adr,"Minsk")
	&& strcmp(mstud[j].adr,"Minsk"))
	{
if (strcmp(mstud[i].fio, mstud[j].fio)>0)
{
stemp=mstud[i];
mstud[i]=mstud[j];
mstud[j]=stemp;
}
}

for (i=0;i<nst;i++)
if (!strcmp(mstud[i].adr,"Minsk"))
cout<<mstud[i].fio<<" "<<mstud[i].adr<<" "
    <<mstud[i].sb<<endl;

return 0;              
}
В алфавитном порядке выводит. А средний балл не считает... В чем ошибка??

Последний раз редактировалось Stilet; 05.12.2010 в 13:29.
cranxx вне форума Ответить с цитированием
Старый 05.12.2010, 03:28   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

и почему в наших вузах не учат использовать stl, или почему студенты сами не пытаются в ней полазить? ведь ясно же, что даже поверхностные знания позволяют избежать геморроя с динаммическими массивами, сортировками, поисками и прочими стандартными задачами.

вот как выглядит полное решение вашей задачи с использованием стл (заполнение списка студентов сделайте по вкусу). Если разберетесь, сэкономите себе кучу времени в будущем:

Код:
#include "stdafx.h"

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>

typedef std::string String;
typedef unsigned Point;
typedef std::vector<Point> PointsList;

struct Student
{
  String     name;
  String     address;
  PointsList points;
};
typedef std::vector<Student> StudentsList;

double CalcAveragePoint(const PointsList& points)
{
  if (points.empty())
  {
    return 0;
  }

  const Point pointsSumm = std::accumulate(points.begin(), points.end(), 0);
  return double(pointsSumm) / points.size();
}

void FillStudentsList(StudentsList& result)
{
  StudentsList tmp;

  {
    tmp.push_back(Student());
    Student& student = tmp.back();
    student.name = "D name";
    student.address = "B address";
    student.points.push_back(4);
    student.points.push_back(4);
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
  }

  {
    tmp.push_back(Student());
    Student& student = tmp.back();
    student.name = "C name";
    student.address = "B address";
    student.points.push_back(4);
    student.points.push_back(4);
    student.points.push_back(4);
    student.points.push_back(4);
    student.points.push_back(4);
    student.points.push_back(3);
    student.points.push_back(3);
    student.points.push_back(3);
    student.points.push_back(5);
  }

  {
    tmp.push_back(Student());
    Student& student = tmp.back();
    student.name = "B name";
    student.address = "B address";
    student.points.push_back(4);
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
  }

  {
    tmp.push_back(Student());
    Student& student = tmp.back();
    student.name = "A name";
    student.address = "A adress";
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
    student.points.push_back(5);
  }

  result.swap(tmp);
}

bool LessByName(const Student& one, const Student& other)
{
  return one.name < other.name;
}

bool LessByAddress(const Student& one, const Student& other)
{
  return one.address < other.address;
}

bool LessByAveragePoint(const Student& one, const Student& other)
{
  return CalcAveragePoint(one.points) < CalcAveragePoint(other.points);
}

bool MatchedByCondition(const Student& student)
{
  if (student.address != "B address")
  {
    return false;
  }

  const double averagePoint = CalcAveragePoint(student.points);
  if (averagePoint < 4.5)
  {
    return false;
  }

  return true;
}

bool NotMatchedByCondition(const Student& student)
{
  return !MatchedByCondition(student);
}


std::ostream& operator << (std::ostream& out, const Student& student)
{
  return out << student.name << "; " << student.address << "; " << CalcAveragePoint(student.points);
}

void PrintStudentsList(std::ostream& out, const StudentsList& students, const String& listTitle)
{
  out << "---------------------------------------------------" << std::endl;
  out << listTitle << ":" << std::endl;
  std::copy(students.begin(), students.end(), std::ostream_iterator<Student>(out, "\n"));
}

int _tmain(int argc, _TCHAR* argv[])
{
  StudentsList students;

  FillStudentsList(students);
  PrintStudentsList(std::cout, students, "all students list");

  students.erase(std::remove_if(students.begin(), students.end(), NotMatchedByCondition), students.end());
  PrintStudentsList(std::cout, students, "matched students list");

  std::sort(students.begin(), students.end(), &LessByName);
  PrintStudentsList(std::cout, students, "sorted by name students list");

  std::sort(students.begin(), students.end(), &LessByAveragePoint);
  PrintStudentsList(std::cout, students, "sorted by average point students list");

  return 0;
}
_Ч_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В массиве из п элементов много совпадающих элементов. Найти количество различных элементов Strax Фриланс 11 12.06.2010 20:13
Запрос на сравнение элементов строк. Dobriak-ru Microsoft Office Access 2 31.03.2010 13:42
Найти максимальный из положительных элементов матрицы и сумму отрицательных элементов. bessonov12 Microsoft Office Excel 7 04.05.2009 05:44
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16
Массив структур с заранее неизвестным количеством элементов, С++ PersonaGrata Общие вопросы C/C++ 8 24.02.2008 16:34