C/C++

Член од
21 ноември 2009
Мислења
29
Поени од реакции
11
Недела дена ништо не пипнав програмирањево, но пак се враќам во акција.
Застанав кај покажувачи, отприлика сфатив како работат но не целосно.

Проблем ми е со матрициве, како можат да се внесат, бидејќи така како што замислував нешто не сака.

Ако има некој нерви убаво да ја разгледа и да ми каже каде грешам може да повели..

Задачата гласи вака.


6. Да се напише процедура којашто влезната матрица Am×n ќе ја преуреди така да
колоните и се во растечки редослед на максималниот елемент на колоната.
Пример:


1 2 3 4 1 4 2 1 1 3
8 6 6 3 3 >>>>> 3 6 3 8 6
0 3 9 2 7 >>>>> 2 3 7 0 9
8 6 9 4 7 4 6 7 8 9

Или да ја појаснам. Прво се наоѓа по еден маx вредност во секоја колона, и сите тие n елементи се сместуваат во низа.
Пример во прва колона тоа е 8, втора 6, трета 9 итн.

Потоа според нив, да се подредат цели колони според редоследот на нивните маx елементи.

Во скриптата ја имаат решено но без покажувачи.

вака :


- внеси матрица
- најди го макс вредност од секоја колона и смести ги во низа.
- подреди ја низата со макс елементи според растечки редослед а со таа вредност премести ја и цела нејзина колона. (мал додаток со simple sorting за да се подредат и колоните кој не го сфаќам баш).

И кодот изгледа вака.
(без покажувачи)

PHP:
#include<stdio.h>
int main()
{
    int i,j,n,m,a[100][100],t,max[100],k;
 
    printf("Vnesi ja dimenzijata na matricata : \n");
    printf("m = ");
    scanf("%d",&m);                    //def dimenzii na matrica
    printf("\n n = ");
    scanf("%d",&n);
 
  printf("\n Vnesi ja matriata : \n");
    for(i=0;i<m;i++)                      //vnesuvanje matrica
    for(j=0;j<n;j++)
    {printf("a[%d][%d]= ",i,j);
    scanf("%d",&a[i][j]);
    }
 
    for(j=0;j<n;j++)
    {
                    max[j]=a[0][j];    // niza so max vrednosti od kolonite
                    for(i=0;i<m;i++)
                    if(max[j]<a[i][j])
                      max[j]=a[i][j];
                      }
         
    for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
    if(max[i]>max[j])
        {
                      t=max[i]; max[i]=max[j]; max[j]=t;
                      for(k=0;k<m;k++)
                        {
                                        t=a[k][i];
                                        a[k][i]=a[k][j];
                                        a[k][j]=t;
                                        }
        }
 
    printf("Podredenata Niza so max elementi od sekoja kolona e : \n");
    for(j=0;j<n;j++)
    printf("max[%d]= %d\n",j,max[j]);
 
    printf("A podredenata matrica e : \n");
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
                    printf("a[%d,%d]=%d\n",i,j,a[i][j]);
       
                    system("pause");
                    return 0;
}

Е сега јас сакам да го направам со покажувачи за да ги извежбам.
прашање 1)
Дали како што се внесуваше низа така сега ќе се внесува и матрица ?
зошто на доле кодот ми јавува грешка,
- 8 C:\Dev-Cpp\Unsdfdftitled1.c invalid use of array with unspecified bounds.

односно.
PHP:
#include<stdio.h>
void vnesi(int a[][],int m,int n)
{
    int i,j;
    printf("vnesi ja matricata : \m");
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    scanf("%d",&a[i][j]);
    }
int main()
{
    int a[100][100],n,m;
    printf("vnesi gi dimenziite : \n");
    scanf("%d",&m);
    scanf("%d",&n);
    vnesi(a,m,n);
    system("pause");
    return 0;
}
значи ли тоа дека не можам да ги пренесувам матриците?

Потоа во претходните задачи ЗА покажувачи имаше некои функции како на пример.

int linearno(int a[],int n,int vrednost)
и внатре на крај return t;

