download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Една задачка на C++ да ми кажете къде бъркам в кода :)

<1 2 3 4 5 6 7 8 9 >

Автор
Съобщение
phrozencrew
Съб, 10.07.10, 22:21
Малко ми е странен тоя превод псевдоними. Това, което се използва като парметри на функцията са адреси в паметта. В случая func(int &x, int &y) представлява следното нещо казано на обикновен език:
функцията func приема за параметри стойностите, които стоят на адресите в паметта за променливите x и y. Функцията не може директно да замени стойностите на двете променливи, но може да замени стойностите, които са вкарани в паметта.
Кокич, горещо те съветвам, ако харесваш C/C++ (аз повече харесвам C), да се запознаеш с pointers или на БГ - указателите. Невероятно мощен и задължителен инструмент за работа с паметта на машината. В началото е много трудно да схванеш работата с указатели, но ако искаш да осъзнаеш как работи компютъра C е най-добрия език. Горния пример, който дава insecteater, бих го доразвил така, за по-ясно:
#include <iostream>
using namespace std;
 
void swap (int &x, int &y){  //predawane chrez ukazatel (adres)
	// neka vidim koi adresi v pametta paziat stoinostite na tia 2 promenlivi
	cout << " adres na a = " <<&x<<endl;
	cout << " adres na b = " <<&y<<endl;
 
	int now;
	now = x;
	x = y;
	y = now;
}
 
int main (){
	int a=2,  b=3;
	cout << " Nachalno systoqnie a = "<<a<<"; b = " <<b<<endl;
	swap (a, b);
	cout << " Sled razmqna a = " <<a<<"; b = " <<b<<endl;
	system("pause");
	return 0;
}

Можеш да извличаш стойността стояща на даден адрес на променлива, както и адреса на дадена променлива. Малко е трудно за обяснение от лаик, като мен.
Потърси в google за указателите. Има доста примери и подробно инфо. Пробвай с "C pointers"

kookki
Съб, 10.07.10, 23:30

RE: Една задачка на C++ да ми кажете къде бъркам в кода :)

” Малко ми е странен тоя превод псевдоними. „

И на мен ми е странно ,Нед, но така си го пишат в книгата. За указателите споменават че ще се учат в четвърта и пета част от книгите (аз си ги купих нищо че е материал от 2 курс, но още не съм стгигнал до там).
 Разбирам защо харесваш С-то повече - напомня на Perl в начален етап ,само дето Perl-а забива в съвсем друга посока като задълбочиш (вчера гледах едни видео уроци за perl )
Как само заблудих един колега от форума като му казах че учебниците от университетите били добри , в друга тема. Направо не съм знаел какво говоря .

тук е великото обяснение с псевдонима
тук е великото обяснение с псевдонима

тук е функцията която даде Ганчо
тук е функцията която даде Ганчо

kookki
Вто, 08.03.11, 21:54
Тази седмица сме на вълна програмиране тук във форума, та реших да ви позанимавам и с мои работи.
Един приятел ме помоли да му напиша код за двумерен масив - въвеждат се данните и ако има отрицателна стойност ,тя се копира в едномерен масив и резултатът се извежда на екрана.
// имах идея да ползвам вектор за втория масив, но те не са го учили.
//проверката за валидност на данните също е тъпа и се дъни тук там, но това са //им преподавали

Аз написах един код и той работи, но нещо не ме кефи заради повторното претърсване на масива (за отрицателните числа). При опит да ги наблъскам в един for не мога да избегна грешките и кода ми не работи.
Как може да се направи елегантно? Това е за собствено удоволствие, иначе на прпиятеля изпратих следния код:
#include <iostream>

using namespace std;

const int S1=3, S2=4, S3=S1*S2;

