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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2012, 02:29   #1
Johnny_Grunge
 
Регистрация: 21.01.2012
Сообщений: 6
По умолчанию Определение максимальных элементов массива (С++)

Всем доброй ночи)
Задача следующая. Даны два массива, в одном 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)
{
	char max=0;
	printf_s("\nmax:\n");
	for (int i=0;i<n;i++)
	{
	if(s[i].mas>s[max].mas)  max=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);
}

Последний раз редактировалось Johnny_Grunge; 21.01.2012 в 17:45.
Johnny_Grunge вне форума Ответить с цитированием
Старый 21.01.2012, 06:33   #2
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Код:
#include <stdio.h>


void minmax ( const spisok *s, const int n )
{
    if ( !n ){
        char max = 0;
        for ( int i = 1; i < n; ++i )
            if ( s[i].mas > s[max].mas )
                max = i;
        printf ( "max: %s  %d\n", s[max].name, s[max].mas );
    }else
        puts ( "Error size of the spisok" );
}
ERAGORN вне форума Ответить с цитированием
Старый 21.01.2012, 14:46   #3
Johnny_Grunge
 
Регистрация: 21.01.2012
Сообщений: 6
По умолчанию

Спасибо, но всё равно не работает.. Выводит только Error size of the spisok.
Johnny_Grunge вне форума Ответить с цитированием
Старый 21.01.2012, 16:09   #4
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Упс, логическая ошибка.
В первом условии надо просто n без отрицания (!).
ERAGORN вне форума Ответить с цитированием
Старый 21.01.2012, 16:28   #5
Johnny_Grunge
 
Регистрация: 21.01.2012
Сообщений: 6
По умолчанию

Делал так, выводит массив и число -51
Вообще не могу понять в чём дело,
в содержимом файлов вроде тоже ничего особенного нет
Код:
1 2 3 4 5
Код:
1 2 3 4 5 5 3 2 6 7 8 3 9 3 5 7 3 8 9 3
Johnny_Grunge вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
определение элементов массива с++ ZeX Помощь студентам 0 06.12.2011 15:45
количество максимальных элементов в масиве viknik Помощь студентам 3 21.03.2011 09:04
поиск максимальных элементов в массиве radiokarazinec Общие вопросы Delphi 1 26.12.2010 12:53
Определение количества максимальных значений. denicko Помощь студентам 0 26.10.2010 17:19
Сумма максимальных элементов матриц в Pascal Бармалей Помощь студентам 19 19.11.2009 15:59