C/C++

Член од
14 септември 2013
Мислења
86
Поени од реакции
19
Дечки, ми треба помош, треба да се избришат дупликатите од низа. Стигнав негде дотука, понатаму немам идеја како да се изврши правилно поместувањето на дупликатот на крај и да се намали големината на низата........ако има некој време, ако може нека реши/објасни што поедноставно. фала многу :)
Код:
#include<stdio.h>
int main()
{
    int niza[100],i,golemina,j,duplikat;
    printf("Vnesete ja goleminata na nizata:\n");
    scanf("%d",&golemina);
    printf("Vnesete gi elementite na nizata:\n");
    for(i=0;i<golemina;i++)
        scanf("%d",&niza[i]);
    for(i=0;i<golemina-1;i++)
    {
      for(j=i+1;j<golemina;j++)
      {
          if(niza[i]==niza[j])
          {
              niza[j]=niza[j+1];
 
          }
      }
    }
    for(i=0;i<golemina;i++)
        printf("%d ",niza[i]);
    return 0;
}
 
M

Mr.InF3ction

Гостин
Внатре во if условот напиши го следното:
PHP:
int k;
for (k = j; k < golemina-1; k++){
     niza[k] = niza[k + 1];
}
golemina--;
Идеата е дека доколку елементите со индекс "i" и "j" имаат иста вредност, тогаш елементот "j" треба да се избрише, а тоа во низа се прави така што од тој елемент до крајот на низата ќе ги поместиш сите за една позиција кон лево и ќе намалиш големината на низата за 1.
 
Член од
14 септември 2013
Мислења
86
Поени од реакции
19
Внатре во if условот напиши го следното:
PHP:
int k;
for (k = j; k < golemina-1; k++){
    niza[k] = niza[k + 1];
}
golemina--;
Идеата е дека доколку елементите со индекс "i" и "j" имаат иста вредност, тогаш елементот "j" треба да се избрише, а тоа во низа се прави така што од тој елемент до крајот на низата ќе ги поместиш сите за една позиција кон лево и ќе намалиш големината на низата за 1.
Да но....за внесени 4 елементи, а тие се: 1 2 2 2, враќа 1 2 2. ..
 
Член од
28 август 2013
Мислења
3.919
Поени од реакции
11.597
Дечки, ми треба помош, треба да се избришат дупликатите од низа. Стигнав негде дотука, понатаму немам идеја како да се изврши правилно поместувањето на дупликатот на крај и да се намали големината на низата........ако има некој време, ако може нека реши/објасни што поедноставно. фала многу :)
Код:
#include<stdio.h>
int main()
{
    int niza[100],i,golemina,j,duplikat;
    printf("Vnesete ja goleminata na nizata:\n");
    scanf("%d",&golemina);
    printf("Vnesete gi elementite na nizata:\n");
    for(i=0;i<golemina;i++)
        scanf("%d",&niza[i]);
    for(i=0;i<golemina-1;i++)
    {
      for(j=i+1;j<golemina;j++)
      {
          if(niza[i]==niza[j])
          {
              niza[j]=niza[j+1];
 
          }
      }
    }
    for(i=0;i<golemina;i++)
        printf("%d ",niza[i]);
    return 0;
}
Модифицирано...
Код:
#include<stdio.h>
int main()
{
    int niza[100],i,golemina,j,duplikat;
    printf("Vnesete ja goleminata na nizata:\n");
    scanf("%d",&golemina);
    printf("Vnesete gi elementite na nizata:\n");
    for(i=0;i<golemina;i++)
        scanf("%d",&niza[i]);
    for(i=0;i<golemina-1;i++)
    {
      for(j=i+1;j<golemina;j++)
      {
          if(niza[i]==niza[j])
          {
              // помести ги следните елементи налево за 1
              int duplicatIndex;
              for(duplicatIndex = j; duplicatIndex<golemina-1;  duplicatIndex++)           
                niza[duplicatIndex]=niza[duplicatIndex+1];
              j--; // врати го индексот наназад
              golemina--; // намали ја големината
 
          }
      }
    }
    for(i=0;i<golemina;i++)
        printf("%d ",niza[i]);
    return 0;
}
 
