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

Определение максимальных элементов массива (С++) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Evgeniy_
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 17:03     Определение максимальных элементов массива (С++) #1
Всем добрый день)
Задача следующая. Даны два массива, в одном 5 элементов, в другом 20. Определить индексы и значения максимальных элементов в каждом массиве.
Всё, в принципе, работает, но никак не хочет выводить максимальные элементы. Перепробовал много способов, в любом случае, выводит все элементы массива.
Если кто-нибудь сможет помочь, буду очень благодарен.
Нахождение максимальных элементов реализуется в процедуре, в блоке minmax.
Сама программа:
Заголовочный файл
Код:
Код
#define myunit_h
#ifdef myunit_h
struct spisok
{
char *name;
char mas;
};
int strimr(char *s);
void scopy(char *d, char *s);
int input(char *fname, spisok *&s,int &n);
void minmax(spisok *s,int n);
void output(spisok *s, int n);
void freenames(spisok *s, int n);
#endif
Исходный код
Код
#include <locale.h> 
#include <stdlib.h>
#include <iomanip>
#include "string"
#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include "myunit.h"

using namespace std;
void main()
{
	spisok *s1,*s2;
	setlocale(LC_CTYPE,"Russian");
	system("cls");
	char text1[_MAX_PATH],text2[_MAX_PATH];
	int n1=0,n2=0,i,p=0;
	do
	{
		system("cls");
		printf_s("1 - Ввод 1го массива\n2 - Ввод 2го массива\n");
		printf_s("3 - Вывод 1го массива\n4 - Вывод 2го массива\n");
		printf_s("5 - Вывести по условию 1й список\n6- Вывести по условию 2й список\n");
		printf_s("0 - Выход\n");
		scanf_s("%d",&i);
		system("cls");
		switch(i)
		{
			case 1:
			printf_s("Введите имя файла:");
			scanf_s("%s",text1,_MAX_PATH);
			p=input(text1,s1,n1);
			if(p)
			switch(p)
			{
				case 1:
				printf_s("\nФайл не открыт!");
				break;
				case 2:
				printf_s("\nОшибка при чтении!");
				break;
				case 3:
				printf_s("\nОшибка при выделении памяти!");
				break;
			}
			printf_s("Файл открыт\nPress any key to Return!");
			_getch();
			break;
			case 2:
			printf_s("Введите имя файла:");
			scanf_s("%s",text2,_MAX_PATH);
			p=input(text2,s2,n2);
			if(p)
			switch(p)
			{
				case 1:
				printf_s("\nФайл не открыт!");
				break;
				case 2:
				printf_s("\nОшибка при чтении!");
				break;
				case 3:
				printf_s("\nОшибка при выделении памяти!");
				break;
			}
			printf_s("Файл открыт\nPress any key to Return!");
			_getch();
			break;
			case 3:
			output(s1,n1);
			printf_s("Press any key to Return!");
			_getch();
			break;
			printf_s("Файл открыт\nPress any key to Return!");
			_getch();
			break;
			case 4:
			output(s2,n2);
			printf_s("Press any key to Return!");
			_getch();
			break;
			case 5:
			minmax(s1,n1);
			printf_s("Press any key to Return!");
			_getch();
			break;
			case 6:
			minmax(s2,n2);
			printf_s("Press Key to Return!");
			_getch();
			break;
	}
	} while (i!=0);
	freenames(s1,n1);
	freenames(s2,n2);

}
И сама процедура

Код
#include <iostream>
#include <conio.h>
#include "myunit.h"
#include <locale.h> 
#include <stdlib.h>
#include <iomanip>
#include "string"
#include <fstream>

using namespace std;

