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
Reklama

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

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
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, 47 hostů

Moderátoři diskuze

 

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