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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2013, 01:05   #1
asv1994
Пользователь
 
Регистрация: 28.10.2012
Сообщений: 50
По умолчанию C++ - Массивы, как быть?

Заданы два вещественных массива Х=(х1, х2, …, хn) и Y=(y1, y2, …, ym). Сформировать массив Z, в который включить из массива Х элементы, превышающие среднее арифметическое значение массива Y, а из массива Y – элементы, большие среднее арифметическое значение массива Х..

Все что есть, но может неправильно, помогите.

Код:
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <locale.h>
void FormX(int *X, int n)
{
 int i;
 for(i=0;i<n;i++)
 {
   scanf("%d",&*(X+i));
 }
}
void FormY(int *Y, int m)
{
 int j;
 for(j=0;j<m;j++)
 {
  scanf("%d",&*(Y+j));
 }
}
void outX(int *X,int n)
{
     int i;
     for (i=0;i<n;i++)
     {
         printf("%d\t",*(X+i));
         printf("\n\n");
     }
}
void outY(int *Y,int m)
{
     int j;
     for (j=0;j<m;j++)
     {
         printf("%d\t",*(Y+j));
         printf("\n\n");
     }
}
void outZ(int *Z,int l)
{
     int k;
     for (k=0;k<l;k++)
     {
         printf("%d\t",*(Z+k));
         printf("\n\n");
     }
}
/*void massZ(int *Z,int *X, int *Y, int n, int m,int srX, int srY,int k)
{
 int i,j;
 for(k=0;k<n;k++)
 {
  if(*(X+i)>srY){*(X+i)=*(Z+k+1);
  continue;}
 }
 for(k=0;k<m;k++)
 {
  if(*(Y+i)>srX){*(Y+i)=*(Z+k+1);
  continue;}
 }
}*/
int main()
{
 setlocale (LC_ALL,"russian_russia");
    int l=20,i,a,q,b,n,m,j,X[10],Y[10],Z[100],sX=0,srX,sY=0,srY,k=0;
 int s;
    printf("Введите кол-во элементов массива X:\n");
    scanf("%d",&n);
 printf("Введите %d элемент(ов) массива X через Enter\n", n);
    FormX(&X[0],n);
 printf("\nИсходный массивX\n\n");
    outX(&X[0],n);
 for(a=0;a<n;a++)
 {
  sX=sX+X[a];
 }
 srX=sX/a;
 printf("Среднее значение массиваX = %d\n",srX);
 printf("Введите кол-во элементов массива Y:\n");
 scanf("%d",&m);
 printf("Введите %d элемент(ов) массива Y через Enter\n", m);
    FormY(&Y[0],m);
 printf("\nИсходный массивY\n\n");
 outY(&Y[0],m);
 for(q=0;q<m;q++)
 {
  sY=sY+Y[q];
 }
 srY=sY/q;
 printf("Среднее значение массиваY = %d\n",srY);
 //massZ(&Z[0],&X[0],&Y[0],n,m,srX,srY,k);
 //outZ(&Z[0],l);
 getch ();
 return 0;}
asv1994 вне форума Ответить с цитированием
Старый 27.02.2013, 14:44   #2
KooKish
Улыбаемся :)
Пользователь
 
Регистрация: 18.12.2012
Сообщений: 74
По умолчанию

Вообщем тут элементы вводятся рандомно, но, я думаю, Вы в силах исправить это на ручной ввод и рандом идет целый, а не вещественный, но память отводится под вещественные числа, вообщем Вам подкорректировать немного, а так все работает. Удачи
Код:
#include <conio.h>
#include <iostream>
#include <ctime>

using namespace std;

