Suma řádků dvojrozměrného pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Suma řádků dvojrozměrného pole – C / C++ – Fórum – Programujte.comSuma řádků dvojrozměrného pole – C / C++ – Fórum – Programujte.com

 

bodaw
~ Anonymní uživatel
4 příspěvky
8. 4. 2012   #1
-
0
-

zdravím, potřeboval bych poradit s úkolem, chyba je asi někde v typu ukazatelů, ale už jsem se do toho tak zamotal až nevím kde mi hlava stojí.

Napište v jazyku C funkci int *suma_radku(int prvky[][4], int radku), která vypočítá součty na jednotlivých řádcích pole prvky a vrátí jednorozměrné pole obsahující tyto součty. První rozměr pole prvky lze určit pomocí parametru radku, druhý je pevně dán konstantou 4.

#include <stdio.h>
#include <stdlib.h>

int *suma_radku(int prvky[][4], int radku){

    int i,j, suma[radku];

    for(i=0; i<radku; i++){

     for(j=0; j<4; j++)

      suma[i]= suma[i] + prvky[j];


    }
    return *suma;

}


int main(){
      int i,j;

      int prvky [3][4]={{10,2,15,-2},
                        {-52,41,0,12},
                        {15,3,1,-8}};
      int radku = 3;

      printf("Vypis pole:\n");

      for (i=0; i<3; i++){

       for (j=0; j<4; j++)
              printf("%i\t", prvky [i][j]);
              printf ("\n");
              }


       printf("\nSoucty na radcich jsou: %i \n", suma_radku(prvky,radku));

  return 0;
}

Nahlásit jako SPAM
IP: 213.192.25.–
vitamin+8
Grafoman
8. 4. 2012   #2
-
0
-

   

int *suma_radku(int prvky[][4], int radku){

    int i, j; 
    int suma[radku];	//pole suctov
	
	
    for(i=0; i<radku; i++){
        suma[i] = 0;			//inicializuje sucet pola na 0
	for(j=0; j<4; j++)suma[i] +=  prvky[i][j];	//pripocitava prvky
	}
		
    return suma;		//vrati pole cisel (adresu prveho prvka pola)
}

int main()
{
    const int radku = 3;
    int prvky [radku][4]={
			    {10,2,15,-2},
			    {-52,41,0,12},
			    {15,3,1,-8}
			};
	

    int *x = suma_radku(prvky,radku);
	
    //Vypis vrateneho pola
    for (int i = 0; i < radku; ++i)cout << i+1 << ". " << x[i] << endl;
	
    cin.get();
    return EXIT_SUCCESS;
}

Tento kod je viac menej funkcny, ma len jednu fatalnu chybu. Ked inicializujes pole int suma[radku] tak sa alokuje na lokalnom stacku. Akonahle opustis funkciu, tak sa obsah pola zmaze (pripadne sa s nim dalej pracuje ako keby bolo pole zmazane). Takze musis to pole dynamicky alokovat pomocou operatora new.

Preco vlastne kompilator prelozi int suma[radku] ked radku nie je konstanta?

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
fnenks+1
Stálý člen
8. 4. 2012   #3
-
0
-

Fungujici verze: 

#include <iostream>
using namespace std;

int *suma_radku(int prvky[][4], int radku){

    int i, j; 
    int *suma = new int[radku];	
	
    for(i=0; i<radku; i++)
    {
        suma[i] = 0;
	    for(j=0; j<4; j++)
             suma[i] +=  prvky[i][j];
	}		
    return suma;
}

int main()
{
    const int radku = 3;
    int prvky [radku][4]={
			    {10,2,15,-2},
			    {-52,41,0,12},
			    {15,3,1,-8}
       };
    printf("Vypis pole:\n");
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<4; j++)
            printf("%i\t", prvky [i][j]);
        printf ("\n");
    }
    
    int *x = suma_radku(prvky,radku);
	
    for (int i=0; i<3; i++) 
        printf("\nSoucty na radku %i je: %i \n", i+1, x[i]);
	
    cin.get();           //pokud pouzivas windiws, lze pouzit: system("pause");
    return 0;
}
Nahlásit jako SPAM
IP: 88.101.84.–
bodaw
~ Anonymní uživatel
4 příspěvky
9. 4. 2012   #4
-
0
-

