Kezdőoldal » Közoktatás, tanfolyamok » Házifeladat kérdések » Programozás C-ben házi, nem...

Programozás C-ben házi, nem tudom, hogy egyáltalán jól indultam-e el a feladata megoldásában, ebben segítség?

Figyelt kérdés

Feladat: A program a bemenetére először kap egy darabszámot, ami megmondja hogy mennyi számmal kell dolgoznia (tudjuk hogy legfeljebb 50). Ezután a bemenetre kap ennyi darab egész számot. (A darabszám és a többi szám között a láthatóság kedvéért van egy üres sor, de ez a bekérést nem zavarja). A program kimenete egy darab szám legyen: ha az összes lehetséges módon kiválasztunk 4 különböző számot a beolvasottak közül, hány olyan számnégyes lesz, ahol a legnagyobb és a legkisebb szám összege megegyezik a másik kettő szám összegével. Fontos: csak különböző számokból álló számnégyeseket vizsgálunk. A bemeneten szerepelhet egy érték többször is. Figyelj arra, hogy ha a beolvasott érték szerepelt már korábban, akkor ne mentsd el a tömbbe, hanem ugord át. A bemenet elején lévő darabszám a kapott számok mennyiségét mondja meg, de az egyezések miatt lehet hogy végül a tömbben kevesebb elem lesz.


Példa:


A 34, 56, 23, és 45 számok megfelelő számnégyes alkotnak, hiszen a legkisebb és legnagyobb (23 és 56) összege ugyanannyi, mint a másik kettő (34 és 45) összege (mindkettő 79).


Én eddig jutottam:

#include <stdio.h>

#include <stdlib.h>

int main(){

unsigned int darabszam;

scanf("%u",&darabszam); //the length of the array

unsigned int i,j,l,k,t,d;

int e=0;

unsigned int *arr=malloc(sizeof(unsigned int)*darabszam); //size of the array

unsigned int len=sizeof(*arr)/sizeof(arr[0]);

for (i=0;i<darabszam;i++)

scanf("%u",&arr[i]); //elements of the array

for(unsigned int i=0;i<len;i++)

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

for(k=0;k<len;k++)

for(l=0;l<len;l++)

if (arr[i]>arr[l] && arr[i]>arr[k] && arr[i]>arr[j])

if (arr[j]<arr[l] && arr[j]<arr[k] && arr[j]<arr[i])

{t=arr[j]+arr[i];

d=arr[l]+arr[k];

if(t==d)

e++;}

printf("%d\n",e);

return 0;

}


2019. nov. 29. 10:08
1 2
 1/13 anonymousreview60 ***** válasza:

1. Beolvasod a beolvasandó számok darabszámát: n

2. Memóriát foglalsz le.

3. Eltárolod a beolvasott számokat.

4. Számnégyeseket alkotsz. Összesen n*(n-1)*(n-2)*(n-3) db lehetséges, de ezek között lehetnek ismétlődők.

A 4 for ciklus:

Az első elem i = 1, ..., n-3. (Ti. ha az (n-3). elemet vesszük, akkor j, k, l már csak az utolsó 3 db elem lehet.)

A második elem: j = i+1, ..., n-2.

A harmadik elem: k = j+1, ..., n-1.

A negyedik elem: l = k+1, ..., n.

5. A kiválasztott elemeket nagyság szerint elteszed egy négyelemű tömmbe.

6. Elvégzed az általad kívánt vizsgálatot és egyéb műveleteket.

7. Ha megfelel a számnégyes, akkor eltárolod egy kimeneti tömmbben.

8. Folytatod a következő számnégyessel.

9. Ha ez a számnégyes egyezik az előzővel, akkor nem tárolod el.

2019. nov. 29. 16:29
Hasznos számodra ez a válasz?
 2/13 A kérdező kommentje:

Ebben mi lehet a hiba?

#include <stdio.h>

#include <stdlib.h>

int main(){

unsigned int darabszam;

scanf("%u",&darabszam);

unsigned int i,j,l,k;

int e=0;

unsigned int *arr=malloc(sizeof(unsigned int)*darabszam);

for (i=0;i<darabszam;i++)

scanf("%u",&arr[i]);



for (i=0; i<darabszam-3; i++)

for (j=1; j<darabszam-2; j++)

for (l=2; l<darabszam-1; l++)

for (k=3; k<darabszam; k++)

if ((arr[l]+arr[j])==(arr[i]+arr[k]))

if (arr[i]>arr[j] && arr[i]>arr[l] && arr[i]>arr[k])

if (arr[k]<arr[l] && arr[k]<arr[j] && arr[k]<arr[i])

e++;

printf("%d\n",e);

return 0;

}

2019. nov. 30. 15:34
 3/13 anonymousreview60 ***** válasza:

Az mindenképpen, hogy így csak egy sorrendben mehetnek bele a számok. Pl. hiába lenne 3,12,8,7, ami átrendezve 3,7,8,12 lenne, ami megfelel. De a 3<12, ami miatt nem felel meg.

Az aktuális 4 számot rendezd nagyság szerint. Utána végezd el rajta a vizsgálatot de ezt írtam korábban.

2019. nov. 30. 20:42
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

Újra kezdtem az egészet, erre jutottam, d emost már végképp nem értem mi a baja

#include <stdio.h>

#include <stdlib.h>

int main()

