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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2009, 18:12   #1
xnise
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 26
По умолчанию Вывод массива после некоторых преобразований в С++

Доброго времени суток.
Я попытался написать такую программку:

Код:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{ int  n,i,nOtr,j,kolVo=0;
  char str[256],str1[256],str2[256],str3[256],str4[256],str5[256];
//Формирование массива
	AnsiToOem("Введите размерность массива: ",str);cout<<str;cin>>n;
	float *a=new float[n],C,max,b;
	AnsiToOem("\n Введите элементы массива: ",str); cout<<str<<"\n";
	for (i=1;i<=n;i++) {cout<<" a["<<i<<"] "; cin>>a[i];};
//Ввод числа С и сравнение с ним элементов массива
	AnsiToOem("\n Введите С ",str1);
	cout<<str1; cin>>C; cout<<"\n";
	AnsiToOem("\n 1)Количество элементов меньших С = ",str2);
	for (i=n;i>=1;i--){if(a[i]<C)kolVo++;};
	cout<<str2<<kolVo<<"\n";
//Сумма элементов после последнего отрицательного
	AnsiToOem("\n 2)Сумма = ",str3);
	AnsiToOem("\n 2)Отрицательных нет ",str4);
	nOtr=-1;
    for (i=1; i<=n; i++) if (a[i]<0) nOtr=i;
    if (nOtr!=-1)
	{float sum=0;
	for (i=nOtr+1;i<=n;i++)sum=sum+a[i];
	cout<<str3<<sum;}
	else cout<<str4;
	cout<<"\n";
//Поиск наибольшего элемента и перестановка его с элементом a[1]
	for (i=1; i<=n; i++)
		{if(a[1]<a[i]){max=a[i];a[i]=a[1];a[1]=max;};};
//Преобразование с учетом: сначала элементы отличающиеся от a[1] не более 20%
	for(i=1;i<=n;i++)
		for (j=1;j<=n-1;j++)
		{if(a[j]/(a[1]/100)<=20){b=a[j];a[j]=a[j+1];a[j+1]=b;};};
	AnsiToOem("3)Массив после преобразований имеет вид:", str5);
	cout<<str5<<"\n";
//Окончательный вывод массива после всех преобразований
	for(i=1;i<=n;i++)
	{cout<<"\n a["<<i<<"] "<<a[i];} cout<<"\n";
return(0);
}
Вроде бы все в порядке, но после действий "Преобразование с учетом: сначала элементы отличающиеся от a[1] не более чем на 20%, а потом все остальные" иногда выводится число отличающееся от заданного. Например при вводе массива с элементами:
-6 8 7 -6
вывод в последнем действии такой:
8
7
-6
-1.9984е+018 ? (Спрашивается как он получается и как вернуть на его место -6)

P.S. Я не силен в математике, может быть нужно как-то по другому перестановку элементов массива делать?

Последний раз редактировалось xnise; 05.12.2009 в 09:10.
xnise вне форума Ответить с цитированием
Старый 04.12.2009, 20:27   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

В С индексы массивов начинаются с 0, а Вы везде с 1 начинаете
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 04.12.2009, 21:13   #3
xnise
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
В С индексы массивов начинаются с 0, а Вы везде с 1 начинаете
Вообще-то из первой части программы видно что я сдвинул индексы специально для удобства их ввода и нормального восприятия, к тому же если их не сдвигать, то все равно ничего не меняется, вывод остается прежним в конце программы.
xnise вне форума Ответить с цитированием
Старый 04.12.2009, 21:55   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
int  n,i,j,nOtr,kolVo=0;
  char str[256],str1[256],str2[256],str3[256],str4[256],str5[256];
//Формирование массива
	AnsiToOem("Введите размерность массива: ",str);cout<<str;cin>>n;
	float *a=new float[n],C,max,b;
	AnsiToOem("\n Введите элементы массива: ",str); cout<<str<<"\n";
	for (i=1;i<=n;i++) {cout<<" vvedite a["<<i<<"] "; cin>>a[i];};

Ты создал массив из n элементов, затем пытаешься ввести его элементы с 1 по n ый
т.е нулевой элемент у тебя остается пустым
Код:
for (i=1;i<=n;i++)
первый элемент находится под индексом 0. Ты просто выходишь за пределы массива на последней итерации. Число которое у тебя вылезло, значение сегмента памяти в который ты залез

