2 Страницы  1 2 >  
Ответить Создать тему

Одномерный массив С++ , Помощь с преобразованием.

Полина Петова
post May 31 2008, 17:51 
Отправлено #1


Пользователь

Сообщений: 50



Добрый вечер, нужна помощь по C/C++.

Вот, собственно, задача:
В одномернном массиве, состоящем из N целых элементов, вычислить: 1) количество положительных элементов массива;
2) сумму элементов массива, расположенных после последнего отрицательного элемента, равного нулю.
Преобразовать массив таким образом, чтобы сначала раполагались все элементы, целая часть которых не превышает 1, а потом - все остальные.

Исходный код
#include <iostream.h>
#include <stdio.h>
#include <math.h>
int main()
{
const int n = 20;
int a[n];
int i, kolvo;
cout<<"Enter quantity of elements: \n"; cin >> kolvo;//размерность
if (kolvo>n)
{
 return 1;
}
//элементы
for (i = 0; i < kolvo; i++) cin >> a[i];
cout << "\n" << endl;

for (i = 0; i < kolvo; i++) cout << a[i] <<" ";
cout << "\n" << endl;
//нахождение количества положительных элементов массива
int p = 0;
for (i = 0; i < kolvo; i++)
if (a[i]>0) p++;
cout << "'+'elements=" << p << endl;
cout << "\n";
//сумма
int  nomer;
int sum;
for ( i = 0; i < kolvo; i++) if (a[i] == 0) nomer = i;
for ( sum = 0, i = nomer+1; i < kolvo; i++) sum+=a[i];
cout << "Summma=" << sum;
cout << "\n\n";
//что то вроде сортировки
int temp;
int j;
for ( j = 0; j < kolvo; j++)
{
if (a[j]<1)
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
for (i = 0; i < kolvo; i++) cout << a[i] <<" ";}
cout << "\n" << endl;
return 0;
}


Не могу преобразовать массив. Последний элемент принимает неестественное значение. Если кто знает, помогите пожалуйста, буду очень признательна.

Сообщение отредактировал Полина Петова - May 31 2008, 20:19
Profile CardPM
  0/0  
SiMM
post May 31 2008, 17:59 
Отправлено #2


Banned

Сообщений: 37 461
Из: «либеральных»«ценностей»



