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

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

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


Здравейте,

затрудних се на едно от условията на една задача който може нека да помага :)

 

Условиета са:

 

1. Да се създаде и разпечата двумерен масив с елементи от тип: низ, реално число, цяло число и реално число (това съм го направил).

 

2. Прехвърляне на всички елементи, сумата от индексите на които е кратна на три

 

И ето до къде съм стигнал:

 

#include "stdafx.h"
using namespace std;
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <math.h>

void main(){
 
 struct dvu{
 char  a[10]; //тип низ
 float b;  //тип реален
 int c;  //тип цял
 float d;
 };
 
 system("chcp 1251");
 
 dvu masiv[10][10];

 int i,j,n,m;
 
 cout<<"Въведи брой редове на масива: ";    cin>>n;
 cout<<"Въведи брой стълбове на масива: ";  cin>>m;
 
 for(i=0;i<n;i++)
   for(j=0;j<m;j++){
   cout<<i<<j<<"-я елемент низ: ";        cin>>masiv[j].a;
   cout<<i<<j<<"-я елемент реален b: ";    cin>>masiv[j].b;
   cout<<i<<j<<"-я елемент цял c: ";      cin>>masiv[j].c;
   cout<<i<<j<<"-я елемент реален d: ";    cin>>masiv[j].d;
 }
 //Разпечатване на двумерния масив
 cout<<"Елементите са: "<<endl;
 for(i=0;i<n;i++)
   for(j=0;j<m;j++){
   cout<<i<<j<<"-я елемент:"<<masiv[j].a<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].b<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].c<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].d<<endl;
   }
 //Прехвърляне на всички елементи, сумата от индексите на които е кратна на три от двумерния масив в едномерен
 

  dvu edno[110];
 int sumindex,k=0;
 cout<<"Елементите с индекси кратни на 3 са: "<<endl;

 for(i=0;i<n;i++)
   for(j=0;j<m;j++) sumindex+=i+j;

system("pause");
}

Надявам се да успеете да ми помогнете, защото се затруднявам с тази структура.

 

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


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

Надявам се да успеете да ми помогнете, защото се затруднявам с тази структура.

Хихи... мда, трудно е да се успее в нещо толкова сложно.Първо си го дефинирай, този едномерен масив
dvu array_1d[34]; //на теб оставям да познаеш защо са 34. Или кога трябва да промениш това.int idx = 0; // брояч за валидните стойности.
Кратно на дадено число се намира с оператора за остатък - % - остатъкът трябва да е 0. приемаме че и 0 е кратно на 3.
 for(i=0;i<n;i++)        for(j=0;j<m;j++)            if( (i+j) % 3 == 0 ) {                array_1d[idx].a = masiv[i][j].a;                array_1d[idx].b = masiv[i][j].b;                array_1d[idx].c = masiv[i][j].c;                array_1d[idx].d = masiv[i][j].d;                idx++;            }
  • Харесва ми 1

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


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

flare Благодаря ти за отговора. И така го правя, но за низа ми изписва грешка: error C2106: '=' : left operand must be l-value.

А когато разпечатам едномерния масив ми разпечатва ето това:

Публикувано изображение

 

Немога да разбера къде греша :(

ето това е кода:

 

#include "stdafx.h"
using namespace std;
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <math.h>

void main(){
 
 struct dvu{
 char  a[10]; //тип низ
 float b;  //тип реален
 int c;  //тип цял
 float d;
 };
 
 system("chcp 1251");
 
 dvu masiv[10][10];

 int i,j,n,m;
 
 cout<<"Въведи брой редове на масива: ";    cin>>n;
 cout<<"Въведи брой стълбове на масива: ";  cin>>m;
 
 for(i=0;i<n;i++)
   for(j=0;j<m;j++){
   cout<<i<<j<<"-я елемент низ: ";        cin>>masiv[j].a;
   cout<<i<<j<<"-я елемент реален b: ";    cin>>masiv[j].b;
   cout<<i<<j<<"-я елемент цял c: ";      cin>>masiv[j].c;
   cout<<i<<j<<"-я елемент реален d: ";    cin>>masiv[j].d;
 }
 //Разпечатване на двумерния масив
 cout<<"Елементите са: "<<endl;
 for(i=0;i<n;i++)
   for(j=0;j<m;j++){
   cout<<i<<j<<"-я елемент:"<<masiv[j].a<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].b<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].c<<endl;
   cout<<i<<j<<"-я елемент:"<<masiv[j].d<<endl;
   }
 //Прехвърляне на всички елементи, сумата от индексите на които е кратна на три от двумерния масив в едномерен
 dvu edno[34];
 int idx=0;
 cout<<"Елементите с индекси кратни на 3 са: "<<endl;
 for(i=0;i<n;i++)
   for(j=0;j<m;j++)

 if( (i+j) % 3 == 0 ) {
       //edno[idx].a = masiv[j].a;
  edno[idx].b = masiv[j].b;
  edno[idx].c = masiv[j].c;
  edno[idx].d = masiv[j].d;
  idx++;
  }
 for(idx=0;idx<34;idx++)
 {
 //cout<<edno[idx].a<<endl;
 cout<<edno[idx].b<<endl;
 cout<<edno[idx].c<<endl;
 cout<<edno[idx].d<<endl;
 }