int main()
{
   double masive[S1][S2], otricatelni[S3];
   cout<<"Zadaite stoinostite na masiva"<<endl;

   for(int i=0,j=0;i<S1;)
   { bool b;
                 do{
                    b=0;
                    cout<<"stoinostta na element["<<i+1<<"]["<<j+1<<"] e ";
                    cin>>masive[j];
                    if(cin.fail()){
                    cin.clear();
char ch;
cin>>ch;
                    b=1;}
                }while (b);

                  for(j=1;j<S2;)
                  { bool v;
                       do{
                          v=0;
                          cout<<"stoinostta na element["<<i+1<<"]["<<j+1<<"] e ";
                          cin>>masive[j];
                          if(cin.fail()){
                          cin.clear();
     char ch;
                          cin>>ch;
                          v=1;}
                       }while (v);
                                j++;
                  }
                  j=0;
                  i++;
   }
for(int a=0,b=0,c=0;a<S1;){
        if(masive[a]<0){otricatelni[c]=masive[a];
        cout<<otricatelni[c]<<endl;}
        c++;
        for(b=1;b<S2;){
             if(masive[a]<0){otricatelni[c]=masive[a];
        cout<<otricatelni[c]<<endl;}
        c++;
        b++;
          }
          b=0;
          a++;
   }
    return 0;
}

ЕДИТ: Download.bg малко са ми орязали кода : cin>>masive[j] излиза като cin>>masive[j]. Може и на други места да реже ,но аз това забелязах. На редовните потребители проблема им е известен и се надявам да схванат общия смисъл на кода.
Пак добавка: правилно е да има едно преди [j] но гледам че го реже
бесен едит: има ендо инт и преди джей - нали е двумерен масив.
ДБГ, трябва ли винаги кода да се огражда с код=с++ за да е адекватно ???????? И защо редакциите ми са с тоя тъп шрифт?????

редактиран от kookki на 08.03.11 22:02
редактиран от kookki на 08.03.11 22:04
редактиран от kookki на 08.03.11 22:08
редактиран от kookki на 08.03.11 22:10
angelicstar
Сря, 09.03.11, 12:54
Ами скапания шршфт ти идва от това cin>>masive[ i ][j] и после от if(masive[a][ b ]. Червеничкото са кодове за курсив и за болд шрифт. Слагай по 1 шпация в квадратните скоби и това ти е. За още по-чисто направо го слагай в блокче за код. Ама там пък ще си имаш разправии с бекслешовете.

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

Пък тоя номер с многофакторните записи на цикли като for(int i=0,j=0;i<S1;) направо го мразя. Измислили са го нарочно да се предизвикат грешки и да се чете кода трудно. По-лесно става с отделно изписване на циклите.

редактиран от spursy на 09.03.11 16:08
phrozencrew
Чет, 10.03.11, 23:48
Kookki, наистина имаш пропуски в кода! Двумерния масив се инициализира с 2 индекса. Примерен код на твоята задачка, според скромните ми спомени от C++ би могъл да изглежда така:
#include <iostream>
using namespace std;
 
const int S1=2, S2=4, S3=S1*S2; // Masiwa e dvumeren
// Koeto ozna4ava, 4e shte imame slednite elementi:
// masiv[0][1]
// masiv[0][2]
// masiv[0][3]
// ...
// masiv[1][1]
// masiv[1][2]
// masiv[1][3]
// ...
 
int main()
{
   double masive[S1][S2], otricatelni[S3];
   //int i, j;
   double x;
   int y=0;
   
   cout<<"Zadaite stoinostite na masiva"<<endl;
 
   for(int i=0; i<S1; i++){
   for(int j=0; j<S2; j++){
       cout<<"stoinostta na element ["<<i<<"]["<<j<<"] e ";
       cin>>x;
       masive[i][j] = x;
       if(x<0){
            otricatelni[y]=x;
            y++;
       }
   }}
 
    for(int m=0; m<S3; m++) {
        if(otricatelni[m]<0){cout<<"otricatelno "<<otricatelni[m]<<endl;}
    } 
}

Прилагам сорса и компилираното ексе: 2d_array.rar
Между другото, най-бързо дебъгване на C/C++ код правя с php и функцията print_r(promenliva_ili_masiv);

ПС: Надявам се да оправят скоро правилното принтене на сорс код, защото е доста досадно понякога. А и трябва някъде да не напуше точно какви са разширенията за code=..., за да не налучкваме. По-горния код го пуснах с cpp.

kookki
Пет, 11.03.11, 17:55
Недялко, аз от самото начало не си харесвах кода ( въпреки че работи няма прегледен вид ), но нещо неможех да измисля как да го изчистя. Твоят вариант ми харесва повече и определено ще си го запиша. Мерси.

<1 2 3 4 5 6 7 8 9 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.