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?
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;
}
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.
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;
}
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.
Ú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;
}
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.
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;
}
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ó
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!