int main(){
	setlocale(LC_ALL,"rus");
	int n, m, j = 0;
	double sr1 = 0, sr2 = 0;
	cout << "Введите размерность 1-ого массива: ";
	cin >> n;
	cout << "Введите размерность 2-ого массива: ";
	cin >> m;
	double *mas1 = new double[n];
	double *mas2 = new double[m];
	double *mas3 = new double[n+m];
	srand(time(0));
	for(int i=0;i<n;i++)
		mas1[i] = rand()%101;
	for(int i=0;i<m;i++)
		mas2[i] = rand()%101;
	for(int i=0;i<n;i++)
		sr1 += mas1[i];
	sr1 /= n;
	for(int i=0;i<m;i++)
		sr2 += mas2[i];
	sr2 /= m;
	for(int i=0;i<n;i++)
		if( mas1[i] > sr2 ){
			mas3[j] = mas1[i];
			j++;
		}
	for(int i=0;i<m;i++)
		if( mas2[i] > sr1 ){
			mas3[j] = mas2[i];
			j++;
		}
	cout << "\n1-й массив: ";
	for(int i=0;i<n;i++)
		cout << mas1[i] << "  ";
	cout << "\nЕго среднее арифметическое: " << sr1;
	cout << "\n2-й массив: ";
	for(int i=0;i<m;i++)
		cout << mas2[i] << "  ";
	cout << "\nЕго среднее арифметическое: " << sr2;
	cout << "\nПолучившийся массив: ";
	for(int i=0;i<j;i++)
		cout << mas3[i] << "  ";
	getch();
}
Не забываем про весы.
KooKish вне форума Ответить с цитированием
Старый 03.04.2013, 09:41   #3
asv1994
Пользователь
 
Регистрация: 28.10.2012
Сообщений: 50
По умолчанию

Код на С нужен, принтф и т.д.
asv1994 вне форума Ответить с цитированием
Старый 03.04.2013, 10:27   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Код на С нужен, принтф и т.д.
Ну так замените. cout -> printf, cin -> scanf, new -> malloc. И переменную i придётся объявить один раз в начале программы, C не позволяет такие объявления внутри циклов.
Abstraction вне форума Ответить с цитированием
Старый 08.04.2013, 09:56   #5
asv1994
Пользователь
 
Регистрация: 28.10.2012
Сообщений: 50
По умолчанию

Такое дело, сделал почти финальеую версию программки, но есть 1 но: // if(*(X+i)!=-842150451) вот эта строка все портит если ее расскоментировать то будет постоянно выводить это число это нужно исправить поставить счетчик K вместо n+m как это сделать помогите пожалуйста, буду весьма благодарен.
Код:
#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void FormMas(int *X,int n)
{int i;
 for(int i=0;i<n;i++)
 X[i]=rand()%100;
}
void VivodMas(int *X,int n)
{
 int i;
 for(int i=0;i<n;i++)
//   if(*(X+i)!=-842150451)
     {
         printf("%d\t",*(X+i));
     }
         printf("\n");
}
float sred(int *X,int n)
{float sr=0;
   int i,sx=0;
     for (i=0;i<n;i++)
  {
      sx+=*(X+i);
     }
 sr=sx/n;
return sr;
}
 
 
void formZ(int *Z,int m,int n,int *X,int *Y, float srX, float srY)
{
int k=0;int i;
for(i=0;i<n;i++)
{if(*(X+i)>srY)
{*(Z+k)=*(X+i);k++;}
}
for(i=0;i<m;i++)
 {if(*(Y+i)>srX)
{*(Z+k)=*(Y+i);k++;}
}}
int main()
{
 setlocale(LC_ALL,"rus");
 int n,m,j=0,k=0;
 
 float srX=0,srY=0;
 printf("Введите размерность массива X:");
 scanf("%d",&n);
 printf("Введите размерность массива Y:");
 scanf("%d",&m);
 int *X = new int[n];
 int *Y = new int[m];
 int *Z = new int[n+m];
 FormMas(X,n);
 printf("Массив Х:\n");
 VivodMas(X,n);
 FormMas(Y,m);
 printf("Массив Y:\n");
 VivodMas(Y,m);
 srX=sred(X,n);
 printf("\nsredX=%.2f\n",sred(X,n));
 srY=sred(Y,m);
 printf("sredY=%.2f\n\n",sred(Y,m));
 formZ(Z,m,n,X,Y,srX,srY);
 printf("Массив Z:\n");
 VivodMas(Z,n+m);
 getch ();
 return 0;
}
asv1994 вне форума Ответить с цитированием
Старый 08.04.2013, 10:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Какой счетчик? Зачем? Просто убери то условие и все.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.04.2013, 19:43   #7
asv1994
Пользователь
 