И се чини како најобична функција само што внесуваш низа внатре. И никаде не користиш ни * ни ништо.

PHP:
#include<stdio.h>
 
 
                void swap(int *a,int *b)
                {
                      int pom;
                      pom=*a;
                      *a=*b;
                      *b=pom;
                      }
void podredi(int a[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<n-i-1;j++)
    if(a[j]>a[j+1])
      {
                    swap(&a[j],&a[j+1]);
                    }
                    }
       
void vnesi(int a[],int n)
{
    int i;
    printf("Vnesi gi elementite na nizata : \n");
    for(i=0;i<n;i++)
    {
                    printf("a[%d]=",i);
                    scanf("%d",&a[i]);
                    }
                    }
       
int linearno(int a[],int n,int vrednost)
{
    int lb,i=0;
    lb=0;
    while(!lb && i<n)
    {
              if(a[i]==vrednost)
              lb=i;
              i++;
              }
              return lb;
              }
int linearno1(int a[],int n,int vrednost)
{
    int i;
    i=0;
    a[n]=vrednost;
    while(a[i]!=vrednost)
    i++;
    if(i==n)
    return 0;
    else return i;
    }
    int binarno(int a[],int n,int vrednost)
    {
        int i,poc,kraj,sred,najden;
        podredi(a,n);
        printf("podredeno nizata e : ");
        for(i=0;i<n;i++)
        printf("%d\n",a[i]);
        najden=0;
        poc=0;
        kraj=n-1;
        while(najden==0 && poc<=kraj)
        {
                        sred=(poc+kraj)/2;
                        if(vrednost<a[sred])
                        kraj=sred-1;
                        else if(vrednost>a[sred])
                        poc=sred+1;
                        else if(vrednost==a[sred])
                        najden=1;
                        }
                        if(najden)
                        return sred;
                        else return 0;
                        }
int main()
{
    int n,a[100],vrednost,preb,c;
    printf("vnesi kolku clenovi ima nizata : \n");
    scanf("%d",&n);
    vnesi(a,n);
    printf("vnesi koja vrednost ja barash : \n");
    scanf("%d",&vrednost);
    printf("vnesi na koj nacin da se odviva prebaruvanjeto \n Pritisni: \n -1)-lin. \n -2)lin2\n 3)binarno\n");
    scanf("%d",&preb);
    switch(preb)
    {
                case 1:
                      c=linearno(a,n,vrednost);
                      printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
         
                      break;
                      case 2:
                            c=linearno1(a,n,vrednost);
                            printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
               
                            break;
                            case 3:
                      c=binarno(a,n,vrednost);
                      printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
         
                      break;
                      default:
                              printf("vnesovte pogresna vrednsot \n");
                              break;
                              }
                              system("pause");
                              return 0;
}
А разликата со другите кои имаа * пример :