system("pause");
}

 

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


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

flare Благодаря ти за отговора. И така го правя, но за низа ми изписва грешка: error C2106: '=' : left operand must be l-value.А когато разпечатам едномерния масив ми разпечатва ето това:... Немога да разбера къде греша :(ето това е кода:

Една моя грешка. Пропуснал съм че низа ти е char (като ползваш C++ очаквах string). Присвоява се с strcpy, а не с =.А защо печатащият ти цикъл е до 34? Смяташ ли че всички стойности, в него са валидни? Редактирано от flare (преглед на промените)
  • Харесва ми 1

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


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

Защото са толкова, друг е въпроса че подобно твърдо задаване на бройката е добре да се избягва, утре може да се наложи да промени малко условието и/или размера на масива и вече може и да не е 34. Спокойно можеше да го направи цикъла до последната стойност на idx.

for(i=0;i<idx;i++)    {    cout<<edno[i].a<<endl;    cout<<edno[i].b<<endl;    cout<<edno[i].c<<endl;    cout<<edno[i].d<<endl;    }

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


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

Защото са толкова, друг е въпроса че подобно твърдо задаване на бройката е добре да се избягва, утре може да се наложи да промени малко условието и/или размера на масива и вече може и да не е 34.

Бъпросите бяха риторични, ined. Идеята беше joeybg да се сети сам, че не трябва да печата всички елементи на масива и колко точно да печата.Ако си забелязал по-горе, коментарът ми го намекваше:

dvu array_1d[34]; //на теб оставям да познаеш защо са 34. Или кога трябва да промениш това.

А е ясно, че ако беше ползвал define-и за размера на двумерния масив, от тях лесно може да се извади максималния размер на едномерния.Точно затова (направи си сам) и отначало не написах печатащата функция. Редактирано от flare (преглед на промените)
  • Харесва ми 1

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


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

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

Искам да ви попитам как ги разбирате тези две условия защото аз се затрудних на тях:

 

f) Вмъкване на посочен от потребителя брой елементи, с посочени от потребителя стойности от първия елемент, който е с четна стойност.

 

g) Изтриване на посочен от потребителя брой елементи от първия

елемент, който е с четна стойност.

 

Доколкото разбирам трябва да търся в масива елемент с четна с стойност и след него елемент да се въведат брой елементи и тяхната стойност от клавиатурата.

Същото предполагам и е с изтриването. Довечера ще се опитам да го напиша, но ако греша моля да ме поправите. Ще кача и кода като го напиша. За сега ме интересува дали правилно съм разтълкувал условието.

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


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

Доколкото разбирам трябва да търся в масива елемент с четна с стойност и след него елемент да се въведат брой елементи и тяхната стойност от клавиатурата.Същото предполагам и е с изтриването. Довечера ще се опитам да го напиша, но ако греша моля да ме поправите. Ще кача и кода като го напиша. За сега ме интересува дали правилно съм разтълкувал условието.

Смятам, че си прав. Внимавай с вмъкването и триенето. Предполагам знаеш, че "ръчно" трябва да отместиш останалите до края елементи, назад и напред съответно. Редактирано от flare (преглед на промените)

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


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

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

Редактирано от joeybg (преглед на промените)

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


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

Помогнете ми, че съм зациклил яко. Знам как да намеря елемента с четна стойност но незнам как да спра на него и след това да въведа броя и стойностите елементи.Това съм написал до момента :)

Здравейте !Предполагам става дума за подточка f) нали ? 

Четейки двете подточки, (f и g), ми липсва информация в каква точно структура ще се съдържат елементите с данни - по контекста ми звучи, че това би трябвало да е едномерен масив, но в примера, който сте приложил, ползвате двумерен.

 

Т.е. за едномерен масив ли е задачата или за двумерен/многомерен такъв ?

 

Поне за мен, вмъкването на елементи в двумерен масив не е типичния пример за тривиална операция. Защото:

 

1) Накъде ще местим вече съществуващи елементи - по редове или колони ?

