Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Составить подпрограмму нахождения минимального эле 
:(
    Опции темы
sasha1212
Дата 4.6.2014, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.3.2014

Репутация: нет
Всего: нет



Составить подпрограмму нахождения минимального элемента в массиве А.Используя подпрограмму найти сумму s минимальных элементов массивов А,В,С из 5,4 и 6 чисел .Ввести А,В и С,вывести их и s.Программу я написал,но не уверен что правильно,помогите исправить ее

Код

#include  <stdio.h>
#include  <conio.h>
 
int vvod mas(float mas[ ]);
float min mas(float mas [ ],int n);
void print mas (float mas[ ],int n);
void main(void)
{
 
{float Ba,Bb,Bc ,A[50],B[50],C[50],S;
 int Na,Nb,Nc;
 Na=vvod mas(A);
 Nb=vvod mas(B);
 Nc=vvod mas(C);
 Ba=min mas(A,Na);
 Bb=min mas(B,Nb);
 Bc=min mas(C,Nc);
 print mas(A,Na);
 print mas(B,Nb);
 print mas(C,Nc);
 S=Ba+Bb+Bc;
 printf("\n Summa min : %f",S);
}
int vvod mas(float mas[ ])
{int N;
printf("\n Vvedite kolichestvo elementov: ");
scanf("%d",&N);
printf("\n Vvedite %d chisel \n",N);
 for(i=1;i<=N;i++);
  scanf("%f " ,%mas[i]);
  return N;
  
}
 
float min mas(float B)
 
{float B;
B=A(1);
i=1;
while(i<=N)
   {
   if(mas[i])<B)
    B=mas[i];
   i++;
   }
  return B;
}
  void print mas(float mas[i])
 {int N;
   float mas[i];
   printf (" V massive :\n");
   i=1;
   while(i<=N)
     {printf ("%f",mas[i]);
       i++;
       
     }
     return 0;
 }  
getch();
}

PM MAIL   Вверх
EgoBrain
Дата 5.6.2014, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



С чего начать даже х3.
Куча ошибок как синтаксических так и программирования, так и подхода к использованию библиотек.
На пару укажу:
Цитата

int vvod mas(float mas[ ]);

Идентификаторы в языке могу содержать только буквы англ алфавита, цифры и знак подчеркивания, при том начинатся с цифры не могут. А ты пробел поставил.
Цитата

for(i=1;i<=N;i++);
  scanf("%f " ,%mas[i]);

Цикл с пустым телом, идентификатор i нераспознан, так как не объявлен. Убери ; после заголовка цикла.

Далее, одно из самых главных, ты хочешь передавать в функцию массив, в ней его формировать и использовать дальше в программе. Делаешь ты это неправильно. Передаешь копию массива это раз, во вторых неопредленного размера (тут надеюсь на комментарии местных гуру). 
Хочешь в подпрограмме создавать внешний объект, тогда передавай адрес, так как миссив создается во время выполнения, нужно использовать кучу, поэтому будет передаваться указатель на указатель, как то так:
Код

...
int vvod_mas(float** mas)
{
    (*mas) = new float[10];

    for(int i = 0; i < 10; ++i)
        (*mas)[i] = i;

    return 0;
}
...
void main()
{
        float* massive;

    vvod_mas(&massive);

    for(int i = 0; i < 10; ++i)
        cout<<massive[i]<<endl;

    getchar();
}

Но щас наверное начнут меня материть в духе "Память должна освбождаться там же где и выделяется", но я не знаю как грамотно реализовать.

Дальше даже не смотрел, ждем экспертов.
PM MAIL ICQ Skype   Вверх
sasha1212
Дата 5.6.2014, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.3.2014

Репутация: нет
Всего: нет



EgoBrain, Спасибо за замечания,постараюсь исправить
PM MAIL   Вверх
Нэраварин
Дата 5.6.2014, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 9.3.2009

Репутация: нет
Всего: нет



Цитата ("EgoBrain")

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


Это полный бред и ложь потому, что:
Когда массив используется в качестве аргумента функции, передается только адрес массива, а не копия всего массива. При вызове функции с именем массива в функцию передается указатель на первый элемент массива.(с) И соответственно само по себе  имя массива это указатель на его первый элемент!

Не запутывайте новичка своими ужасными указателями на указатель да ещё в таком ужастном виде! Ему и так код тяжело писать а после ваших разъяснений вообще каша в голове будет!

to sasha1212 
Во первых определитесь на каком языке вы пишете программу? на Си или на С++ ?
библиотека conio.h яляется не безопасной плохой майкрософтовской реализации для устаревших система типа MS-DOS единствено что там полезно это _getch() но для него есть множество альтернатив

ошибка в коде и понимании:
Код

int vvod mas(float mas[ ])
{
   int N;
   printf("\n Vvedite kolichestvo elementov: ");
   scanf("%d",&N);
   printf("\n Vvedite %d chisel \n",N);

    for([color=red]i=1[/color];[color=red]i<=N[/color];i++);
      scanf("%f " ,[color=red]%mas[i][/color]);

  return N;
   
}

