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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2013, 17:13   #1
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию Записи в Си

Данные об ученике состоят из его имени фамилии и класса в котором он учиться.Найти есть ли в школе ученики с одинаковой фамилией.Сортировать массив по возрастанию номера класса, а в пределах одного класса сортировать по алфавиту фамилий.
Вот я создал Данные об ученике состоят из его имени фамилии и класса в котором он учиться.
И не могу дальше продвинуться.

Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
struct form
       { char surname[20];
         char name[20];
         int klass;
       };
       
void Create (form*p)
     { printf ("Enter surname: ");
       scanf ("%s", p->surname);
       printf ("Enter name: ");
       scanf ("%s", p->name);
       printf ("Enter klass: ");
       scanf ("%d", &p->klass);
     }

void Print (form*p)
     { printf ("%s\n", p->surname);
       printf ("%s\n", p->name);
       printf ("%d\n", p->klass);
     }

int main (void)
    { int  i, j; form temp;
     
      form a[2];
      for (i=0; i<2; i++)
          Create (&a[i]);
      for (i=0; i<2; i++)
          Print (&a[i]);
system ("pause");
return 0;
}
majuw вне форума Ответить с цитированием
Старый 10.04.2013, 17:12   #2
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Так, что кто-то может помочь?
majuw вне форума Ответить с цитированием
Старый 10.04.2013, 17:36   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Найти есть ли в школе ученики с одинаковой фамилией.
Решение: отсортировать массив по фамилиям - ученики с одинаковыми фамилиями окажутся соседними.


Пусть есть функция
Код:
bool is_greater(const form& a, const form& b);
, которая возвращает true, если и только если a "больше" b. Напишите код, сортирующий массив "по возрастанию".
Abstraction вне форума Ответить с цитированием
Старый 11.04.2013, 18:58   #4
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Помогите пожалуйста вот я написал код по сортировке фамилий , как мне :Найти есть ли в школе ученики с одинаковой фамилией.
Код:
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include<conio.h>

 
struct UCHENIK
{
 char NAME[20];
 char SURNAME[20];
 int klass;
 }
 Uchen[2];
 
void vvod()
{
 int i;
 for (i=0; i<2; i++)
  {
  printf("Vvedite dannye pro uchnya\n", i+1);
  printf("Name enter: \n");
  scanf("%s", Uchen[i].NAME);
  
  printf("Enter Surname\n ");
  scanf("%s", Uchen[i].SURNAME);
  printf("Enter klass\n");
  scanf("%d", &Uchen[i].klass); 
  }
}
void printrezult()
{
 int z;
  for(z=0;z<2;z++)
  {
   printf("%s %s %d\n",Uchen[z].NAME,Uchen[z].SURNAME,Uchen[z].klass);
  }
}
 
void sort()
{
 int j,k;
 UCHENIK p;
 for(j=0; j<2; j++)
  {
   for(k=0; k<2; k++)
    {
     if(strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0)
      {
       p=Uchen[j];
       Uchen[j]=Uchen[k];
       Uchen[k]=p;
      }
    }
  }
}
 
void main()
{vvod();
 printf("Do sortirovki:\n");
 printf("Name Surname  Klass\n");
 printrezult();
 sort();
 printf("posle sortirovki:\n");
 printf("Name Surname  Klass\n");
 printrezult();
 getch();
}

Последний раз редактировалось majuw; 11.04.2013 в 19:02.
majuw вне форума Ответить с цитированием
Старый 11.04.2013, 21:19   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Идёте по отсортированному массиву с первого элемента до предпоследнего. Если у какого-то текущего (i-го) и следующего (i+1-го) ученика окажутся одинаковые фамилии - значит, ученики с одинаковыми фамилиями есть. Если не окажутся ни разу - значит, их нет вообще.
Abstraction вне форума Ответить с цитированием
Старый 11.04.2013, 22:12   #6
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

я понял сам алгоритм , но не имею представление ,как в моей программе это оформить, не могли б вы помочь написать?Буду очень благодарен.
majuw вне форума Ответить с цитированием
Старый 12.04.2013, 16:32   #7
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Уважаемые форумчани! Вот я сделал 2 пункта с задачи :Данные об ученике состоят из его имени фамилии и класса в котором он учиться.Найти есть ли в школе ученики с одинаковой фамилией.Сортировать массив по возрастанию номера класса.

Помогите пожалуйста дописать последний пункт:а в пределах одного класса сортировать по алфавиту фамилий.
Код:
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define n 4
 
struct UCHENIK
{
 char NAME[20];
 char SURNAME[20];
 int klass;
 } Uchen[n];
 
void vvod()
{
 int i;
 for (i=0; i<n; i++)
  {
  printf("Vvedite dannye pro uchnya\n", i+1);
  printf("Name enter:\n");
  scanf("%s", Uchen[i].NAME);
  printf("Enter Surname\n ");
  scanf("%s", Uchen[i].SURNAME);
  printf("Enter klass\n");
  scanf("%d", &Uchen[i].klass); 
  }
}
void printrezult()
{int z;
  for(z=0;z<n;z++)
  { printf("%s      %s       %d\n",Uchen[z].NAME,Uchen[z].SURNAME,Uchen[z].klass);
  }
}
 