{

unsigned int szam;

scanf("%d",&szam);

unsigned int i;

unsigned int *b=malloc(sizeof(unsigned int)*szam);

for (i=0; i<szam; i++)

{

scanf("%d",&b[i]);

}

unsigned int *q=malloc(sizeof(unsigned int)*szam);

unsigned int j,y=0,z;

unsigned int szama;

for (i=0; i<szam; i++)

{

szama=1;

for (j=i+1; j<szam; j++)

if (b[i]==b[j])

szama=0;

if (szama==1)

{

q[y]=b[i];

y++;

}

}


unsigned int igen=y;

unsigned int *a=malloc(sizeof(unsigned int)*igen);

for (i=0; i<igen;i++)

a[i]=q[i];

unsigned int tomb[4];


unsigned int csere;

unsigned int darab=0;

for (i=0; i<igen-3; i++)

{ tomb[0]=a[i];

for (j=i+1; j<igen-2; j++)

{ tomb[1]=a[j];

for (y=j+1; y<igen-1; y++)

{ tomb[2]=a[y];

for (z=y+1; z<igen; z++)

{ tomb[3]=a[z];

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

{

for (j = i + 1; j < 4; ++j)

{

if (tomb[i] > tomb[j])

{

csere= tomb[i];

tomb[i]=tomb[j];

tomb[j]=csere;

}}

if (tomb[0]+tomb[3]==tomb[1]+tomb[2])

darab++;

}}}}}

printf("%d\n",darab);

return 0;

}

2019. nov. 30. 21:49
 5/13 anonymousreview60 ***** válasza:
Nincs a közelben C fordító. Ma 19-kor lesz.
2019. dec. 1. 07:00
Hasznos számodra ez a válasz?
 6/13 anonymousreview60 ***** válasza:

Mi a házi határideje?


Érdekes. Ez a kód az 1,2,5,6 számnégyesre eredményül 2-t ad, holott az 1,2,5,6 és a 2,1,6,5 esetet is egyformának kell tekinteni.

Érdemes lenne az összes beolvasott számot egyszerre sorrendbe tenni, és csak utána kiválasztani a számnégyeseket.

Egy számnégyes aztán 24 féleképpen állhat.

2019. dec. 2. 06:24
Hasznos számodra ez a válasz?
 7/13 anonymousreview60 ***** válasza:

Az általad írt fertelmet ésszerűsítettem:

#include <stdio.h>

#include <stdlib.h>


int main()


{


unsigned int szam;

unsigned int i,j,k,l;

unsigned int darab=0;

unsigned int *b;

unsigned int csere;

int cserelni;

unsigned int tomb[4];


/*A beolvasando szamok darabszamanak beolvasasa.*/

printf("A beolvasando szamok darabszama:");

scanf("%d",&szam);


/*Memoriafoglalas a szamoknak.*/

b = calloc(szam,sizeof(unsigned int));


/*A szamok beolvasasa.*/

for (i=0; i<szam; i++)

{

scanf("%d",&b[i]);

}


/*A szamok novekvo sorba rendezese.*/

cserelni = 1;

while(cserelni)

{

for (i=0; i<szam-1; i++)

{

if (b[i]>b[i+1])

{

csere = b[i];

b[i] = b[i+1];

b[i+1] = csere;


}

}


/*A szamok nagysagrendisegenek vizsgalata*/

cserelni = 0; /*Nem kell ujravizsgalni a szamsort, ...*/

for (i=0; i<szam-1; i++)

{

if (b[i]>b[i+1]) /*..., kiveve, ha legalabb 1 esetben 2 olyan egymast koveto szam van, ahol a kisebbik koveti a nagyobbat.*/

{

cserelni = 1;

break;

}

}

}



/*A szamnegyesek vizsgalata.*/

for (i=0; i<szam-3; i++)/*1. elem kivalasztasa.*/

{

tomb[0]=b[i];

for (j=i+1; j<szam-2; j++)/*2. elem kivalasztasa.*/

{

tomb[1]=b[j];

for (k=j+1; k<szam-1; k++)/*3. elem kivalasztasa.*/

{

tomb[2]=b[k];

for (l = k+1; l<szam; l++)/*4. elem kivalasztasa.*/

{

tomb[3]=b[l];


if (tomb[0]+tomb[3]==tomb[1]+tomb[2])/*A feladatbeli osszegzeses ellenorzes*/

{

darab++;/*Ha megfelel, akkor egyel noveljuk a megfelelo szamnegyesek darabszamat.*/

printf("Szamnegyes: %d %d %d %d\n",tomb[0],tomb[1],tomb[2],tomb[3]);/*A megfelelo szamnegyes kiiratasa.*/

}

}

}

}

}


printf("Megfelelo szamnegyesek darabszama: %d\n",darab);

return 0;

}

2019. dec. 2. 11:42
Hasznos számodra ez a válasz?
 8/13 A kérdező kommentje:
Köszönöm szépen a segítséget, tényleg nagon hálás vagyok :) nem lett jó még minfig de innen megrpboálom megoldalni
2019. dec. 2. 13:56
 9/13 anonymousreview60 ***** válasza:
Mi nem megfelelő?
2019. dec. 2. 13:59
Hasznos számodra ez a válasz?
 10/13 A kérdező kommentje:

Például 10 számot kér be az ellenőrzőprogram: 34,87,23,45,34,12,56,12,34,56

3 a helyes válasz de 38at talál

Ha 14et kér be akkor jó, 25,45,32 számnál megint nem jó

2019. dec. 2. 14:16
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!