PHP:
#include<stdio.h>
void vnesi(int a[],int n)
{
    int i;
    printf("vnesi ja nizata : \n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    }
int *promena(int a[],int n)
{
    int i=0,j,b[100];
    while(i<n)
    {    b[i]=a[i]+a[n-i-1];
              i++;
              } 
              return b;
              }
int main()
{
 
    int n,a[100],i;
    int *b;
    printf("vnesi kolku elementi : \n");
    scanf("%d",&n);
    vnesi(a,n);
    b=promena(a,n);
    printf("nizata e : \n");
    for(i=0;i<n;i++)
    printf("b[%d]=%d\n",i,*(b+i));
    system("pause");
    return 0;
}
се функции покажувачи зошто кај нив е дефинирана низата и од кај нив ја земаме?

Дали може така и со матрици ??? И како би се пренела матрицата од покажувачот најобично ?
Само претходно треба да го дефинраме со * ?
int *bp;

и после ја зема со bp=podredena_matrica(n.m);
printf("%d", b[k][j]); ???


ако ме разбра некој добро е :P
--- надополнето: 12 август 2012 во 16:00 ---
Еве ти пример функции за внесување и печатење на матрица со покажувачи
Код:
void vnesiMatrica(int *p, int rows, int columns)
{
    int i;
    printf("\n Vnesi ja matriata : \n");
    for(i=0;i<rows*columns;i++)               
    {
        printf("a[%d][%d]= ",i/rows,i%columns);
        scanf("%d",(p+i));
    }
       
}
 
void pecatiMatrica(int *p, int rows, int columns)
{
    int i;
    for(i=0;i<rows*columns;i++)
    {
        printf("%d\t",*(p+i));
        if((i+1)%(columns) == 0)
          printf("\n");
    }
}
Во твојот случај функциите ги повикуваш:
Код:
vnesiMatrica(&a[0][0],m,n);
pecatiMatrica(&a[0][0],m,n);
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Одприлика.. Како што знаеш функција може да враќа само еден елемент. А ако треба да се врати низа од функцијата, на пример од 10 елементи, неможеш да ги вратиш сите 10 одеднаш. Така да со покажувачите идејата е: треба постојано да знаеш колкава е должината на низата, а функциите да ти враќаат само покажувач кон првиот елемент и со помош на адресна аритметика, ти имаш достап до сите елементи на таа низа.

Код:
int arr[10];
...
void print(int *a, int len)
{
      int i;
      for(i = 0; i < len; i++)
              printf("%d  ", a[i]);        //printf("%d  ", *(a+i) );
}
Во некој предходен пост пишав дека a[ i ] и *(a+i) се исти. Сега тоа len (должината на низата) ќе мора да ја препраќаш низ фукнциите, или правиш една глобална променлива па си ја користиш директно без да ја препраќаш како параметар.

Тоа е целата финта со покажувачите. Не можеш да вратиш 10 елементи од еднаш.

Со матриците е нешто слично. Не можеш да вратиш или да предадеш цела матрица, така да, препраќаш покажувачи, димензиите ги знаеш, и со адресна аритметика се движиш низ матрицата.

Иначе матрица можеш да представиш како низа (со еден покажувач) и тогаш движењето низ неа е малку по-математичко, или со два покажувачи (покажувач од покажувачи).

Еве и некои елементарни примери, ако има нешто нејасно пиши.


Матрица како низа:
PHP:
#include <stdio.h>
 
void PrintMatrix(int *matrix, int m, int n)
{
        for(int i = 0; i < m; i++)
        {
                for(int j = 0;  j < n; j++)
                {
                        printf("%d   ",matrix[i*n + j]);
                }
                printf("\n");
        }
}
void ReadMatrix(int *matrix, int m, int n)
{
        for(int i = 0; i < m; i++)
        {
                for(int j = 0; j < n; j++)
                {
                        scanf("%d",&matrix[i*n + j]);
                }
        }
}
 
int main()
{
        int mat[100], row, col;
        scanf("%d%d",&row, &col);
 
        ReadMatrix(mat, row,col);
        PrintMatrix(mat,row,col);
}
Матрица - покажувач кон покажувач:
PHP:
#include <stdio.h>
 
void ReadMatrix(int (*matrix)[100], int m, int n)
{
        for(int i = 0; i < m; i++)
                for(int j = 0; j < n; j++)
                        scanf("%d",&matrix[i][j]);
}
 
void PrintMatrix(int (*matrix)[100], int m, int n)
{
        for(int i = 0; i < m; i++)
        {
                for(int j = 0; j < n; j++)
                {
                        printf("%d   ",matrix[i][j]);
                }
                printf("\n");
        }
}
 
int main()
{
        int m[100][100];
        int row,col;
        scanf("%d%d",&row,&col);
 
        ReadMatrix(m,row,col);
        PrintMatrix(m,row,col);
}
Тука параметрите се од тип int (*matrix)[ 100 ] зашто матрицата не може да биде представена буквално, како покажувач од покажувач, туку како покашувач кон низа со должина 100. (Покажувач кон редовите на матрицата).

Може да биде запишано и како:
int matrix[ ][100]
int matrix[100][100]

и трите се еквивалентни.
 
Член од
4 август 2011
Мислења
178
Поени од реакции
517
Да се напише програма која ќе ги испечати сите цели броеви од зададен опсег (почетокот и крајот на опсегот се внесуваат од тастатура) и нивните трансформирани претстави. Со трансформацијата се добива број на кој цифрите му се превртени и помеѓу секоја од цифрите се вметнува цифрата 7.
Пример: за бројот 85, ќе го испечати бројот 85 и 578
за бројот 20, ќе го испечати бројот 20 и 72
за бројот 100, ќе го испечати бројот 100 и 7071
за бројот 236, ќе го испечати бројот 236 и 67372.

Мислам дека можам да искористам функција за превртување на број:

int prevrtiBr(int broj)

{
int nov = 0;
while(broj)
{
nov = nov*10+broj%10;
broj /= 10;
}

return nov;
}

Што понатаму? Како да ја вметнам цифрата на вака превртениот број?

 
M

Mr.InF3ction

Гостин
Да се напише програма која ќе ги испечати сите цели броеви од зададен опсег (почетокот и крајот на опсегот се внесуваат од тастатура) и нивните трансформирани претстави. Со трансформацијата се добива број на кој цифрите му се превртени и помеѓу секоја од цифрите се вметнува цифрата 7.
PHP:
int prevrtiBr(int broj)
 
{
int nov = 0;
while(broj)
{
nov = nov*10+broj%10;
if(broj>9) // условот треба да се додаде за на крај да не има 7
    nov = nov * 10 + 7; // и овој ред..за да додаде 7 после секое цифра
broj /= 10;
}
 
return nov;
}
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Што е разликата помеѓу внесување на низа од знаци со

while((i<100-1) && (c=getchar())!='\n')
s[i++]=c;
s='\0';


и ... само gets(s);

kaј gets не ставаме ни '\0' ..

Кога се користи едното а кога другото ?
 
M

Mr.InF3ction

Гостин
Разлика...па и нема баш разлика освен тоа дека gets() ти е готова функција што ја повикуваш да внесеш низа, а низата се внесува знак по знак се додека не внесеш ентер, а првото ти е...алгоритам или код за истото на некој начин што се случува во gets();

А за тоа кога се користи..пр ако читаш некоја низа што не е битно како ќе внесе јас би користел gets(), а ако треба пример име и презиме да внесе со првот начин како што внесеува така би направил пр првата буква да е голема и сите други мали итн..така едне прост пример..нема некое "правило" кога треба да се користи.
 
Член од
4 август 2011
Мислења
178
Поени од реакции
517
Како да ги соберам вредностите на елементите од двете позиции на една матрица кои се симетрични во однос на главната дијагонала?
Дали треба да користам услов за елементите кои се над (i<j) или под (i>j) главната дијагонала? Или нешто вака?
for(i=0;i<=m;i++)
for(j=1;j<=m;j++)
if(i!=j)
suma+=a[j]+a[j];
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Код:
for(int i = 0; i < m; i++)
        for(int j = i + 1; j < m; j++)
        {
                suma += matrix[i][j] + matrix[j][i];
        }
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
Dadena e matrica i treba da gi ispecati indeksite na elementite na matricata vo opagacki redosled(od maksimalniot element pa nadolu). Ako mozi nekoj da ja resi so objasnuvanje please :)
 
Член од
25 јануари 2009
Мислења
45
Поени од реакции
2
Ако може мало објаснување: во функцијата prv_pogolem_prost, во
if ( e_prost (n + 1,3)) делот..зошто баш тројка? :cautious: Задачата е да се најде првиот поголем прост број од внесен број n.

int e_prost ( int n, int i) {
if (n < 4)
return 1;
else if ((n % 2) == 0) return 0;
else if (n % i == 0) return 0;
else if (i * i > n) return 1;
else return e_prost (n, i + 2);
}
int prv_pogolem_prost (int n) {
if ( e_prost (n + 1, 3)) return n + 1;
else return prv_pogolem_prost (n + 1);
}
 
Член од
8 октомври 2011
Мислења
65
Поени од реакции
48
Dadena e matrica i treba da gi ispecati indeksite na elementite na matricata vo opagacki redosled(od maksimalniot element pa nadolu). Ako mozi nekoj da ja resi so objasnuvanje please :)
Код:
#include <stdio.h>
 