void Surnamesame()
{ int j,k,i;
 UCHENIK p;
 for(j=0; j<n; j++)
  {
   for(k=0; k<n; k++)
    {
     if(strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0)
      {
       p=Uchen[j];
       Uchen[j]=Uchen[k];
       Uchen[k]=p;
	 }
   }
 }
   for (i=0;i<n-1;i++)
   {if(strcmp(Uchen[i].SURNAME,Uchen[i+1].SURNAME)==0)
    printf ("Surname odnakovi %s\n",Uchen[i].SURNAME);
   }

}


void sorted()
{ int j,k;
 UCHENIK p;
 for(j=0; j<n-1; j++)
  {
   for(k=0; k<n-1; k++)
    {
     if((Uchen[k].klass)>(Uchen[k+1].klass))
      {
       p=Uchen[k];
       Uchen[k]=Uchen[k+1];
       Uchen[k+1]=p;

      }
    }
  }
}
void main()
{vvod();
 printf("Do sortirovki:\n");
 printf("Name  Surname  Klass\n");
 printrezult();
 Surnamesame();
 sorted();
 printf("Sort klass:\n");
 printf("Name  Surname  Klass\n");
 printrezult();

 getch();
}
majuw вне форума Ответить с цитированием
Старый 12.04.2013, 17:02   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
 if((Uchen[j].klass)>(Uchen[k].klass) && strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0)      {
       p=Uchen[k];
       Uchen[k]=Uchen[j];
       Uchen[j]=p;

      }
Так по идее если нужно сортировать по нескольким полям.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2013, 17:03   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Та же сортировка, что и в Surnamesame(), только условие в if - не strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0, а is_less(Uchen[j], Uchen[k]). Функция is_less:
Код:
bool is_less(const UCHENIK& a, const UCHENIK& b){
  //Если класс a меньше класса b - вернуть true
  //Если класс a больше класса b - вернуть false
  //Если фамилия a меньше фамилии b - вернуть true
  //Иначе вернуть false.
}
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 19:15   #10
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Спасибо Вам огромное, задача получилась)))Если кому-то нужно , то вот код:
Код:
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define n 4
 

struct UCHENIK
{
 char NAME[20];
 char SURNAME[20];
 int klass;
 } Uchen[n];


 bool is_less(const UCHENIK&a, const UCHENIK&b){
	for(int j=0; j<n; j++)
  {
   for(int k=0; k<n; k++)
    {
     if((Uchen[j].klass)<(Uchen[k].klass))
		return true;
	 else 
		 return false;	 
 {int j,k;
 for(j=0; j<n; j++)
  {
   for(k=0; k<n; k++)

 {if(strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0)
      return true;
 else 
	 return false;
   }
 }
 }
   }
	}
 }

void vvod()
{
 int i;
 for (i=0; i<n; i++)
  {
  printf("Vvedite dannye pro uchnya\n", i+1);
  printf("Name enter:\n");
  scanf("%s", Uchen[i].NAME);
  printf("Enter Surname\n ");
  scanf("%s", Uchen[i].SURNAME);
  printf("Enter klass\n");
  scanf("%d", &Uchen[i].klass); 
  }
}
void printrezult()
{int z;
  for(z=0;z<n;z++)
  { printf("%s      %s       %d\n",Uchen[z].NAME,Uchen[z].SURNAME,Uchen[z].klass);
  }
}
 
void Surnamesame()
{ int j,k,i;
 UCHENIK p;
 for(j=0; j<n; j++)
  {
   for(k=0; k<n; k++)
    {
     if(strcmp(Uchen[j].SURNAME,Uchen[k].SURNAME)<0)
      {
       p=Uchen[j];
       Uchen[j]=Uchen[k];
       Uchen[k]=p;
	 }
   }
 }
   for (i=0;i<n-1;i++)
   {if(strcmp(Uchen[i].SURNAME,Uchen[i+1].SURNAME)==0)
    printf ("Surname odnakovi %s\n",Uchen[i].SURNAME);
   }
   printf ("Ne mae Surname odnakovix \n");
}


void sorted()
{ int j,k;
 UCHENIK p;
 for(j=0; j<n-1; j++)
  {
   for(k=0; k<n-1; k++)
    {
     if((Uchen[k].klass)>(Uchen[k+1].klass))
      {
       p=Uchen[k];
       Uchen[k]=Uchen[k+1];
       Uchen[k+1]=p;

      }
    }
  }
}
void surnameklass()
{int j,k,i;
 UCHENIK p;
 for(j=0; j<n; j++)
  {
   for(k=0; k<n; k++)
    {
     if( is_less(Uchen[j], Uchen[k]))
      {
       p=Uchen[j];
       Uchen[j]=Uchen[k];
       Uchen[k]=p;
	 }
   }
 }
}
void main()
{vvod();
 printf("Do sortirovki:\n");
 printf("Name       Surname      Klass\n");
 printrezult();
 Surnamesame();
 sorted();
 printf("Sort klass:\n");
 printf("Name       Surname      Klass\n");
 printrezult();
 surnameklass();
 printf("Sort  za klassom i surname:\n");
 printf("Name       Surname      Klass\n");
 printrezult();
 getch();
}
majuw вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить записи из таблицы, если дата в записи старше 30 дней Aleksandr БД в Delphi 10 28.03.2013 21:33
Оцените математической формулой, насколько больше цифр в двоичной записи большого числа, чем в его десятичной записи. Анюта.Хом Помощь студентам 1 02.12.2011 23:13
Записи _Hanter_ Паскаль, Turbo Pascal, PascalABC.NET 2 21.11.2011 21:36
Записи as1212 Помощь студентам 0 31.10.2011 21:22
записи((( diller89 Помощь студентам 2 25.04.2010 18:32