Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

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

Featured Replies

Здравейте,

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

 

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

 

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++;            }
  • Автор

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 (преглед на промените)

Защото са толкова, друг е въпроса че подобно твърдо задаване на бройката е добре да се избягва, утре може да се наложи да промени малко условието и/или размера на масива и вече може и да не е 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 (преглед на промените)

  • Автор

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

  • Автор

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

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

 

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% гаранции, че нещо не изпускам в този случай :). Той е валиден за първата подточка в случай, че реално имаме едномерен масив от елементи. За многомерен, както вече споменах, не е тривиално разписването на подобен алгоритъм.

 

Поздрави !

                                         

 

 

 

  • Автор

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

 

знам само че ще търся или в 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");
 }
 }

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.