Цитата(Полина Петова)
сумму элементов массива, расположенных после последнего отрицательного элемента, равного нулю
Мощно завернули smile.gif
Цитата(Полина Петова)
Последний элемент принимает неестественное значение.
Наверняка с индексами чего-то напутали.
Цитата(Полина Петова)
{if (a[j]<1){
temp=a[j];a[j]=a[j-1];a[j-1]=temp;}
А теперь представьте себе, что j=0.
Кстати, код не мешало бы научиться оформлять (благо это совсем несложно), чтобы не приходилось читать кашу-малашу.

--------------------
Profile CardPM
  0/0  
Полина Петова
post May 31 2008, 18:09 
Отправлено #3


Пользователь

Сообщений: 50



Кроме расстановки фигурных скобок про оформление кода мне мало что известно, только некоторые заметки, которые различаются от выбранной литературы. Образование, "благо", у нас такое.

Мощно завернула Т.А. Павловская - автор практикума.

Про j=0 представила, но не поняла, хотя кое что прояснилось. То есть при вычитании получится j-1=-1. Как обойти, правда не знаю.

Сообщение отредактировал Полина Петова - May 31 2008, 18:10
Profile CardPM
  0/0  
soup
post May 31 2008, 19:56 
Отправлено #4


Активный

Сообщений: 1 380



Можно цикл "for" начать не с нуля, а с единицы, например

--------------------
Profile CardPM
  0/0  
SiMM
post May 31 2008, 20:08 
Отправлено #5


Banned

Сообщений: 37 461
Из: «либеральных»«ценностей»



Цитата(Полина Петова)
Кроме расстановки фигурных скобок про оформление кода мне мало что известно

http://www.rsdn.ru/article/mag/200401/codestyle.XML#ECMAE

--------------------
Profile CardPM
  0/0  
Полина Петова
post May 31 2008, 20:21 
Отправлено #6


Пользователь

Сообщений: 50



Цитата(soup @ May 31 2008, 20:56)
Можно цикл "for" начать не с нуля, а с единицы, например
*


Тогда первый элемент вектора не будет просматриваться.
Profile CardPM
  0/0  
Snowm@n
post Jun 1 2008, 09:53 
Отправлено #7


O_o

Сообщений: 1 037



Ну во-первых, если
Цитата
целая часть которых не превышает 1
то a[j]<2 а не
Исходный код
a[j]<1

И во-вторых,
Цитата
что то вроде сортировки
пишется так
Исходный код
#include <iostream.h>
int main(){
const n=10;
float a[n]={1.6,6.4,5.8,0.5,1.99,2.0,23,1.7,1.8,4.9};
for (int i=0;i<n-1;++i)
 for (int j=i+1;j<n;++j)
  if (a[i]>=2&&a[j]<2){
   int t=a[i];
   a[i]=a[j];
   a[j]=t;
  }
for (i=0;i<n;++i) cout<<a[i]<<" ";
cout<<endl;
return 0;
}
а это
Исходный код
for ( j = 0; j < kolvo; j++)
{
if (a[j]<1)
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
только одна итерация и работает неправильно.

--------------------
Developer -> Lead Developer -> Lead Architect -> ... ?
Profile CardPM
  0/0  
Полина Петова
post Jun 1 2008, 16:42 
Отправлено #8


Пользователь

Сообщений: 50



Спасибо за рабочий код, но компилятор Microsoft Visual C++ 6.0 при объединении всех нарезок кодов хоть и компилирует, но выдает ошибку. "Приложение будет закрыто. Отправить отчет Майкрософт и тд."
Исправьте пожалуйста, с меня 100 рублей на мобильник.
Profile CardPM
  0/0  
Snowm@n
post Jun 1 2008, 21:44 
Отправлено #9


O_o

Сообщений: 1 037



Весь код в студию.

--------------------
Developer -> Lead Developer -> Lead Architect -> ... ?
Profile CardPM
  0/0  
Полина Петова
post Jun 1 2008, 23:19 
Отправлено #10


Пользователь

Сообщений: 50



Исходный код

#include <iostream.h>
int main()
{
const int n = 20;
int a[n];
int i,kolvo;
cout << "Enter quantity of elements: \n"; cin >> kolvo;//размерность
if (kolvo>n)
{
 return 1;
}
//элементы
for ( i = 0;i < kolvo; i++) cin >> a[i];
cout <<"\n"<<endl;

for ( i = 0;i < kolvo; i++) cout << a[i] <<" ";

cout <<"\n"<< endl;

//нахождение количества положительных элементов массива
int p = 0;
for (i = 0; i < kolvo; i++)
if (a[i]>0) p++;
cout <<"'+'elements="<<p<<endl;

cout <<"\n";

//сумма
int  nomer;
int sum;
for ( i = 0; i < kolvo; i++) if (a[i]==0) nomer=i;
for (sum = 0,i = nomer+1; i < kolvo; i++) sum+=a[i];

cout <<"Summa="<<sum;

cout <<"\n\n";

//что то вроде сортировки
for (i = 0;i < n-1; ++i)
for (int j = i+1;j<n;++j)
 if (a[i]>=2&&a[j]<2)
{
  int t=a[i];
  a[i]=a[j];
  a[j]=t;
}

for (i=0;i<kolvo;i++) cout<<a[i]<<" ";

return 0;
}
Profile CardPM
  0/0  
itROOT
post Jun 2 2008, 08:35 
Отправлено #11


Постоялец

Сообщений: 295



Вроде работает.

Исходный код


#include <iostream.h>

int main()
{
 const int n = 20;
 int a[n];
 int i,kolvo;
 cout << "Enter quantity of elements: \n"; cin >> kolvo;//размерность
 if (kolvo>n)
 {
   return 1;
 }
//элементы
 for ( i = 0;i < kolvo; i++) cin >> a[i];
 cout <<"\n"<<endl;

 for ( i = 0;i < kolvo; i++) cout << a[i] <<" ";

 cout <<"\n"<< endl;

//нахождение количества положительных элементов массива
 int p = 0;
 for (i = 0; i < kolvo; i++)
   if (a[i]>0) p++;
 cout <<"'+'elements="<<p<<endl;

 cout <<"\n";

//сумма
 int  nomer;
 int sum;
 for ( i = 0; i < kolvo; i++) if (a[i]==0) nomer=i;
 for (sum = 0,i = nomer+1; i < kolvo; i++) sum+=a[i];

 cout <<"Summa="<<sum;

 cout <<"\n\n";

//что то вроде сортировки
 for (i = 0;i < kolvo-1; ++i)
   for (int j = i+1;j<kolvo;++j)
     if (a[i]>=2&&a[j]<2)
 {
   int t=a[i];
   a[i]=a[j];
   a[j]=t;
 }

 for (i=0;i<kolvo;i++) cout<<a[i]<<" "<<endl;

 return 0;
}


В циклах сортировки вместо n нужно kolvo. Иначе будет выход за пределы массива.

Маленькие замечания. Программу лучше разбить на функции, каждая из которых делает, то что нужно в подзадачах. Задавать длину массива константой - плохой тон. Можно задавать и не константой или использовать оператор new[]. (ну а лучше вообще использовать std::vector<int>) И потом, мне кажется что с упорядочиванием по целой части справиться обычная сортировка.

Сообщение отредактировал itROOT - Jun 2 2008, 08:45
Profile CardPM
  0/0  
Полина Петова
post Jun 2 2008, 20:51 
Отправлено #12


Пользователь

Сообщений: 50



При запуске приложения компьютер выдает ошибку. Сообщение №8.
Profile CardPM
  0/0  
itROOT
post Jun 2 2008, 23:20 
Отправлено #13


Постоялец

Сообщений: 295



Исходный код

#include <iostream>

using namespace std;

int main() {
 int numOfElems=0;
 cout << "Enter quantity of elements: \n";
 cin >> numOfElems;
 int* a = new int[numOfElems];

 for (int i = 0;i < numOfElems;++i) cin >> a[i];
 cout <<endl<<endl;

 for (int i = 0;i < numOfElems;++i) cout << a[i] <<" ";
 cout<<endl<<endl;


 int numOfPositive=0;
 for (int i = 0; i < numOfElems;++i)
   if (a[i]>0) ++numOfPositive;
 cout <<"'+'elements="<<numOfPositive<<endl<<endl;

 int lastZeroPos=numOfElems;
 int sumAfterLastZero=0;

 for (int i = 0; i < numOfElems;++i) {
   if (a[i]==0) lastZeroPos=i;
 }

 for (int i=lastZeroPos+1; i<numOfElems;++i) sumAfterLastZero+=a[i];

 cout <<"Summa="<<sumAfterLastZero<<endl<<endl;

 for (int i = 0;i<numOfElems-1;++i)
   for (int j = i+1;j<numOfElems;++j)
     if (a[i]>=2&&a[j]<2) {
       int tmp=a[i];
       a[i]=a[j];
       a[j]=tmp;
     }

 for (int i=0;i<numOfElems;++i) cout<<a[i]<<" ";
 cout << endl;

 delete[] a;
 return 0;
}



опубликованное пользователем изображение
Profile CardPM
  0/0  
Полина Петова
post Jun 3 2008, 08:15 
Отправлено #14


Пользователь

Сообщений: 50



Спасибо за код.
Тему можно закрывать.
Profile CardPM
  0/0  
Dest
post Jun 3 2008, 11:40 
Отправлено #15


Постоялец

Сообщений: 258



а что один я заметил еще один ляп у автора практикума?

Цитата
все элементы, целая часть которых не превышает 1

какие еще целые части?
Цитата
В одномернном массиве, состоящем из N целых элементов

...

меня начинает поражать как у нас дают образование.. sad.gif
Profile CardPM
  0/0  

2 Страницы  1 2 >
ОтветитьTopic Options
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Быстрый ответ
Кнопки кодов
 Расширенный режим
 Нормальный режим
    Закрыть все тэги


Открытых тэгов: 
Введите сообщение
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
         
Показать все

Опции сообщения