Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Evgeniy_
0 / 0 / 1
Регистрация: 17.11.2011
Сообщений: 7
#1

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

21.01.2012, 17:03. Просмотров 1181. Ответов 9
Метки нет (Все метки)

Всем добрый день)
Задача следующая. Даны два массива, в одном 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);
}

http://www.cyberforum.ru/cpp-beginners/thread1743542.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 17:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Определение максимальных элементов массива (С++) (C++):

Удаление максимальных элементов из массива
Помогите пожалуйста написать программу на С. Задан массив действительных чисел...

Количество максимальных элементов массива
Написал код рабочий по нахождению максимального элемента, но вот проблемка, не...

Выбрать n максимальных элементов из массива
Есть структура: struct data { /* какте-то поля */ uint32_t num; ...

Вывести количество максимальных элементов массива
Доброго всем вечера, задали написать программу которая выводит количество...

Найти количество максимальных элементов массива
Дан массив а,состоящий из n целых чисел (n&lt;=100).Найти количество максимальных...

9
soon
2545 / 1310 / 177
Регистрация: 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;
}
1
Evgeniy_
0 / 0 / 1
Регистрация: 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 ещё отвечает за вывод в исходнике
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:07 #4
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
как его можно будет объявить через void? Функция minmax ещё отвечает за вывод в исходнике
Это не есть хорошо, но раз вы хотите. Меняйте return max на printf("%c", max -> mas) и пишите void вместо spisok*
0
Том Ардер
Модератор
Эксперт по математике/физике
3819 / 2431 / 327
Регистрация: 15.06.2009
Сообщений: 4,442
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);
А здесь и вовсе массив структур!
И формат чтения - для вещественных чисел.

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


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



Цитата Сообщение от Том Ардер Посмотреть сообщение
А здесь и вовсе массив структур!
И формат чтения - для вещественных чисел.
По требованию к заданию, нужно работать со структурами, если решать обычным способом, то задача простейшая.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:37 #7
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
да, да нужно поменять на float, но от этого мало что меняется
Поменяйте и изменится. Выводит H потому, что это символьное представление максимального числа.
0
Evgeniy_
0 / 0 / 1
Регистрация: 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, не вывел ничего
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:59 #9
Цитата Сообщение от Evgeniy_ Посмотреть сообщение
printf_s("%c", max -> mas);
Если меняете на float то и пишите %f. Я просто ориентировался на тип данных char вот и вывел его.
0
Evgeniy_
0 / 0 / 1
Регистрация: 17.11.2011
Сообщений: 7
21.01.2012, 19:08  [ТС] #10
Теперь получилось это
0
Миниатюры
Определение максимальных элементов массива (С++)  
21.01.2012, 19:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2012, 19:08
Привет! Вот еще темы с решениями:

Поиск максимальных элементов в столбцах двумерного массива
Добрый вечер! Помогите пожалуйста решить задачу, я начинающий.. Сформировать...

Найти произведение индексов L максимальных элементов массива
Для массива А(n) найти произведение индексов L максимальных элементов, где...

Нахождение наибольшего из максимальных элементов по столбцам двоичного массива
Добрый вечер,не могу понять,как делать( Сишку знаю плохо,а сдать очень,кое-что...

Переставить местами выбранный элемент и первый из максимальных элементов массива
3).Объединим первый и второй приёмы. Решив задачу, суть которой не в том, чтобы...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru