diversija Ierakstīts Marts 18, 2013 Share Ierakstīts Marts 18, 2013 (labots) 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 Marts 18, 2013 - diversija Link to comment Share on other sites More sharing options...
japets Marts 18, 2013 Share Marts 18, 2013 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 More sharing options...
diversija Marts 18, 2013 Author Share Marts 18, 2013 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 More sharing options...
Inspektors Caps Marts 18, 2013 Share Marts 18, 2013 (labots) 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 Marts 18, 2013 - Inspektors Caps Link to comment Share on other sites More sharing options...
diversija Marts 19, 2013 Author Share Marts 19, 2013 (labots) Labi paldies, skatīšos, kā varu to labot. Labots Marts 19, 2013 - diversija Link to comment Share on other sites More sharing options...
nevertell Marts 19, 2013 Share Marts 19, 2013 Indeksi. Link to comment Share on other sites More sharing options...
Viral Aprīlis 10, 2013 Share Aprīlis 10, 2013 Tas tak c, nevis c#... Link to comment Share on other sites More sharing options...
Vilx- Aprīlis 10, 2013 Share Aprīlis 10, 2013 Tas tak nekromanceris! Link to comment Share on other sites More sharing options...
Recommended Posts