#define MAX_SIZE 100
 
void pecati_matrica(int mat[][MAX_SIZE], int n, int m) /* F-ja za pecatenje na matrica */
 
{
 
    int i, j;
 
    for (i = 0; i < n; i++)
 
    {
 
        for (j = 0; j < m; j++)
 
        {
 
            printf("%d ", mat[i][j]);
 
        }
 
        printf("\n");
 
    }
 
}
 
 
 
void vnesi_matrica(int mat[][MAX_SIZE], int n, int m) /* F-ja za citanje na matrica */
 
{
 
    int i, j;
 
    printf("Vnesete gi clenovite na matricata\n ");
 
    for (i = 0; i < n; i++)
 
    {
 
        for (j = 0; j < m; j++)
 
        {
 
            printf("\n[%d][%d] = ", i,j);
 
            scanf("%d", &mat[i][j]);
 
        }
 
    }
 
}
 
void pecati_indeksi(int mat[][MAX_SIZE], int n, int m)
 
{
 
    int i, j;
 
   [B] for (i = n; i > 0; i--)[/B]
 
    {
 
        printf("\n");
 
       [B] for (j = m; j > 0; j--)[/B]
 
        {
 
            printf("[%d][%d] ",[B] i, j[/B]);
 
        }
 
        printf("\n");
 
    }
 
}
 