Член од
14 септември 2013
Мислења
86
Поени од реакции
19
Модифицирано...
Код:
#include<stdio.h>
int main()
{
    int niza[100],i,golemina,j,duplikat;
    printf("Vnesete ja goleminata na nizata:\n");
    scanf("%d",&golemina);
    printf("Vnesete gi elementite na nizata:\n");
    for(i=0;i<golemina;i++)
        scanf("%d",&niza[i]);
    for(i=0;i<golemina-1;i++)
    {
      for(j=i+1;j<golemina;j++)
      {
          if(niza[i]==niza[j])
          {
              // помести ги следните елементи налево за 1
              int duplicatIndex;
              for(duplicatIndex = j; duplicatIndex<golemina-1;  duplicatIndex++)         
                niza[duplicatIndex]=niza[duplicatIndex+1];
              j--; // врати го индексот наназад
              golemina--; // намали ја големината
 
          }
      }
    }
    for(i=0;i<golemina;i++)
        printf("%d ",niza[i]);
    return 0;
}
Фала ти премногу :)))) т.е. фала и на двајцата што се нафативте да ми помогнете, особено поиманемам, лајфсејвер си!
 
Член од
28 јуни 2009
Мислења
274
Поени од реакции
257
Фала ти премногу :))))
Чим со по будизмов да те просветлам.
(Ако не знаеш за покажувачи време е да научиш.)
Прво и прво големина на низа не може да смениш. Низа има фиксна должина и не може да ја наголемиш ниту пак намалиш. То твојов случај алоцираш низа од 100 броеви на стак. Или пак 400 бајта. Во тие позиции во низата во кој што нема да ставиш број што си го прочитал ќе имаш џанк вредност.

Второ ако сакаш програмата да е поекономична прво читај ја променливата golemina па потоа динамички алоцирај меморија. (Што корист да алоцираш меморија за 100 броеви ако ти се потребни само 3. Или пак ако имаш 500 тогаш во твојов случај ќе имаш Segmentation Fault)

Трето програмата е неефикасна. О(N^3) алгоритам за отстранување дупликати е катастрофа. Сортирајја низата прво. Бидејќи ако имаш елемент x и ако има дупликат тогаш ако x има индекс i дупликатите ќе имаат индекси i + 1, i + 2 .... i + N.

Со тоа добибаш О(N logN) алгоритам.
Доле е кодот знам дека вака ти ги сечам нозете но еве ти пример за како тоа се пишува во Ц без memmory leaks.
PHP:
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
int compare (const void * a, const void * b) // Ova e funkcija za qsort sto e definirana vo stdlib.
{
    return ( *(int*)a - *(int*)b );
}
int main()
{
    int golemina,i;
    printf("Vnesi golemina\n");
    scanf("%d", &golemina);
    int* niza = (int *)malloc(sizeof(int) * golemina);
    int* bez_duplikati = (int *)malloc(sizeof(int) * golemina);
    assert(niza != NULL); //Alokacija upsesna. Vo slucaj da e neuspesna dobivas ERROR i avtomatski se stopira programata.
    assert(bez_duplikati != NULL);
    printf("Vnesete gi elementite na nizata:\n");
    for(i = 0; i < golemina; i++)
        scanf("%d", &niza[i]);
    qsort (niza, golemina, sizeof(int), compare);
    int len = 0; //len ne e golemina na niza tuku e postavena dolna granica za da ne printame dzank vrednosti.
    bez_duplikati[len] = niza[0];
    len++;
    for(i = 1; i < golemina; i++) //Logikata za ova e vo postot.
        if(niza[i - 1] != niza[i])
        {
            bez_duplikati[len] = niza[i];
            len++;
        }
    for(i = 0; i < len; i++)
        printf("%d ",bez_duplikati[i]);
    free(bez_duplikati); //Ne sakas memmory leak, neli?
    free(niza);
    return 0;
}
Четврто, ставај празни место во кодот да го ебам. Некој треба да ти го чита кодот некој ден а не се збиено да е.
Толку од мене.
 

