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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 20:37   #1
amuleg
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию Массивы - не тот результат.

Вот задания звучит так - "Дан массив А из к целых положительных чисел. Записать все четные по значению элементы массива А в массив В.


Я вроде все правильно написал(ну с моей точки зрения))) но результат, Правильно показывает число полжительных чисел, тоесть количество элементов в массиве В, а вот их значения полный брэд)) Очень надеюсь на вашу помощь) Вот сообственно мой код


Код:
# include <iostream>
# include <stdlib.h>
# include <time.h>
using namespace std;
int main ()
{ 
	int i;
	const int size=10;
	int Ar[size], B[size];
	srand(time(NULL));
	for(int i=0; i<size; i++)
	{
		Ar[i]=1+rand()%20;
		cout<<"Ar["<<i<<"] = "<<Ar[i]<<endl;
	}
	int m=0;
	for(int i=0; i<size; i++)
		
	{
		if (Ar[i]%2==0) 
		
			    m++; B[m]=Ar[i];
		
	}
			if (m==0)
			{cout<<"B[m] = 0"<<endl;
			}
			else
				for (i=1; i<m; i++)
				{
					cout<<"B["<<i<<"] = "<<B[m]<<endl;
				}
}

Последний раз редактировалось Stilet; 22.01.2012 в 20:50.
amuleg вне форума Ответить с цитированием
Старый 22.01.2012, 20:46   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от amuleg Посмотреть сообщение
Вот задания звучит так - "Дан массив А из к целых положительных чисел. Записать все четные по значению элементы массива А в массив В.


Я вроде все правильно написал(ну с моей точки зрения))) но результат, Правильно показывает число полжительных чисел, тоесть количество элементов в массиве В, а вот их значения полный брэд)) Очень надеюсь на вашу помощь) Вот сообственно мой код



Код:
# include <iostream>
# include <stdlib.h>
# include <time.h>
using namespace std;
int main ()
{ 
	int i;
	const int size=10;
	int Ar[size], B[size];
	srand(time(NULL));
	for(int i=0; i<size; i++)
	{
		Ar[i]=1+rand()%20;
		cout<<"Ar["<<i<<"] = "<<Ar[i]<<endl;
	}
	int m=0;
	for(int i=0; i<size; i++)
		
	{
		if (Ar[i]%2==0) 
		
			    //m++; B[m]=Ar[i]; //<--1 мина
		               B[m]=Ar[i]; ++m;
	}
			if (m==0)
			{cout<<"B[m] = 0"<<endl;
			}
			else
				for (i=0; i<m; ++i)  //<--- исправлены последствия 1й мины
				{
					//cout<<"B["<<i<<"] = "<<B[m]<<endl; //<--- 2 мина
                                        cout<<"B["<<i<<"] = "<<B[i]<<endl; 


				}
}
см комментарии в коде
_Bers вне форума Ответить с цитированием
Старый 22.01.2012, 21:02   #3
amuleg
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию

Спасибо конечно, но тперь вот что пишет
Изображения
Тип файла: jpg Безымянный.jpg (21.8 Кб, 116 просмотров)
amuleg вне форума Ответить с цитированием
Старый 22.01.2012, 21:35   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Вот смотри, я ничего на самом деле глобально в коде не изменял. Я лишь переформатировал стиль кода. Ну то есть, расставил фигурные скобочки, сделал красивые отступы. И все. Больше ничего не делал. У меня получилось вот что:

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main ()
{ 
    int i;     const int size=10;    int Ar[size], B[size];     srand(time(NULL));  int m=0;

    for(int i=0; i<size; i++)   {   Ar[i]=1+rand()%20;   cout<<"Ar["<<i<<"] = "<<Ar[i]<<endl;  }
    
    for(int i=0; i<size; i++)
    {
        if (Ar[i]%2==0) {  B[m]=Ar[i]; ++m;} 
    }
    
    if (m==0) {cout<<"B[m] = 0"<<endl; }
    else 
    { 
         for (i=0; i<m; ++i){  cout<<"B["<<i<<"] = "<<B[i]<<endl;  } 
    }
}
Я проверил - все работает, как часики.
Отсюда вывод - в твоём коде присутствует синтаксические ошибки, которые я при форматировании кода даже и не заметил (мой собственный code-style от таких ошибок привентивно защищает).

Всем рекомендую использовать такую же модель, а именно:

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


