Еве ти пример функции за внесување и печатење на матрица со покажувачиНедела дена ништо не пипнав програмирањево, но пак се враќам во акција.
Застанав кај покажувачи, отприлика сфатив како работат но не целосно.
Проблем ми е со матрициве, како можат да се внесат, бидејќи така како што замислував нешто не сака.
Ако има некој нерви убаво да ја разгледа и да ми каже каде грешам може да повели..
Задачата гласи вака.
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]); ???
ако ме разбра некој добро е
--- надополнето: 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);