пример исправљања грешака у програму

Кроз један пример видећемо како могу да се исправљају грешке које се јављају у програмирању.

Задатак: Написати програм који уређује елементе k-те врсте од најмањег до највећег, и приказује новодобијену матрицу.

Када прочитамо текст овог задатка треба уочити да се суштина задатка своди на сортирање низа. „Ако се добро сећам, код сортирања постоје две for петље једна унутар друге чији индекси немају исте границе, значи отприлике овако нешто:

#include<stdio.h>
main()
{
    int m,n,i,j,a[20][20],pom, k;
    printf("unesi dimenzije matrice\t");
    scanf("%d%d",&n,&m);
    printf("unesi elemente matrice:\n");
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)scanf("%d",&a[i][j]);
    printf("unesi k");
    scanf("%d",&k);
    for(i=0;i<n-1;i++)
         for(j=1;j<n;j++)
             if(a[k][j]<a[k][i])
            {
                 pom=a[k][i];
                 a[k][i]=a[k][j];
                 a[k][j]=pom;
            }
    printf("izmenjena matrica:\n");
    for(i=0;i<n;i++)
    {
         for(j=0;j<m;j++)printf("%d\t",a[i][j]);
         printf("\n");
    }
}

Али, кад покренемо овај програм не добијемо жељени резултат:

Унели смо да је k=2, а то је трећа врста. Као што видимо, програм није сортирао трећу врсту!
Ово је такозвана логичка грешка – све наредбе су исправно написане (зато компајлер и не пријављује грешку), али програм не ради оно што се од њега тражи! Овакве грешке је јако тешко открити. Зато се програмери користе разним триковима како би лоцирали грешку. Један од начина (у нашем примеру) јесте да се приликом сортирања (у оним угњежденим for петљама) исписују вредности променљивих које би требало програм да замени. Дакле, програм треба допунити следећим printf наредбама:

printf("a[%d][%d]=%d",k,i,a[k][i]);
printf("a[%d][%d]=%d",k,j,a[k][j]);

Тако да програм сада изгледа овако:

#include<stdio.h>
main()
{
int m,n,i,j,a[20][20],pom, k;
printf("unesi dimenzije matrice\t");
scanf("%d%d",&n,&m);
printf("unesi elemente matrice:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)scanf("%d",&a[i][j]);
printf("unesi k");
scanf("%d",&k);
for(i=0;i<n-1;i++)
 for(j=1;j<n;j++)
 if(a[k][j]<a[k][i])
{
 pom=a[k][i];
 a[k][i]=a[k][j];
 a[k][j]=pom;
 printf("a[%d][%d]=%d",k,i,a[k][i]);
printf("a[%d][%d]=%d",k,j,a[k][j]);
}
printf("izmenjena matrica:\n");
for(i=0;i<n;i++)
{
 for(j=0;j<m;j++)printf("%d\t",a[i][j]);
 printf("\n");
}
}

а резултат извршавања нам баш и не помаже:

Можемо да закључимо да је заменио места само елементима на прва два места у трећој врсти. Након тога је стао. „Јао, синуло ми је… Граница у унутрашњој for петљи треба да иде од i+1. Ајде да пробамо:“

#include<stdio.h>
main()
{
int m,n,i,j,a[20][20],pom, k;
printf("unesi dimenzije matrice\t");
scanf("%d%d",&n,&m);
printf("unesi elemente matrice:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)scanf("%d",&a[i][j]);
printf("unesi k");
scanf("%d",&k);
for(i=0;i<n-1;i++)
 for(j=i+1;j<n;j++)
 if(a[k][j]<a[k][i])
{
 pom=a[k][i];
 a[k][i]=a[k][j];
 a[k][j]=pom;
 printf("a[%d][%d]=%d",k,i,a[k][i]);
printf("a[%d][%d]=%d",k,j,a[k][j]);
}
printf("izmenjena matrica:\n");
for(i=0;i<n;i++)
{
 for(j=0;j<m;j++)printf("%d\t",a[i][j]);
 printf("\n");
}
}

Резултат – исти као малопре:

Сад је ред на још мало размишљања… „Знам… Индекси треба да буду везани за број колона, а не редова!“

#include<stdio.h>
main()
{
int m,n,i,j,a[20][20],pom, k;
printf("unesi dimenzije matrice\t");
scanf("%d%d",&n,&m);
printf("unesi elemente matrice:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)scanf("%d",&a[i][j]);
printf("unesi k");
scanf("%d",&k);
for(i=0;i<m-1;i++)
 for(j=i+1;j<m;j++)
 if(a[k][j]<a[k][i])
{
 pom=a[k][i];
 a[k][i]=a[k][j];
 a[k][j]=pom;
 printf("a[%d][%d]=%d",k,i,a[k][i]);
printf("a[%d][%d]=%d",k,j,a[k][j]);
}
printf("izmenjena matrica:\n");
for(i=0;i<n;i++)
{
 for(j=0;j<m;j++)printf("%d\t",a[i][j]);
 printf("\n");
}
}

РАДИ! Сад можемо обрисати контролне printf наредбе (означене црвеном бојом).

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s