#3 fnenks
díky, ale i tohle moc nefunguje, aspoň ne mě. jedu sice na windows, ale hází to spoustu errorů...navíc je v zadání ještě uvedeno že můžeme používat knihovny pouze stdio.d a stdlib.d, a nechce mi to brát řádek:int *suma = new int[radku];

chyba undeclared: new

Nahlásit jako SPAM
IP: 213.192.25.–
crazy
~ Moderátor
+10
Grafoman
9. 4. 2012   #5
-
0
-

#4 bodaw
new je operátor z C++, pokud to tedy kompiluješ jako C, tak musíš použít fci malloc... nepoužiješ objekt cin...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
bodaw
~ Anonymní uživatel
4 příspěvky
9. 4. 2012   #6
-
0
-

#5 crazy
jojo, s malloc už to funguje, skoro přesně tak jak bych chtěl...až na jeden problém..při výpočtu posledního řádku to vyhodí špatné číslo.

#include <stdio.h>
#include <stdlib.h>

int *suma_radku(int prvky[][4], int radku){
    int a,b;

    int *suma = (int *) malloc(sizeof(int));

    for(a=0; a<radku; a++){

     for(b=0; b<4; b++)

      suma[a] += prvky[a][b];


    }
    return suma;

}


int main(){
      int i,j;

      int prvky [3][4]={{10,2,15,-2},
                        {-52,41,0,12},
                        {15,3,1,-8}};
      int radku = 3;

      printf("Vypis pole:\n");

      for (i=0; i<radku; i++){

       for (j=0; j<4; j++)
              printf("%i\t", prvky [i][j]);
              printf ("\n");
              }

        int *x = suma_radku(prvky,radku);

        printf("\nSoucty na radcich jsou: ");
        for (i=0; i<radku; i++){
            printf("%i, ",x[i]);

        }


  return 0;
}

Nahlásit jako SPAM
IP: 213.192.25.–
fnenks+1
Stálý člen
9. 4. 2012   #7
-
0
-

 C sice neumim, ale jestli je rozdil jenom v operatoru new, tak spravne reseni je tohle:

#include <stdio.h>
#include <stdlib.h>

int *suma_radku(int prvky[][4], int radku)
{
    int a,b;
    int *suma = (int*)malloc(sizeof(int));

    for(a=0; a<radku; a++)
    {
      suma[a]=0;
      for(b=0; b<4; b++)
        suma[a] += prvky[a][b];
    }
    return suma;
}


int main()
{
    int prvky [3][4]={{10,2,15,-2},{-52,41,0,12},{15,3,1,-8}};
    int radku = 3;
    
    printf("Vypis pole:\n");
    for (int i=0; i<radku; i++)
    {
        for (int j=0; j<4; j++)
            printf("%i\t", prvky [i][j]);
        printf ("\n");
    }
    
    int *x = suma_radku(prvky,radku);
    for (int i=0; i<radku; i++)
        printf("Soucet radku %i je: %i\n",i+1,x[i]);
    system("pause");
    return 0;
}
Nahlásit jako SPAM
IP: 88.101.84.–
fnenks+1
Stálý člen
9. 4. 2012   #8
-
0
-

Tak jsem zjistil ze v obycejnem C nemuzes deklarovat promennou v cyklu for, takze zkus tenhle zdrojak, mel by fungovat:

#include <stdio.h>
#include <stdlib.h>

int *suma_radku(int prvky[][4], int radku)
{
    int a,b;
    int *suma = (int*)malloc(sizeof(int));

    for(a=0; a<radku; a++)
    {
      suma[a]=0;
      for(b=0; b<4; b++)
        suma[a] += prvky[a][b];
    }
    return suma;
}


int main()
{
    int prvky [3][4]={{10,2,15,-2},{-52,41,0,12},{15,3,1,-8}};
    int radku = 3;
    int i;
    int j;
    
    printf("Vypis pole:\n");
    for (i=0; i<radku; i++)
    {
        for (j=0; j<4; j++)
            printf("%i\t", prvky [i][j]);
        printf ("\n");
    }
    
    int *x = suma_radku(prvky,radku);
    for (i=0; i<radku; i++)
        printf("Soucet radku %i je: %i\n",i+1,x[i]);
    return 0;
}
Nahlásit jako SPAM
IP: 88.101.84.–
bodaw
~ Anonymní uživatel
4 příspěvky
9. 4. 2012   #9
-
0
-

#8 fnenks
díky, už to funguje.

Nahlásit jako SPAM
IP: 213.192.25.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 128 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý