Jump to content

Masīvu apstrāde C# valodā


diversija
 Share

Recommended Posts

Darbs iekš #C valodas ar masīviem...

Bija jāizveido programma ar indeksiem un rādītājiem, kas aprēķina sānu diagonālei blakus esošo diagonāļu elementu summas. Viss it kā ir izdarīts, strādāja pareizi, bet, kad programmu apvienoju ar rādītājiem un indeksiem, tad parādījās problēma... Rezultātā, ja masīva izmērs ir 5x5, tad ar indeksiem viss pareizi aprēķināts, bet ar rādītājiem kļūdu atrod, bet, ja izmērs ir 7x7, tad viss ir pareizi aprēķināts... 

 

Varbūt, kāds zinošāks var palīdzēt...?

 

//bibliotēkas
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAX 7

//NODEFINĒ APAKŠFUNKCIJAS
void indeksi(int masivs[][MAX],int MasivaIzmers);
void raditaji(int *masivs, int MasivaIzmers);

//galvena funkcija
int main()
{
int izvele,i,Sk,j,sum,dg,MasivaIzmers,Skaititajs,choice,mas[MAX][MAX];
     system("cls");
     srand(time(NULL));

//izmera izvele - sakums
     printf("Kadu masivu apstradasim:\n1. [5][5]\n2. [7][7]\nTava izvele: ");
     scanf("%d", &choice);
     switch(choice){
     case 1: MasivaIzmers = 5;
     break;
     case 2: MasivaIzmers = 7;
     break;
     default: MasivaIzmers = 7;}
     printf("Tiks veidots [%d][%d] masivs\n",MasivaIzmers,MasivaIzmers);
     printf("\n");
//izmera izvele - beigas

//izvele - sakums
	printf("Ka izveidot masivu:\n1. Automatiski\n2. Manuali\nTava izvele: ");
	scanf("%d",&izvele);
    printf("\n");
	switch(izvele){			
case 1:		

//automatiska masiva izveide - sakums
//izveido un izvada masīvu
     for (i=0; i<MasivaIzmers; i++)
	 {for (j=0; j<MasivaIzmers; j++)
		 {printf ("%2d", mas[i][j]=rand()%10 );}
             printf("\n");} 
//automatiska masiva izveide - beigas

break;
case 2:	

//Manuala masiva izvade - sakums
//ievada masīvā elementus
Skaititajs=0;
	 for (i=0; i<MasivaIzmers; i++)
	 {for (j=0; j<MasivaIzmers; j++)
		 {(Skaititajs=Skaititajs+1);
			printf("Ievadi masiva: %d",Skaititajs);
			printf(". elementu: \n");
            scanf("%d",&mas[i][j]);}}            
//izvada masīvu
     for (i=0; i<MasivaIzmers; i++)
	 {for (j=0; j<MasivaIzmers; j++)
		 {printf("%2d",mas[i][j]);}
             printf("\n");}
//manuala masiva izveida - beigas

break;
default: printf("Nepareiza izvele!");
getch();
}//izvele - beigas
	//IZVADA APAKŠFUNKCIJAS
	indeksi(mas,MasivaIzmers);					
	raditaji(&mas[0][0],MasivaIzmers);				
	//------
getch(); //nopauzē programmu, kamēr nospiež jebkuru taustiņu
return 0; //atgriež 0, ja pareizi viss strādā
}

//APAKŠFUNKCIJAS
void raditaji(int *masivs,int MasivaIzmers)
{
	int Sk, sum, dg,i,j;
printf("\n");
printf("Ar raditajiem");
printf("\n");
	      Sk=0;
	      sum=0;
	for(dg=0;dg<MasivaIzmers*2-1;dg++){
		if(dg!=MasivaIzmers-1){
		for(i=0;i<MasivaIzmers;i++)
			for(j=0;j<MasivaIzmers;j++)
				if(i+j==dg)
					sum=sum + *(masivs+i*MasivaIzmers+j);
		Sk=Sk+1;
		printf("| %2d.""%2d ",Sk,sum);
		sum=0;}}
}
void indeksi(int mas[][MAX],int MasivaIzmers)
{
	int Sk, sum, dg,i,j;
printf("\n");
printf("Ar indeksiem");
printf("\n");
	      Sk=0;
	      sum=0;
	for(dg=0;dg<MasivaIzmers*2-1;dg++){
		if(dg!=MasivaIzmers-1){
		for(i=0;i<MasivaIzmers;i++)
			for(j=0;j<MasivaIzmers;j++)
				if(i+j==dg)
					sum=sum + mas[i][j];
		Sk=Sk+1;
		printf("| %2d.""%2d ",Sk,sum);
		sum=0;}}
}

 

 

Labots - diversija
Link to comment
Share on other sites

Kas ir "#C"? Atgādina "C#", bet tas galīgi nav tas, kas redzams kodā.

Bet ja par tēmu, tad, ja vēlies programmēt, tad obligāti ir jāiemācās programmas debugot.

Debugerī var paskatīties, kādas vērtības satur programmas mainīgie kādā apstādinātā laika momentā.

http://www.youtube.com/results?search_query=visual+studio+debugging&page=&utm_source=opensearch Gan jau būs labi vizuāli tutoriāļi.

Link to comment
Share on other sites

diversija

Bet lieta ir tāda, ka ar 7x7 izmēru, viss strādā pareizi, viss tiek aprēķināts pareizi, bet ar 5x5 rādītāji nav pareizi aprēķināti... Ja es MAX nodefinēju kā 5, tad, 5x5 būs pareizi, bet 7x7 čakarēsies, es nevaru izdomāt, kur īsti ir tā kļūdas...

Link to comment
Share on other sites

Inspektors Caps

Patiesībā nepareizi strādā versija ar indeksiem un tā ir dēļ MAX izmantošanas.

 

int mas[size_A][size_B];
 
// Divas funkcionāli ekvivalentas rindas
sum = mas[i][j];
sum = *(mas+i*SIZE_B+j);

Ja MAX nodefinē 5, bet piekļūsti kā 7x7, tad tas jau ir bugs, jo piekļūsti atmiņai, kur Tev nagi nedrīkst līst.Sagaidāma programmas piespiedu apturēšana aka nolidošana, nepareiza darbība un/vai aprēķini, vai labākajā gadījumā var sagadīties, ka tieši Tavā datorā, OS un visos kopējos apstākļos strādās, bet citur nē.

Labots - Inspektors Caps
Link to comment
Share on other sites

diversija
(labots)

Labi paldies, skatīšos, kā varu to labot.

Labots - diversija
Link to comment
Share on other sites

  • 3 weeks later...
Guest
Slēgta tēma, pievienot komentāru nav iespējams.
 Share

×
×
  • Izveidot jaunu...