int main()
 
{
 
    int matrica[MAX_SIZE][MAX_SIZE], n, m;
 
    printf("Vnesi n i m\n");
 
    scanf("%d%d", &n, &m);
 
    vnesi_matrica(matrica,n,m);
 
    printf("Vnesenata matrica e:\n");
 
    pecati_matrica(matrica,n,m);
 
    printf("\nIndeksite vo opagacki redosled se:\n");
 
    pecati_indeksi(matrica,n,m);
 
    return 0;
 
}
Задачата е многу лесна само ќе ги ставиш i и j да почнуваат од n i m и ги намалуваш за 1 се до 0, и само ги печатиш.
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
Ama izgleda ne me svati bas so sakav da kazam. Znaci vo matricata vnesuvas elementi. I indeksite gi pecatis od indeksot koj go ima najvisokiot element do indeksot koj go ima najniskiot element vo matricata.
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
if ( e_prost (n + 1,3)) делот..зошто баш тројка?
Тој аргумент (тројката) во функцијата се користи за правење на проверката со делливоста. Нели простите броеви се дефинирани како делливи само со себе и со еден (ова ни кажува дека ако некој број е деллив со еден, дозволено е и да е прост). Проверката со двојката е веќе направена во самата функција и од правилото дека сите парни броеви се делат со два, следува дека парни броеви не се прости. Така да нема потреба да се проверуваат парните.
Првиот непарен број од кој што зависи дали број е прост или не, е три - затоа и со него се почнува. И понатака, проверката оди од три па нагоре, прескокнувајќи ги парните броеви(проверува за 3, па за 3+2, па за (3+2)+2 ... ).

Фактички тој дел ти е чисто математичкиот дел. Рекурсијата ти е МНОГУ по-сложена од овие заебанции со простиве броеви. Ако ја разбираш како што треба, штета ќе ти е да си оставаш вакви пропусти. Така да, ако учиш програмирање за на факс, стегај и математиката и немаш гајле ;)
--- надополнето: 15 август 2012 во 17:45 ---
Dadena e matrica i treba da gi ispecati indeksite na elementite na matricata vo opagacki redosled
Ова е се што ти треба. Ако ти требаат функции за читање на матрица и некои слични, мислам дека имаше на некои предходни постови. Од тука натака другиот дел е веќе по-лесен. Тука мал проблем е што на овој начин ја уништуваш матрицата што ја обработуваш, но ако направиш копија на матрицата и ја обработиш копијата, оригиналната ќе ти остане непроменета.

