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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2012, 21:34   #1
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
Восклицание си найти младшего и старшего студента

Итак, нужно среди списка студентов найти самого младшего, самого страшего и самого старшего из Иванов. Первоначальная задача была найти количество Иванов в групе, вот как я это реализовал
Код:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{char str[250]="Babak Kirilo Bodnar Ivan Boxonko Nazar Bik Ivan Gavrilyuk Ivan Gzhegockij Roman Gishka Volodimir Gishhak Roksolana Didishin Yuly Klimovec Irina Krasnozhonov Volodimir Kuchkuda Roman Levko Igor Leshhuk Igor Lyuba Irina Myakshinov Sergj";
	int i=0, count=0, flag=0;
	clrscr();
	while(str[i]!='\0')
	{
		if((str[i]=='I')&&(str[i+1]=='v')&&(str[i+2]=='a')&&(str[i+3]=='n'))
			flag=1;
		if(str[i]==' '&&flag==1)
		{
			count++;
			flag=0;
		}

		i++;
	}

printf("Ivaniv %d",count);
getch();
}
подскажите, как найти самого младшего, старшего и старшего Ивана!
gylayko вне форума Ответить с цитированием
Старый 02.04.2012, 21:38   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

исходя из того что есть, только телепатически))
нужно связать имена с возрастом! например, оформить список как набор записей имя+возраст, тогда и сравнение с именем проще будет
GreenWizard вне форума Ответить с цитированием
Старый 03.04.2012, 09:33   #3
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

забыл написать, там в список после каждого студента добавляется год рождения. я понимаю, что нужно нати сначала наименьшший год из всех, потом вывести те 2 слова, которые идут до этого года, так же и с наибольшим годом. а с Иванами так: если слово="Иван", сморим года рождения, и так же находим наименьший. но вот с реализацией проблема! поможете?
gylayko вне форума Ответить с цитированием
Старый 03.04.2012, 10:58   #4
akimosa
 
Регистрация: 02.04.2012
Сообщений: 8
По умолчанию

Если в задании нет запрета на использование массива, то можно записать все данные в двумерный массив [3] [n], после чего провести сортировку (после пробела переход на след ячейку массива, после 3х пробелов переход на след строку массива) когда получишь заполненый массив, можешь уже делать с ним любые манипуляции...
akimosa вне форума Ответить с цитированием
Старый 03.04.2012, 11:00   #5
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

тоже мысль интересная! но опять же, с реализацией проблема, можете хоть немного показать как оно делается?
gylayko вне форума Ответить с цитированием
Старый 03.04.2012, 11:37   #6
akimosa
 
Регистрация: 02.04.2012
Сообщений: 8
По умолчанию

будет время, вечером по ковыряю. Я сейчас изучаю си, так что мне тоже заинтересовала данная задача ))
akimosa вне форума Ответить с цитированием
Старый 03.04.2012, 16:35   #7
akimosa
 
Регистрация: 02.04.2012
Сообщений: 8
По умолчанию

Код:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void init_last_name(void);
void init_name(void);
void init_age(void);
void print_init_struct(void);

	struct spisok
		  {
		   char last_name[20];
		   char name[20];
		   char age[5];
		  };
	struct spisok sp[16];
	int i,j,k,z;
	char str[315]="Babak Kirilo 1980 Bodnar Ivan 1982 Boxonko Nazar 1983 Bik Ivan 1987 Gavrilyuk Ivan 1901 Gzhegockij Roman 1956 Gishka Volodimir 1947 Gishhak Roksolana 2001 Didishin Yuly 1995 Klimovec Irina 1986 Krasnozhonov Volodimir 1954 Kuchkuda Roman 1865 Levko Igor 1652 Leshhuk Igor 1963 Lyuba Irina 1961 Myakshinov Sergj 1652#";

void main()
{
	k = -1;

	for (j = 0; j < 16;j++)
	{
	for (i = 1; i < 4; i++)
		{
		switch(i)
		{
		case 1:
		init_last_name();
		break;
		case 2:
		init_name();
		break;
		case 3:
		init_age();
		//printf ("%c %c \n", sp[1].age[3], sp[1].age[6] );
		break;
		}
		}

	}
	print_init_struct();
	system("pause");
 return 0;
}

void init_last_name(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	if (str[k]=='#')
	{
	return 0;
	}
	sp[j].last_name[z] = str[k];
	}
	while (str[k]!=' ');
	return 0;
}
void init_name(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	if (str[k]=='#')
	{
	return 0;
	}
	sp[j].name[z] = str[k];
	}
	while (str[k]!=' ');
	return 0;
}
void init_age(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	if (str[k]=='#')
	{
	return 0;
	}
	sp[j].age[z] = str[k];
	}
	while (str[k]!=' ');
	return 0;
}

void print_init_struct(void)
{
for (i = 0; i < 16; i++)
	{
	printf("%15s %15s %15s \n", sp[i].last_name, sp[i].name, sp[i].age);
	}
  return 0;
}
это создание и заполнение массива структур... т.е. получился "двумерный массив из массивов символов составляющих строки"
прога пока с багом! в структуре не понятно почему к году приклеивается фамилия, но думаю позже решу, ну или сам позже решишь....
akimosa вне форума Ответить с цитированием
Старый 03.04.2012, 17:23   #8
akimosa
 
