Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем с масиви C

Featured Replies

Трети ден се мъча с този код. Моля за малко помощ :(

Дадена ми е следната курсова задача : 

Да се състави програма за обработка на масива A[N,N], където данните са реални числа в интервала [-1000;1000]. Програмата да извърши следните действия:

- да се образува едномерен масив C , елементите на който са елементи на масива А намиращи се под главния диагонал;

- полученият масив да се сортира по големина;

Проблемът е че не сортира отрицателните елементи и не сортира последния елемент от едномерния масив. 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long int const k = 15;
float d[k][k],c[k],a;
int n,j,i,m,br=0,x=0,y=0;
int main ()
{ 
    printf("Uslovie : A) Da se obrazuva ednomeren masiv C, elementite na koito");
    printf(" sa elementite na masiva A namirashti se pod glavniq diagonal.\n");
    printf("B)Polucheniqt masiv da se sortira po golemina.\n");
    printf("Otpechatvane na poluchenite rezultati sled obrabotka A) i sled obrabotka B. \n\n");
    
    printf("Vuvejdane na vhodni danni:\n");
    printf("Vuvedete broi redove i broi stulbove n=");
    scanf("%d",&n);
      for(i=0;i<n;i++)
       for(j=0;j<n;j++)
        do
         { 
          printf("Vuvedete A[%d][%d]:",i,j);
          scanf("%f",&d[i][j]);
         }
        while (((d[i][j])<-1000) || ((d[i][j])>1000));
                       
    printf("Izvejdane na vhodni danni :\n");
     for (i=0;i<n;i++)
     {
      for (j=0;j<n;j++)
       printf("%.1f ",d[i][j]);
       printf("\n");
     }
        
    printf("Izvejdane na danni ot ednomeren masiv C:\n");
     for (i=0;i<n;i++)
      for (j=0;j<n;j++)
      if (i>j)
      {
        c[x]=d[i][j];
        printf("C[%d]:",x+1);
        printf("%.1f\n",c[x]);
        x=x+1;
      }                    
    printf("Sortirane na masiv C po razmer:\n");
    for (x=1;x<n;x++)
      { 
      for (y=x+1;y<n;y++)
        if (c[x] > c[y])
        {
                 
                                a=c[x];
                                c[x]=c[y];
                                c[y]=a;
                                }}
                                //samo polojitelni !
                                
        m=((n*n)-n)/2;
        for (x=0;x<m;x++)
        printf("C[%d]:%.1f \n",x+1,c[x]);
    system("pause");
    system("pause");
    return 0;
}

Редактирано от theshefa (преглед на промените)

Здравейте !

 

Прилагам коментарите направо в кода Ви:

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long int const k = 15;
float d[k][k],c[k],a; //Така дефиниран, c[k] ще работи само за k <= 3. За всички k > 3, паметта няма да стигне. Броя на елементите под главния диагонал е (k*k - k)/2
int n,j,i,m,br=0,x=0,y=0; 
int main ()
{ 
...
     for (i=0;i<n;i++)
      for (j=0;j<n;j++)
      if (i>j)
      {
        c[x]=d[i][j];  //Тук не трябва да е така. Вижте как ползвате x по - надолу. Присвоявате му 1-ца и така губите всъщност докъде е запълнен масива c[]. Този ред трябва да е c[br] = d[i][j] !!!
        printf("C[%d]:",x+1); // Тук също => printf("C[%d]:",br+1);
        printf("%.1f\n",c[x]); //Тук също => printf("%.1f\n",c[br]);
        x=x+1;                // И тук    => br = br + 1;
      }                    
    printf("Sortirane na masiv C po razmer:\n");
    for (x=1;x<n;x++) // Тук x трябва да си започва от 0, а не от 1. И цикъла ще трябва да е до x < br, а не до n (x < br)
      { 
      for (y=x+1;y<n;y++)       //Аналогично - цикъла трябва да бъде до y < br, а не до n (y < br)
        if (c[x] > c[y])
        {
                 
                                a=c[x];
                                c[x]=c[y];
                                c[y]=a;
                                }}
                                //samo polojitelni !
                                
        m=((n*n)-n)/2;     // Това е вече напълно ненужно. m ще е равно на br в този момент. Може да се уверите в това .
        for (x=0;x<m;x++)  // Практически е вярно, но ненужно - пак, br вече пази стойността на размера на масива c, не е нужна нова променлива.
        printf("C[%d]:%.1f \n",x+1,c[x]);
    system("pause");
    system("pause"); // ?! Защо втора пауза ?!
    return 0;
}

 

Поздрави !

  • Автор

Мерси сега ще го погледна. А втората пауза е заради въвеждането на 5х5 масива и прескачам паузата при писането :)

П.С. Работи перфектно ! Благодаря много ! Спасихте ми доста главоболия заради гадните грешки които съм изстрелял :) 

Редактирано от theshefa (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.