Eva Molotow

Anti-social Engineer
Член од
6 јуни 2008
Мислења
532
Поени од реакции
392
Е сеа и ти, глеаш дека дечково не е нешто којзнае колку упознаен со тематиката, на ваква едноставна школска задача му зборуваш за динамичка алокација на меморија и segmentation fault.
А веќе ако се фаќаш за комплексност и ефикасност на алгоритамот тогаш дај ако не и обезбеди го кодов од ранливости. :D
 
Член од
14 септември 2013
Мислења
86
Поени од реакции
19
Чим со по будизмов да те просветлам.
(Ако не знаеш за покажувачи време е да научиш.)
Прво и прво големина на низа не може да смениш. Низа има фиксна должина и не може да ја наголемиш ниту пак намалиш. То твојов случај алоцираш низа од 100 броеви на стак. Или пак 400 бајта. Во тие позиции во низата во кој што нема да ставиш број што си го прочитал ќе имаш џанк вредност.

Второ ако сакаш програмата да е поекономична прво читај ја променливата golemina па потоа динамички алоцирај меморија. (Што корист да алоцираш меморија за 100 броеви ако ти се потребни само 3. Или пак ако имаш 500 тогаш во твојов случај ќе имаш Segmentation Fault)

Трето програмата е неефикасна. О(N^3) алгоритам за отстранување дупликати е катастрофа. Сортирајја низата прво. Бидејќи ако имаш елемент x и ако има дупликат тогаш ако x има индекс i дупликатите ќе имаат индекси i + 1, i + 2 .... i + N.

Со тоа добибаш О(N logN) алгоритам.
Доле е кодот знам дека вака ти ги сечам нозете но еве ти пример за како тоа се пишува во Ц без memmory leaks.
PHP:
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
int compare (const void * a, const void * b) // Ova e funkcija za qsort sto e definirana vo stdlib.
{
    return ( *(int*)a - *(int*)b );
}
int main()
{
    int golemina,i;
    printf("Vnesi golemina\n");
    scanf("%d", &golemina);
    int* niza = (int *)malloc(sizeof(int) * golemina);
    int* bez_duplikati = (int *)malloc(sizeof(int) * golemina);
    assert(niza != NULL); //Alokacija upsesna. Vo slucaj da e neuspesna dobivas ERROR i avtomatski se stopira programata.
    assert(bez_duplikati != NULL);
    printf("Vnesete gi elementite na nizata:\n");
    for(i = 0; i < golemina; i++)
        scanf("%d", &niza[i]);
    qsort (niza, golemina, sizeof(int), compare);
    int len = 0; //len ne e golemina na niza tuku e postavena dolna granica za da ne printame dzank vrednosti.
    bez_duplikati[len] = niza[0];
    len++;
    for(i = 1; i < golemina; i++) //Logikata za ova e vo postot.
        if(niza[i - 1] != niza[i])
        {
            bez_duplikati[len] = niza[i];
            len++;
        }
    for(i = 0; i < len; i++)
        printf("%d ",bez_duplikati[i]);
    free(bez_duplikati); //Ne sakas memmory leak, neli?
    free(niza);
    return 0;
}
Четврто, ставај празни место во кодот да го ебам. Некој треба да ти го чита кодот некој ден а не се збиено да е.
Толку од мене.
Отприлика ми е јасно тоа што го збориш, но проблемот е следен:
1) Точно знам дека низа има големина и дека од низа не се брише елемент, туку само дека се намалува границата на читање т.е. принтање на границата на истата (откако дупликатите ќе се поместат до крај);
2) Имам тест примери на кои треба да ми помине програмата, па кога би знаел до каде оди границата, би оптимизирал, за да нема вишок места;
3) Погрешно е прво да се сортира низата, затоа што ја треба да го задржам истиот редослед на елементите, но да ги нема дупликатите. Во твојот случај би добил низа без дупликати, но во поинаков редослед од првичниот;
4) Начинот на пишување на кодот е право на избор и стил на програмерот, мене поедноставно ми е да го напишам и прочитам кодот како што си го пишувам, но за вкусови не се дискутира нели?
Тоа е тоа. Фала за помошта у секој случај, проблемот кај мене беше идејата. Попатно, ќе го искористам постов уште еднаш да им се заблагодарам на сите што ми обрнаа внимание и што ми одговорија (без оглед дали на постот или во приватна порака) :))))
 
