Автор Тема: Определение максимальных элементов массива (С++)  (Прочитано 7749 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Johnny_Grunge

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Всем добрый день)
Задача следующая. Даны два массива, в одном 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);
}

Оффлайн disputant

  • Пользователь
  • **
  • Сообщений: 38
    • Просмотр профиля
У вас накручено в стиле "зачем просто, если можно сложно".
Это как минимум никак не C++, в лучшем случае просто C.

Что такое элементы? по вашему исходнику, мягко говоря, непонятно. Вроде вы считываете что-то типа %f (float), но прячете в строковые переменные...

Зачем по два раза считывать файл? Проще всего - сняли первый элемент, записали индекс, запомнили его как индекс максимального элемента. Далее - цикл: считываем очередной элемент, увеличиваем индекс, сравниваем с запомненным элементом. Новый больше? Запоминаем его и его индекс, как максимальные; нет - просто идем дальше.

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

И - если это C++, то активно пользуйтесь его возможностями - хотя бы потоками, строками string (если работаете со строками), забудьте про malloc и free. Еще лучше - используйте STL, типа того же max_element, примененного к istream_iterator (конечно, если правилами игры допускается применение STL).



Оффлайн Johnny_Grunge

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Я был бы рад написать эту программу обычным способом, но преподаватель, к сожалению, хочет другого

Тема: «Работа с несколькими массивами разнотипных данных, загружаемых из файла. Функции Си. Возврат результата. Передача данных через параметры. Способы передачи параметров и варианты их реализации. Защита параметра от случайного изменения. Работа с файлами и форматированный ввод/вывод. Структуры. Модули, заголовочные файлы, защита от повторного включения.»
Программа для обработки несколькими массивов разнотипных данных (или массива структур). Данные должны загружаться из файла, имя которого пользователь вводит с клавиатуры. Память под массивы должна выделяться динамически с помощью функции malloc() (где надо – realloc()), освобождаться – free(). Количество элементов в массивах программа должна определять автоматически по содержимому файла. Для работы с файлом использовать стандартные библиотечные функции. Если в задании предусмотрены строковые данные, то проверить, могут ли они состоять из нескольких слов (например, ФИО, названия станций метро, стран, городов, кафедр, факультетов, предприятий) и, если могут, то обеспечить правильную загрузку таких данных из файла. Память под каждую строку должна выделяться также динамически и ее размер должен точно соответствовать фактической длине сохраняемой в ней строке.
Должна быть проведена грамотная декомпозиция задачи на отдельные подзадачи, каждая из которых должна быть реализована в виде отдельной функции. Типичный минимальный набор функций: загрузка данных из файла, обработка данных, вывод результатов. Функции не должны использовать глобальные переменные. Всеми данными функции должны обмениваться через параметры (входные, выходные).
Должны присутствовать все необходимые приглашения, подсказки и т.п.
Должен быть продемонстрирован вариант с несколькими массивами одинаковой размерности, содержащими разнотипные данные (по заданию). Затем эти массивы должны быть заменены на один массив, но уже структур. После этого делается вариант с модулем.

Оффлайн disputant

  • Пользователь
  • **
  • Сообщений: 38
    • Просмотр профиля

Оффлайн sp

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
М-да очень мягко сказано.
Ощущение такое, прога списана с примера, отношение к поставленой задаче не имеющего никакого.
Надо развалить задачу на п.п. Определить, что каждая делает, зачем нужна. А тут "идут лавины (простите, подпрограммы) одна за одной", догадаться что и как трудновато как-то.
Есть minmax. Там действительно что-то берётся, как начальное из списка. Цикл. В теле: если текущее больше, то что-то становится текущим. Так до конца списка. что-то д.б. определено, иначе > работать не будет. Искать, где это что-то определено, Пинкертон нужен.
Потом в принтах список форматов и список переменных д.б. согласован, это не поток. Лень продираться через эти муки.
Прога не сдаваема. К каждой содержательной строке д.б. комментарии, иначе толмач нужен. Преподу за толмачество з.п. не платят.
Плохо всё :-\ .

 

Задача в Mathlab, определение количества шестизначных билетов

Автор wsxi11

Ответов: 3
Просмотров: 2582
Последний ответ 20 Декабря 2011, 11:17:45
от wital1984
Двумерный массив в С. Как меня организовать вывод массива в таком виде?

Автор bifshtex

Ответов: 2
Просмотров: 3044
Последний ответ 30 Марта 2010, 23:41:13
от bifshtex
помогите нарисовать блок-схемы для двумерного массива паскаль

Автор вилена

Ответов: 14
Просмотров: 7752
Последний ответ 09 Ноября 2011, 01:30:19
от вилена
Задача в Turbo С. Написать программу построения одномерного массива

Автор deamond

Ответов: 1
Просмотров: 2576
Последний ответ 21 Декабря 2011, 12:04:34
от Hellko
Помогите расположить элемента массива в заданном порядке

Автор EkaterinaOsipova

Ответов: 2
Просмотров: 3792
Последний ответ 25 Апреля 2011, 11:16:22
от Selyd