Премини към съдържанието
Spydoc

Прехвърляне в нов масив с указатели

Препоръчан отговор


Проблема в програмата е, че не създава правилно масив от всички числа различни от нула.

 

Във void move е проблематичното място и ако може с указатели да я поправите, понеже се опитвам да ги науча. Благодаря предварително.

#include <iostream>using namespace std;#define N 30int A[N], i, n, k, j;void input(){	do	{		cout<<"n Razmer na masiva: ";		cin>>n;	}	while (n<0 || n>N);	for (i=0;i<n;i++)    {    cout<<"n A["<<i+1<<"]=";    cin>>A[i];    }}void move(int *nb, int *pc){	for (i=0;i<n;i++)        if (A[i]!=0)    {        *nb=A[i];        nb++;        (*pc)++;    }    for (i=0;i<*pc;i++,nb++)    cout<<"n B["<<i+1<<"]="<<*nb<<endl;}void sredno(){    int sp=0;    float srednoto=0, sm=0;	for (i=0;i<n;i++)        if (A[i]!=0)		{			sm+=A[i];			sp++;        }        srednoto=sm/sp;		cout<<"n Sredno-aritmetichno = "<<srednoto<<endl;}void minimalno (){    int m=A[0];		for (i=1;i<n;i++)		if (A[i]<0 && m>A[i])		{			m=A[i];			k=i;		}		cout<<"n Minimalnoto otricatelno chislo e "<<m<<" s poreden nomer "<<k+1<<"."<<endl;}int main(){	int B[30], ch;	int a=0, b=0;	input();	do	{		cout<<"n 1. Prehvurlqne na chisla razlichni ot nula v nov masiv.";		cout<<"n 2. Izchislqvane sredno-aritmetichno ot chislata v masiva.";		cout<<"n 3. Minimalnoto otricatelno chislo v masiva.";		cout<<"n 4. Izhod.";		do		{		  cout<<"n Izberete deistvie: ";		  cin>>ch;		}		while (ch<1 || ch>4);		switch(ch)		{		case 1: move (&a, &b); break;		case 2: sredno(); break;		case 3: minimalno (); break;		}	}	while (ch!=4);    return 0;}
Редактирано от Spydoc (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ако искаш да се научиш, зарежи тази програма засега и препрочети всичко за указатели, което намериш.Конкретните проблеми по move съм ги сложил в коментари. М/у другото ти ли писа този код?

Във void move е проблематичното място и ако може с указатели да я поправите, понеже се опитвам да ги науча. Благодаря предварително.

// Първо функцията очаква като първи параметър масив, а не указател към цяло число// Това се разбира от имплементацията, не от дефиницията. (затова и въпросът за авторството на кода)// Тоест за първи параметър и подай масива B а не указател към променлива-число.//  Иначе още след първото увеличение на nb ще почнеш да пишеш на непозволено място.void move(int *nb, int *pc){	for (i=0;i<n;i++)        if (A[i]!=0)    {        *nb=A[i];        nb++;        (*pc)++;    }// Към този момент, указателят nb сочи след последната стойност, която си прехвърлил.// С цикълът отдолу, продължаваш да го увеличаваш, с което той ще сочи към неинициализирани стойности.// Вместо това направи още един указател и променяй него в циклите, за да може оригиналният винаги// да ти сочи към началото за да може да се "върнеш" когато искаш.    for (i=0;i<*pc;i++,nb++)    cout<<"n B["<<i+1<<"]="<<*nb<<endl;}

Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Проблема в програмата е, че не създава правилно масив от всички числа различни от нула.

Само това да и е проблема, като изключим input() всичко друго е сбъркано.minimalno () ако всички числа са положителни ще върне А[0] Няма да получиш вярното средно аритметично ако изключваш нулевите елементина 1, 0, 2, 3, средно аритметичното е 1.5 а не 2За кашата с move() flare вече е писал. 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.