Последний раз редактировалось NiCola999; 04.12.2009 в 21:58.
NiCola999 вне форума Ответить с цитированием
Старый 04.12.2009, 21:57   #5
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Из первой части программы видно, что Вы завели массив размерности n
Код:
float *a=new float[n]
то есть с индексами от 0 до n-1, а через строчку
Код:
for (i=1;i<=n;i++) {cout<<" vvedite a["<<i<<"] "; cin>>a[i];};
Вы обращаетесь к n-ому элементу массива, что может повлечь абсолютно что угодно. Так что пока Вы это не исправите, о других возможных ошибках говорить нет смысла
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 04.12.2009, 22:33   #6
xnise
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 26
По умолчанию Большое спасибо!

Получилось, исправил. Теперь программа выглядит так и все считает и выводит как надо

Код:

Код:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{ int  n,i,nOtr,j,kolVo=0;
  char str[256],str1[256],str2[256],str3[256],str4[256],str5[256];
//Формирование массива
	AnsiToOem("Введите размерность массива: ",str);cout<<str;cin>>n;
	float *a=new float[n],C,max,b;
	AnsiToOem("\n Введите элементы массива: ",str); cout<<str<<"\n";
	for (i=1;i<=n;i++) {cout<<" a["<<i<<"] "; cin>>a[i];};
//Ввод числа С и сравнение с ним элементов массива
	AnsiToOem("\n Введите С ",str1);
	cout<<str1; cin>>C; cout<<"\n";
	AnsiToOem("\n 1)Количество элементов меньших С = ",str2);
	for (i=n;i>=1;i--){if(a[i]<C)kolVo++;};
	cout<<str2<<kolVo<<"\n";
//Сумма элементов после последнего отрицательного
	AnsiToOem("\n 2)Сумма = ",str3);
	AnsiToOem("\n 2)Отрицательных нет ",str4);
	nOtr=-1;
    for (i=1; i<=n; i++) if (a[i]<0) nOtr=i;
    if (nOtr!=-1)
	{float sum=0;
	for (i=nOtr+1;i<=n;i++)sum=sum+a[i];
	cout<<str3<<sum;}
	else cout<<str4;
	cout<<"\n";
//Поиск наибольшего элемента и перестановка его с элементом a[1]
	for (i=1; i<=n; i++)
		{if(a[1]<a[i]){max=a[i];a[i]=a[1];a[1]=max;}}
	for(i=1;i<=n;i++)
		{cout<<"\n a["<<i<<"] "<<a[i];} cout<<"\n";
//Преобразование с учетом: сначала элементы отличающиеся от a[1] не более 20%
	for (i=1; i<=n-1; i++)
	for (j=1; j<=n-1; j++)
	{ if (a[j]<a[1]-a[1]/100*20){b=a[j];a[j]=a[j+1];a[j+1]=b;}}
	AnsiToOem("\n 3)Массив после преобразований имеет вид:", str5);
	cout<<str5<<"\n";
//Окончательный вывод массива после всех преобразований
	for(i=1;i<=n;i++)
	{cout<<"\n a["<<i<<"] "<<a[i];} cout<<"\n";
return(0);
}
Хорошо что есть форумы и люди желающие помочь

Последний раз редактировалось xnise; 05.12.2009 в 12:05. Причина: Ошибки в коде
xnise вне форума Ответить с цитированием
Старый 05.12.2009, 00:06   #7
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Вот так и начинаешь верить в чудеса - наполовину исправленная программа тем более не должна работать
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 05.12.2009, 09:14   #8
xnise
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 26
По умолчанию

Вы правы - пришлось ее снова переисправлять, но от чудес вроде бы ни куда не ушло. А главное чудо: как компилятор делит на элемент со значением 0 и не выводит сообщение об ошибке.
xnise вне форума Ответить с цитированием
Старый 05.12.2009, 12:13   #9
xnise
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 26
По умолчанию

Ну вот вроде новый вариант в котором я избавился от деления на 0 исправив формулу. Я поставил его на место последнего кода
xnise вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить число после всех элементов массива, кратных 3 Mclaren Помощь студентам 0 10.11.2009 02:40
После введения из клавиатуры произвольного одномерного массива /// Siroga35 Помощь студентам 1 18.06.2009 11:45
Вывод некоторых параметров из *.ini (или *.txt) файлов в поля Label grey Помощь студентам 11 14.02.2009 10:58
Вывод на экран списка статей, опубликован-ных после заданного года Igor571 Паскаль, Turbo Pascal, PascalABC.NET 2 01.12.2008 08:23
Демонстрационная программа выполнения геометрических преобразований трехмерных объектов true_men Помощь студентам 6 19.11.2007 20:11