Регистрация: 02.04.2012
Сообщений: 8
Смех

чот не получилось поправить верхний пост .
В общем все поправил, и перевел года рождения в int. так что тебе осталось только сделать сортировку, и выведение на консоль нужного результата!
Код:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void init_last_name(void);
void init_name(void);
void init_age(void);
void print_init_struct(void);

	struct spisok
		  {
		   char last_name[20];
		   char name[20];
		   int age;
		  };
	struct spisok sp[16];
	int i,j,k,z;
	char per[4];
	char str[315]="Babak Kirilo 1980 Bodnar Ivan 1982 Boxonko Nazar 1983 Bik Ivan 1987 Gavrilyuk Ivan 1901 Gzhegockij Roman 1956 Gishka Volodimir 1947 Gishhak Roksolana 2001 Didishin Yuly 1995 Klimovec Irina 1986 Krasnozhonov Volodimir 1954 Kuchkuda Roman 1865 Levko Igor 1652 Leshhuk Igor 1963 Lyuba Irina 1961 Myakshinov Sergj 1652#";

void main()
{
	k = -1;

	for (j = 0; j < 16;j++)
	{
	for (i = 1; i < 4; i++)
		{
		switch(i)
		{
		case 1:
		init_last_name();
		break;
		case 2:
		init_name();
		break;
		case 3:
		init_age();
		//printf ("%c %c \n", sp[1].age[3], sp[1].age[6] );
		break;
		}
		}

	}
	print_init_struct();
	system("pause");
 return 0;
}

void init_last_name(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	if (str[k]=='#')
	{
	return 0;
	}
	sp[j].last_name[z] = str[k];
	}
	while (str[k]!=' ');
	return 0;
}
void init_name(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	if (str[k]=='#')
	{
	return 0;
	}
	sp[j].name[z] = str[k];
	}
	while (str[k]!=' ');
	return 0;
}
void init_age(void)
{
	z=-1;
	do
	{
	k++;
	z++;
	per[z] = str[k];
	}
	while (str[k]!=' ');
	z = (per[0]-48)*1000+(per[1]-48)*100+(per[2]-48)*10+(per[3]-48);
	sp[j].age = z;
	//printf ("%d \n", sp[j].age);
	return 0;
}

void print_init_struct(void)
{
for (i = 0; i < 16; i++)
	{
	printf("%15s %15s %15d \n", sp[i].last_name, sp[i].name, sp[i].age);
	}
  return 0;
}
akimosa вне форума Ответить с цитированием
Старый 03.04.2012, 20:15   #9
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

там чет на returnы ругается, говорит, что функция cannot return a value во всех функциях! что делать то?
да, сортировку вот такую Вы имеете ввиду?
Код:
max=1;
min=1;
minivan=1;
for (i=0;i<16;i++)
{if (sp[i].age>max)
  {max=sp[i].age;
  printf("starshii %d %d %d ",sp[i].age,sp[i].name,sp[i].last_name;)
  }
if (sp[i].age<min)
  {min=sp[i].age;
  printf(" mladshii %d %d %d ",sp[i].age,sp[i].name,sp[i].last_name;)
  }
if ((sp[i].name="Ivan")&&(sp[i].age<minivan))
{min=sp[i].age;
  printf(" mladshii iz Ivanov %d %d %d ",sp[i].age,sp[i].name,sp[i].last_name;)
  }
gylayko вне форума Ответить с цитированием
Старый 03.04.2012, 21:25   #10
akimosa
 
Регистрация: 02.04.2012
Сообщений: 8
По умолчанию

я пишу в Embarcadero RAD Studio 2010, может там си работает от части как си++, попробуй в ретурн засунуть возвращаемое значение...
для "init_name" "return (sp[j].name);". Если не поможет, можешь вообще вызов функции заменить самой функцией, просто мне не удобно программить единый код, потом уже в писанине не разбираюсь...

по поводу мин и мах, я немного не понял метод, но наверное правильно. Я когда делал примитивно перебрал комбинации ))...
Код:
	for (i = 0, j=0; i < 16; i++)
	{
	if (sp[j].age < sp[i].age)
	{
	j=i;
	}
	}
Ради интереса твое задание закончил, но не буду тебе мешать наслаждатся си, если уже совсем не получится, пиши, скину весь код

Последний раз редактировалось akimosa; 03.04.2012 в 21:36.
akimosa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение младшего и старшего байта числа. spamer Общие вопросы Delphi 10 17.04.2009 15:43
Access. запрос который будет выводить самого старшего студента из разных курсов Alex1991 Microsoft Office Access 2 23.02.2009 22:40
Access. запрос который будет выводить самого старшего студента из разных курсов Alex1991 Помощь студентам 3 21.02.2009 14:04
взятие старшего и младшего байта Djaconda Общие вопросы Delphi 2 29.09.2008 09:25