M

Mr.InF3ction

Гостин
@thebuddhatet

Нормално дека за вкусеви не се дискутира ( и ова е релативно ама ај ) но кога се работи за програмирање не треба да мислиш така. Затоа што скоро никогаш во животот нема да работиш на нешто и само ти да го одржуваш тоа до крајот на светот :D така што многу е битно прегледноста на кодот, освен ти и некој друг ако седне да го чита кодот треба да е прегледен, лесен за читање. и нормано поправање грешки. Поради тоа и постојат некои "правила" за пишување на код.
 
Член од
14 септември 2013
Мислења
86
Поени од реакции
19
@thebuddhatet

Нормално дека за вкусеви не се дискутира ( и ова е релативно ама ај ) но кога се работи за програмирање не треба да мислиш така. Затоа што скоро никогаш во животот нема да работиш на нешто и само ти да го одржуваш тоа до крајот на светот :D така што многу е битно прегледноста на кодот, освен ти и некој друг ако седне да го чита кодот треба да е прегледен, лесен за читање. и нормано поправање грешки. Поради тоа и постојат некои "правила" за пишување на код.
И натаму не се сложувам со тебе дека не ми е читлив кодот (а и со тој погоре). У секој случај, фала на критика, може и ќе ја зеам некад у предвид.
 
M

Mr.InF3ction

Гостин
Не коментирав за твојот код, туку за твојот начин на размислување, што со твојот последен коментар потврди дека не е како што треба :icon_lol: Кликни на линкот и имаш добар пример со "Spaces".
 

Vargo _online

プレイステーション3
Член од
1 мај 2010
Мислења
489
Поени од реакции
58
Дали знаете некоја книга за Ц++ на македонски јазик.... и дали знаете каде може да се најде и по која цена
 

King B

Bears. Beets. Battlestar Galactica.
Член од
24 јануари 2011
Мислења
1.801
Поени од реакции
4.076
Да не знае некој рекурзивна функција во C за наоѓање НЗС на два броја, ама со два влезни параметри?


#include<stdio.h>
int nzs(int m, int n, int x)
{
if (m%n==0) return m;
else return (nzs(m+x, n,x));
}

int main()
{
int a,b,x;
scanf("%d%d", &a, &b);
x=a;
printf("%d", nzs(a,b,x));
return 0;
}

оваа е со три влезни параметри, у main-от третиот параметар ја прима вредноста на поголемиот број.. ама ја сакам со два влезни XD
по некоја логика ако има рекурзивна со 2 влезни за НЗД, би требало да има и за НЗС.
 
Член од
18 октомври 2010
Мислења
523
Поени од реакции
164
Да не знае некој рекурзивна функција во C за наоѓање НЗС на два броја, ама со два влезни параметри?


#include<stdio.h>
int nzs(int m, int n, int x)
{
if (m%n==0) return m;
else return (nzs(m+x, n,x));
}

int main()
{
int a,b,x;
scanf("%d%d", &a, &b);
x=a;
printf("%d", nzs(a,b,x));
return 0;
}

оваа е со три влезни параметри, у main-от третиот параметар ја прима вредноста на поголемиот број.. ама ја сакам со два влезни XD
по некоја логика ако има рекурзивна со 2 влезни за НЗД, би требало да има и за НЗС.

NZS(a,b) = a*b/NZD(a,b)
 

Kajgana Shop

На врв Bottom