int strimr(char *s)
{setlocale(LC_CTYPE,"Russian");
system("CLS");
	int i=strlen(s);
	if(!i)
	return 0;
	i--;
	while ((i>=0)&(s[i]==' ')) i--;
	s[++i]=0;
	return i;
}
void scopy( char *d, char *s)
{setlocale(LC_CTYPE,"Russian");
system("CLS");
	while (*s)
	*d++=*s++;
	*d=0;
}
int input(char *fname, spisok *&s,int &n)
{
	FILE *f;
	if(fopen_s(&f,fname,"r")) 
	return 1;
	if (fscanf_s(f,"%*[ \t\n]")!=EOF)
	while(fscanf_s(f,"%*[^\n]\n")!=EOF) n++;
	if(!n)
	{
		s=NULL;
		fclose(f);
		return 2;
	}
        s=(spisok*)malloc(sizeof(spisok)*n);
	if (!s)
	{
		fclose(f);
		return 3;
	}
	rewind(f);
	char buf[40];
	fscanf_s(f,"%*[ \t\n]");
	for (int i=0;i<n;i++)
	{
		fscanf_s(f,"%40[^\0]%f\n",buf,40,&s[i].mas);
		s[i].name=(char*)malloc(strimr(buf)+1);
	if (!s[i].name)
	{
			fclose(f);
			for (int k=0;k<i;k++)
			free(s[k].name);
			free(s);
			return 3;
	}
	scopy(s[i].name,buf);
	}
	fclose(f);
	return 0;
}
void minmax(spisok *s,int n)
{
	int max=*s;
	printf_s("\nmax:\n");
	for (int i=0;i<n;i++)
	{
	if(s[i].mas>s[max].mas)  s[max].mas=i;
	}
	printf_s("%s\n",s[max].name,s[max].mas);


}
void output(spisok *s, int n)
{ 
	for (int i=0;i<n;i++)
		printf_s("%s\n",s[i].name,s[i].mas);
}
void freenames(spisok *s, int n)
{
	for (int i=0;i<n;i++)
		free(s[i].name);
	free(s);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 17:24     Определение максимальных элементов массива (С++) #2
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
if(s[i].mas>s[max].mas) *s[max].mas=i;
Суть ясна?

Зачем вам столько include?

Добавлено через 3 минуты
C
1
2
3
4
5
6
7
8
9
spisok* minmax(spisok* s,int n)
{
    spisok* max = s;
    int i;
    for(i = 0; i < n; i ++)
        if(s[i].mas > max -> mas)
            max = s + i;
    return max;
}
Лучше не выводить в самой функции, а возвращать.

Добавлено через 1 минуту
Или вообще так. Передаете первый и следующий за последним элемент
C
1
2
3
4
5
6
7
8
spisok* minmax(spisok* first, spisok* last)
{
    spisok* max = first;
    for( ; first != last; ++first)
        if(first -> mas > max -> mas)
            max = first
    return max;
}
Evgeniy_
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 17:50  [ТС]     Определение максимальных элементов массива (С++) #3
Спасибо, я немного ошибся, старый вариант кода выложил. max не присваивает указатель s

Код
void minmax(spisok *s,int n)
{
        char max=0;
        printf_s("\nmax:\n");
        for (int i=0;i<n;i++)
        {
        if(s[i].mas>s[max].mas)  mas=i;
        }
        printf_s("%s\n",s[max].name,s[max].mas);
 
 
}
А если делать через ваш вариант
Код
spisok* minmax(spisok* first, spisok* last)
{
    spisok* max = first;
    for( ; first != last; ++first)
        if(first -> mas > max -> mas)
            max = first
    return max;
}
как его можно будет объявить через void? Функция minmax ещё отвечает за вывод в исходнике
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:07     Определение максимальных элементов массива (С++) #4
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
как его можно будет объявить через void? Функция minmax ещё отвечает за вывод в исходнике
Это не есть хорошо, но раз вы хотите. Меняйте return max на printf("%c", max -> mas) и пишите void вместо spisok*
Том Ардер
Модератор
 Аватар для Том Ардер
3617 / 2236 / 271
Регистрация: 15.06.2009
Сообщений: 3,917
21.01.2012, 18:22     Определение максимальных элементов массива (С++) #5
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
struct spisok
{ char *name;
char mas; };
Тип элементов массивов - если нужно искать максимальный, то почему char?
mas - индекс максимального элемента - почему char?

Цитата Сообщение от Evgeniy_ Посмотреть сообщение
fscanf_s(f,"%40[^\0]%f\n",buf,40,&s[i].mas);
s[i].name=(char*)malloc(strimr(buf)+1);
А здесь и вовсе массив структур!
И формат чтения - для вещественных чисел.

В целом - слишком всё усложнено и запутано для такой простой задачи.
Evgeniy_
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 18:35  [ТС]     Определение максимальных элементов массива (С++) #6
Цитата Сообщение от soon Посмотреть сообщение
Это не есть хорошо, но раз вы хотите. Меняйте return max на printf("%c", max -> mas) и пишите void вместо spisok*
Не работает, выводит букву H


Цитата Сообщение от Том Ардер Посмотреть сообщение
Тип элементов массивов - если нужно искать максимальный, то почему char?
mas - индекс максимального элемента - почему char?
да, да нужно поменять на float, но от этого мало что меняется



Цитата Сообщение от Том Ардер Посмотреть сообщение
А здесь и вовсе массив структур!
И формат чтения - для вещественных чисел.
По требованию к заданию, нужно работать со структурами, если решать обычным способом, то задача простейшая.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:37     Определение максимальных элементов массива (С++) #7
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
да, да нужно поменять на float, но от этого мало что меняется
Поменяйте и изменится. Выводит H потому, что это символьное представление максимального числа.
Evgeniy_
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 18:50  [ТС]     Определение максимальных элементов массива (С++) #8
Само содержимое файлов, тоже ничем сверхъестественным не отличается, не понимаю, почему такая фигня
in1.txt
Код
1 2 3 4 5
in2.txt
Код
1 2 3 4 5 5 3 2 6 7 8 3 9 3 5 7 3 8 9 3
Добавлено через 10 минут
Пробовал сделать через этот вариант
C++
1
2
3
4
5
6
7
8
9
void minmax(spisok* s,int n)
{
    spisok* max = s;
    int i;
    for(i = 0; i < n; i ++)
        if(s[i].mas > max -> mas)
            max = s + i;
   printf_s("%c", max -> mas);
}

Цитата Сообщение от soon Посмотреть сообщение
Поменяйте и изменится. Выводит H потому, что это символьное представление максимального числа.
Поменял на float, не вывел ничего
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:59     Определение максимальных элементов массива (С++) #9
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
printf_s("%c", max -> mas);
Если меняете на float то и пишите %f. Я просто ориентировался на тип данных char вот и вывел его.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2012, 19:08     Определение максимальных элементов массива (С++)
Еще ссылки по теме:

Поиск максимальных элементов в столбцах двумерного массива C++
C++ Нахождение наибольшего из максимальных элементов по столбцам двоичного массива
C++ Задача на обработку массива: поиск максимальных и минимальных элементов, перестановка

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

Или воспользуйтесь поиском по форуму:
Evgeniy_
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 19:08  [ТС]     Определение максимальных элементов массива (С++) #10
Теперь получилось это
Миниатюры
Определение максимальных элементов массива (С++)  
Yandex
Объявления
21.01.2012, 19:08     Определение максимальных элементов массива (С++)
Ответ Создать тему
Опции темы

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