Регистрация: 28.10.2012
Сообщений: 50
По умолчанию

именно я немогу его убрать, если я буду использовать закоментированную то возникут сомнения при здаче этой программы у меня спросят, а зачем это убери, а если я расскоментирую это то мне будет всегда выводить эти числа, в обещм мне нужно от этого избавится что-бы этого небыло в коде программы, а сама программа работала правильно.
asv1994 вне форума Ответить с цитированием
Старый 08.04.2013, 20:12   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,341
По умолчанию

"Причесал".
У меня работает.
Код:
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void
FormMas(int *X, int n)
{
    int i;
    for(i = 0; i < n; ++i)
        X[i] = rand()%100;
}

void
VivodMas(int *X, int n)
{
    int i;
    for(i = 0; i < n; ++i)
        printf("%d\t",X[i]);
    printf("\n");
}

float
sred(int *X, int n)
{
    int sx = 0, i;
    for (i = 0; i < n; ++i)
        sx += X[i];
    return 1.0 * sx / n;
}

int
formZ(int *Z, int *X, int n, float srX, int *Y, int m, float srY)
{
    int k = 0, i;
    for(i = 0; i < n; ++i)
        if(X[i] > srY)
            Z[k++] = X[i];
    for(i = 0; i < m; ++i)
        if(Y[i] > srX)
            Z[k++] = Y[i];
    return k;
}

int
main()
{
    setlocale(LC_ALL, "rus");
    int n, m, k;
    float srX = 0, srY = 0;
    printf("Введите размерность массива X:");
    scanf("%d",&n);
    printf("Введите размерность массива Y:");
    scanf("%d",&m);
    int *X = malloc(n * sizeof(*X));
    int *Y = malloc(n * sizeof(*Y));
    int *Z = malloc((n + m) * sizeof(*Z));
    FormMas(X, n);
    printf("Массив Х:\n");
    VivodMas(X, n);
    FormMas(Y, m);
    printf("Массив Y:\n");
    VivodMas(Y, m);
    srX = sred(X, n);
    printf("\nsredX=%.2f\n", srX);
    srY = sred(Y, m);
    printf("sredY=%.2f\n\n", srY);
    k = formZ(Z, X, n, srX, Y, m, srY);
    printf("Массив Z:\n");
    VivodMas(Z, k);
    free(X);
    free(Y);
    free(Z);
    getch();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.04.2013, 21:10   #9
asv1994
Пользователь
 
Регистрация: 28.10.2012
Сообщений: 50
По умолчанию

спасибо, а что конкретно изменилось?
asv1994 вне форума Ответить с цитированием
Старый 09.04.2013, 21:27   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,341
По умолчанию

Пожалуйста.
Ну на самом деле, прилично изменилось .
Выкинул некоторые лишние операции и переменные:
Код:
sr=sx/n;
...
srX=sred(X,n);
printf("\nsredX=%.2f\n",sred(X,n));
srY=sred(Y,m);
printf("sredY=%.2f\n\n",sred(Y,m));
Изменил выделение динамической памяти. Добавил освобождение динамической памяти. Но самое главное - изменил функцию formZ. Дело в том, что не все элементы из массивов X и Y попадут в массив Z, следовательно его длина не всегда равна m+n.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как быть MInistor Компьютерное железо 1 09.04.2012 13:48
Массивы .Программа должна быть на С адуч2323 Помощь студентам 0 26.12.2011 21:31
Регистрация на сайте журнала: быть или не быть Levsha100 Свободное общение 12 12.06.2010 00:39
Быть или не быть? Вот в чем вопрос! VadEr Свободное общение 8 23.09.2009 16:16
Упал телефон в сельский туалет. Как быть, как мыть? Лукманов Александр Свободное общение 28 30.04.2009 10:42