Всё что выделенно красым ошибки: Во-первых Элементы массива начинаются с нуля написав i=1 вы оставили пустой превую-нулевую ячейку и %mas[i] этим действием записали значение во вторую запись вида : i<=N означает, что вы пройдёте на 1 итерацию больше  а т.к. вы работаете с массивом и у вас его адреса с 0 по 49 НЕ 50 как вы обьявили потому что счёт начинается с 0 вы выёдете за границы массива и запишите значение в чужие ячейки что приведёт к краху программы

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Нэраварин
Дата 5.6.2014, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 9.3.2009

Репутация: нет
Всего: нет



Код

void main(void)// вообще убило на повал

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

int main(void)


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

 
Код

return 0;
}  
getch();
}

шутки не понял, компилятор тоже не понял! после return 0; относящегося к int main(void) ничего не должно быть это свидетельство конца программы после инструкции return 0; ничего выполняться не будет, программа завершается! Это ёб***й стыд основы основ!!!



Код

//название ф-ции ошибка как писали выше переименуйте хотя бы в min_mas
float min mas(float B)// Здесь НЕ передаётся массив здесь передаётся целое число B,
{                     // если хотите передать массив пишите B[]
    
    float B;// О_о это ещё что? существование одинаковых имён переменных в одном блоке кода невозможно
    B=A(1);// что такое A(1) мы его в ф-цию не передавали здесь её не объявляли откуда оно взялось?
    i=1;  // то же самое откуда вы взяли i ?
    while(i<=N)
    {
      if(mas[i])<B)// какой такой mas[i] ? в ф-цию не передавали нигде в ф-ции не объявляли откуда взялся?!
      B=mas[i];
      i++; // то же самое..
    }
  return B;
}

про логику поиска минимального значения вообще молчу её тут нет попытайтесь ну хоть самые элементарные азы почитать! сортировки это основа основ гугл вам в помощь!
Код

void print mas(float mas[i])// Ошибка так нельзя передавать массив в ф-цию

чтобы передать в ф-цию размерность массива простым хорошим способом для новичков будет:
Код

void print_mas( float mas[], int i )

ну а дальше всё те же ошибки в общем как говорится учите мат.часть

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
sasha1212
Дата 5.6.2014, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.3.2014

Репутация: нет
Всего: нет



Нэраварин
Пишу на Си,знаю что надо начинать с i=0,но в универе нас заставлять пока начинать с 1.Попробую учесть ваши замечания и исправить  код
PM MAIL   Вверх
EgoBrain
Дата 6.6.2014, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(Nerevar @ 5.6.2014,  13:50)
Это полный бред и ложь потому, что:
Когда массив используется в качестве аргумента функции, передается только адрес массива, а не копия всего массива. При вызове функции с именем массива в функцию передается указатель на первый элемент массива.(с) И соответственно само по себе  имя массива это указатель на его первый элемент!

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

Пример:
Код

#include  <iostream>
using namespace std;
 
void take_pointer(int* pointer)
{
    cout<<"address = "<<pointer<<endl;
    pointer = new int(10);
    cout<<"address = "<<pointer;
}

int main()
{
    int* stack_pointer;
    int stack_int = 10;
    stack_pointer = &stack_int;
    cout<<"First value = "<<stack_pointer<<endl;
    take_pointer(stack_pointer);
    
    cout<<endl<<"Value after subporgram = "<<stack_pointer<<endl;
       getchar();
       
    return 0;
}


Согласен лишь с тем что формулировка "Передавать в функцию массив" в С++ не верна.
Nerevar Кто ты такой я не знаю, первый раз тебя вижу, ждём экспертов.

Добавлено через 8 минут и 18 секунд
Цитата(sasha1212 @ 5.6.2014,  19:52)
Нэраварин
Пишу на Си,знаю что надо начинать с i=0,но в универе нас заставлять пока начинать с 1.Попробую учесть ваши замечания и исправить  код

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

Это сообщение отредактировал(а) EgoBrain - 6.6.2014, 02:57
PM MAIL ICQ Skype   Вверх
Нэраварин
Дата 6.6.2014, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 9.3.2009

Репутация: нет
Всего: нет



Цитата (sasha1212)

   Составить подпрограмму нахождения минимального элемента в массиве А.Используя подпрограмму найти сумму s минимальных элементов массивов А,В,С из 5,4 и 6 чисел .Ввести А,В и С,вывести их и s.
   


Цитата (EgoBrain )

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

Так в каком месте там у него эта задача выделения памяти?  откуда вы этот бред вообще взяли?
Цитата (EgoBrain)

    так как в ней определеятеся размер массива как ты реализуешь её (задачу) средствами языка по-другому?
   

я уже написал об этом ( последняя строчка кода в предидущем посте), если вам не хватает ума это понять это ваши проблемы
Цитата (EgoBrain )

   Во-вторых еслит ты передашь указатель на первый элемент, то подпрограмма его не изменит, а изменит его копию, соответсвенно нужно передавать указатель на указатель.
   

Вот именно после этих слов очевидно что вы бездарь и невежа не разбирающийся в предмете и смеющий утверждать то чего не знаете ....

Цитата (EgoBrain )
Nerevar Кто ты такой я не знаю, первый раз тебя вижу, ждём экспертов.

Вчерашний школьник сегодняшний студент по умерьте свой пыл, и попытайтесь хоть, что то почитать о языке на котором вы пишите !

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
JackYF
Дата 7.6.2014, 14:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162




M
JackYF
Господа, без переходов на личности, пожалуйста.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.