А проблема была вот здесь:
Код:
for(int i=0; i<size; i++)
{    
    if (Ar[i]%2==0) 
	    m++; B[m]=Ar[i];   //поскольку туловище не заключено в фигурные скобки, условно выполнится только первая инстркция m++
                                     //а инструкция B[m]=Ar[i]; будет выполнятся всегда

                     //такую глупую ошибку очень просто по запарке допустить, если экономить на фигурных скобках
                     //но привентивно невозможно допустить, если туловища циклов и условий всегда заключать в фигурные скобки
}
Код можно сделать ещё более "красивым". В нем присутствует некоторые "недочеты".

Последний раз редактировалось _Bers; 22.01.2012 в 21:44.
_Bers вне форума Ответить с цитированием
Старый 22.01.2012, 21:43   #5
amuleg
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию

Спасибо, большое))
amuleg вне форума Ответить с цитированием
Старый 23.01.2012, 19:47   #6
amuleg
Новичок
Джуниор
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию

Я понимаю может это уже нагло, но теперь мне надо отсортировать, и опять фигня) -


Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main ()
{ 
    int i;
    const int size=10;
    int Ar[size], B[size];
    srand(time(NULL));
    for(int i=0; i<size; i++)   {   Ar[i]=1+rand()%20;   cout<<"Ar["<<i<<"] = "<<Ar[i]<<endl;  }
    int m=0;
    for(int i=0; i<size; i++)
    {
        if (Ar[i]%2==0) {  B[m]=Ar[i]; ++m;} 
    }
	cout<<endl;
	cout<<endl;
    if (m==0) {cout<<"B[m] = 0"<<endl; }
    else { for (i=0; i<m; ++i){  cout<<"B["<<i<<"] = "<<B[i]<<endl;  }
	
	}
	for ( int j=0; j<size-1; j++)
		for (m=0; m<size-1; m++)
			if (B[m]<B[m-1])
			{
				int C=B[m-1];
				B[m-1]=B[m];
				B[m]=C;
			}
			cout<<endl;
			cout<<endl;
for (m=0; m<size; m++)
{
	cout<<"B["<<m<<"] = "<<B[m]<<endl;
}
return 0;
}
Изображения
Тип файла: jpg Безымянный.jpg (24.5 Кб, 127 просмотров)

Последний раз редактировалось ACE Valery; 24.01.2012 в 00:11.
amuleg вне форума Ответить с цитированием
Старый 24.01.2012, 14:25   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

//ниже приведенные макросы служат лишь для тестирования программулички, и не рекомендованы к использованию в боевом коде
#define VIEW_ELEMENT(Arr, index) cout<<#Arr<< '['<<index<< "] = "<<Arr [index]<<endl;
#define VIEW_ARR(Arr, sizeArr) for (size_t i=0; i<sizeArr; ++i){  VIEW_ELEMENT(Arr, i);  }

//Функция ищет минимальный элемент в массиве, и возвращает его индекс
//int* Arr - массив, где ищем
//size_t sizeArr - количество элементов в массиве
//size_t startPos - позиция с которой начинается поиск
inline size_t FindMin(int* Arr, size_t sizeArr, size_t startPos)
{
    size_t find_index=startPos; 
    for(size_t i=startPos; i<sizeArr; ++i)  
    { 
        if (Arr[find_index]>Arr[i])	{ find_index=i; } 
    }
    return find_index;
}

int main ()
{ 
    const int size=10;  int Ar[size], B[size];   srand( (size_t) time(NULL)); size_t m=0;
    
    for(size_t i=0; i<size; i++) {  Ar[i]=1+rand()%20; VIEW_ELEMENT(Ar, i); }  //заполнение массива Ar
    for(size_t i=0; i<size; i++) {  if (Ar[i]%2==0) {  B[m]=Ar[i]; ++m;}    }      //заполнение массива B
    
    cout<<"\n\n";
    if (m==0) {cout<<"Массив B пуст!\n"; }  else { VIEW_ARR(B, m); }  //Покажет содержимое массива B

    for( size_t i=0; i<m; ++i) {  swap( B[i], B[FindMin(B, m, i)] ); }  //Отсортирует массив B по возврастанию
    
    cout<<"\n\n";  VIEW_ARR(B, m);    
    return 0;
}
Если ты сталкиваешься с алгоритмом, который для тебя оказывается слишком сложным - используй принцип "разделяй и властвуй".

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

Последний раз редактировалось _Bers; 24.01.2012 в 14:30.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в temp... виноваты динамичсекие массивы или тип не тот или.. Shabalinuk C++ Builder 5 12.11.2010 12:38
Не тот результат! Dawystrik Общие вопросы Delphi 3 22.03.2009 09:50
Именно тот паскаль... Двумерные массивы Сеня Помощь студентам 2 12.02.2009 20:32
Тот самый Pascal... Двумерные массивы... Сеня Помощь студентам 21 29.01.2009 00:36