2) Къде би трябвало да отидат тези елементи, които биха препълнили размерите на реда/колоната за съответните индекси - в нови редове/колони, в съществуващи съседни такива ...

3) По начина, по който сте приложили кода, двумерния масив не ми изглежда да е динамичен, което всъщност причината да се зачудя по въпроси 1) и 2). Освен това, тези под условия свързани ли са с предишното Ви запитване, защото виждам някакви прилики.

 

В случай, че масива 'masiv' е едномерен, то @flare вече Ви е дал отговора. В общи линии, ето какво можете да направите в този случай:

За всяко i = 0, 1, ..., N на masiv направи:     K = masiv[i] от masiv     Провери К.c % 2 == 0          Ако е истина: {              Провери дали текущия последно попълнен елемент N < MAX_SIZE - 1 на array                 Ако е истина:                      Преместете всички елементи от N до i+1 включително съответно на позиции N+1 до i+2                     masiv[i+1] = елемент_за_вмъкване                     ако елемент_за_вмъкване е нямал попълнени данни                          То попълнете в елемент_за_вмъкване данните от потребителя (cin >> masiv[i+1].c като пример)                 Ако не е истина (т.е. N = MAX_SIZE - 1)                         Задели нов масив arrayNew с големи T, като T > MAX_SIZE на array                         Прехвърли всички елементи от 0 до i от масива masiv на съответните им позиции в arrayNew                         arrayNew[i+1] = елемент_за_вмъкване                         ако елемент_за_вмъкване е нямал попълнени данни                              То попълнете в елемент_за_вмъкване данните от потребителя (cin >> arrayNew[i+1].c като пример)                         прехвърлете останалите елементи с индекси i+1 до N съответно на позиции i+2 до N+1 в arrayNew                         Изтриваме масива, който се реферира от masiv                         Присвояваме на masiv адреса на newArray;                         newArray = NULL             Край на условието N < MAX_SIZE - 1        }    Край на условието К.c % 2 == 0Край на цикъла

Прегледайте псевдокода - не давам 100% гаранции, че нещо не изпускам в този случай :). Той е валиден за първата подточка в случай, че реално имаме едномерен масив от елементи. За многомерен, както вече споменах, не е тривиално разписването на подобен алгоритъм.

 

Поздрави !

                                         

 

 

 

  • Харесва ми 1

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


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

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

 

знам само че ще търся или в masiv[j].c ili v edno.c

 

това са условията който трябва да изпълня:

 

 

Да се разработят на програмен език C++ функции за:

a) Създаване на двумерен масив с елементи от тип: низ, реален, цял, реален.

b) Разпечатване на двумерния масив.

c) Прехвърляне на елементите от двумерния масив в едномерен

масив, като прехвърлянето става по на всички елементи, сумата от индексите на които е кратна на три.

d) Разпечатване на едномерния масив.

e) Разпечатване на всички елементи на едномерния масив, които отговарят на: се отпечата средноаритметичното от полета b и d на тези елементи от структурата, които в поле а съдържат низ ‘crown’ и в поле c стойност – по-малка от 0.

f) Вмъкване на посочен от потребителя брой елементи, с посочени от

потребителя стойности от първия елемент, който е с четна стойност .

g) Изтриване на посочен от потребителя брой елементи от първия

елемент, който е с четна стойност.

h) Сортиране на едномерния масив във възходяща посока.

 

Ето това съм написал до момента:

http://pastebin.com/embed_js.php?i=VX2geEdK

 

Тези две подточки ме объркват и незнам точно как да ги направя. Може и да не успея да ги довърша, защото трябва да си предам проекта тази вечер до 24ч. Благодаря ви много за помощта, наистина много ми помагате.

Редактирано от joeybg (преглед на промените)

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


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

Това е което успях да сътворя за вмъкването:

 

  i=0;
 while (((edno.c % 2) != 0)&&(i <= idx2)) i++;

 if (i>idx2)
 
   cout<<"Няма елемент с четна стойност";
 
 else {
   nomelch=i;
   cout<<"Какъв брой елементи да бъдат вмъкнати: "; cin>>brel;

   }
 if (brel+idx2>120) {
   
   cout<<"Броя елементи не могат да бъдат вмъкнати.";
   system("pause");
 }
 else {
   for (i=idx2;i>nomelch;i--)
   
     edno.c=edno[i+brel].c;
   
 cout<<"Въведете стойностите на елементите: ";
   for(i=nomelch;i<nomelch+brel;i++)
 {
   cout<<i<<"-я елемент: "; cin>>edno.c;
   system("pause");
 }
 }

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


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

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

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

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

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

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

Вход

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

Вход

×

Информация

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