Принципот е:
-наоѓаш најмал елемент во матрицата
-ги запишуваш индексите (во struct Index)
-го бришеш најдениот нај-мал елемент
-следното пребарување нај-мал елемент ќе е нај-малиот од останатите не-избришани елементи

Во случајов, бришењето не е буквално бришење, туку на тоа место поставуваме некој голем број, со цел сите останати елементи да се помали. Ако беше барање на нај-голем елемент, на тоа место ќе поставевме некој многу мал елемент што ќе е постојано прескокнуван во условот за барање.

Код:
#include <limits.h>
#define LEN 50
...
 
 
int matrix[LEN][LEN];
 
struct{
        int i;
        int j;
}Index[LEN*LEN];
 
int ind = 0; // го користиме за индексирање на низата од структури
int min = INT_MAX;
int rows,cols;
 
do{
        for(int i = 0; i < rows; i++)
        {
                for(int j = 0; j < cols; j++)
                {
                        if(min > matrix[i][j])
                        {
                                min = matrix[i][j];
                                Index[ind].i = i;
                                Index[ind].j = j;
                        }
                }
        }
 
        matrix[Index[ind].i][Index[ind].j] = INT_MAX; //бришење
        ind++;
        min = INT_MAX;
}while(ind < rows*cols);
 
for(int i = 0; i < rows*cols; i++)
{
        printf("%d: [%d,%d] \n", i, Index[i].i, Index[i].j);
}
Иначе, не е необходно индексите да ги зачувуваш во структура, можеш на пример во низа или во матрица. Дури НЕ Е ПОТРЕБНО воопшто некаде да ги зачувуваш. Можеш директно на стапката каде што е бришењето, пред да го избришеш елементот, испечати ги индексите па избриши. Тоа ти си решаваш :)
...
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
Да се имплементира класа Match за која ќе се чуваат информации за:
· Шифра на натпревар (цел број - единствен идентификатор на натпреварот)
· Име на домаќин (динамичка алоцирана низа од знаци)
· Име на гостин (динамички алоцирана низа од знаци)
· Прогноза за крај (1 – победил домаќинот, 0 – нерешено, 2 – победил гостинот)
За потребите на оваа класа да се преоптоварат copy конструктор, default конструктор, конструктор со аргументи, set и get методи и да се напише соодветен деструктор(5 поени). Да се преоптовари операторот за излезен тек << (5 поени) кој ќе ја печати прогнозата во формат:
име на домаќин : име на гостинпрогноза
Да се дефинира класа Result за која се чуваат информации за:
  • Шифра на натпреварот за кој се однесува резултатот
  • Број на голови кои ги постигнал домаќинот
  • Број на голови кои ги постигнал гостинот
Да се имплементира класа Ticket за која се чуваат информации за:
· Уплата во денари – цел број
· Прогнози на натпревари (низа од максимум 16 објекти од класата Match)
· Број на прогнози – големина на низата со прогнози
· Исплата во денари – цел број
За класите Result и Ticket да се напише соодветен конструктор, set и get методи (10 поени). За класата Ticket да се напишат методата contains(int id), која треба да провери дали ливчето содржи натпревар со шифра id (5 поени), методата win(Result *results, int n), која прима низа од n резултати и треба да врати дали ливчето со прогнози е добитно или не. Ливчето е добитно само ако сите прогнози се точни. Во низата со резултати може да има резултати од натпревари за кои немаме обложување во ливчето (10 поени). За класата Ticket да се преоптовари операторот += за додавање на нова прогноза (објект од класата Match) во низата со прогнози(10 поени).Да се напише main() функција за да се тестират класите. (5 поени)
Забелешка: Задачата се решава во програмскиот јазик C++.



ПРАШАЊЕ Е: Дали би можело овде да има наследување или пак од друга класа ако нема наследување пристапуваме само ако функцијата е friend или има и некој друг метод за пристап?
--- надополнето: 16 август 2012 во 14:34 ---
· Прогнози на натпревари (низа од максимум 16 објекти од класата Match)
· Број на прогнози – големина на низата со прогнози

Kako ke gi deklariram ovie vo c++?
 

Kajgana Shop

На врв Bottom