UÂżytkownik
Rozwiązanie mam nadzieję, że jest dobre...
Było parę wersji dotyczących tego, co ten program ma w zasadzie robić, więc napiszę lepiej co robi ten, żeby wątpliwości nie było :]
Szuka takiego ciągu o dowolnej długości w tablicy nSize elementowej, dla którego suma wyrazów jest największa...
#include <iostream>
#include <conio.h>
#include <ctime>
using namespace std;
const unsigned int MAX = 100; // maksymalny rozmiar tablicy
void vInsert(int[], int, int, int);
void vShowTable(int[], int);
void vSearch(int[], int);
int main()
{
int aTable[MAX] = {0};
int nSize;
do {
cout << "Podaj rozmiar tablicy [1 - " << MAX << "]: ";
cin >> nSize;
} while ((nSize < 1) || (nSize > MAX));
vInsert(aTable, nSize, -20, 20); // wypełnienie tablicy losowymi liczbami od -20 do 20
vShowTable(aTable, nSize);
vSearch(aTable, nSize); // wyszukanie ciagu o najwiekszej sumie elementow
getch();
return 0;
}
void vInsert(int aTable[], int nSize, int nMin, int nMax)
{
srand(time(NULL));
for (int i = 0; i < nSize; ++i)
aTable[i] = (rand() % (nMax - nMin + 1)) + nMin;
}
void vShowTable(int aTable[], int nSize)
{
for (int i = 0; i < nSize; ++i)
cout << aTable[i] << "\t";
cout << endl << endl;
}
void vSearch(int aTable[], int nSize)
{
int nSuma = 0;
int nSumaMax = nSuma, nIndexStart = 0, nIndexStop = 0;
for (int i = 0; i < nSize; ++i)
{
for (int j = i; j < nSize; ++j)
{
nSuma += aTable[j];
if (nSuma > nSumaMax)
{
nSumaMax = nSuma;
nIndexStart = i;
nIndexStop = j;
}
}
nSuma ^= nSuma;
}
cout << "Suma: " << nSumaMax << endl;
cout << "Start: " << nIndexStart << ", stop: " << nIndexStop;
}
Offline
UÂżytkownik
Z tego co ja słyszałem to program miał wyszukiwać trzech kolejnych liczb w tablicy których suma jest najwieksza, oraz miał wypisać indeksy tych elementów. Jeżeli zdażyło by sie ze w tablicy jest pare trójek o jednakowej <najwiekszej> sumie to wypisać je wszystkie. poniżej moje rozwiązanie:
#include <iostream> using namespace std; /*******funkcja obliczająca sume trzech kolejnych elementów tablicy, od indeksu (miejsce) *******/ int suma (int tab[], int miejsce) { int a=0; for (int i=0;i<3;i++) a+=tab[miejsce+i]; return(a); } int main() { int il,tab[999],najw,adr[999],wsk=0; cout << "ile liczb? "; cin >> il; for (int i=0;i<il;i++) //w petli wprowadzamy dane {cout<< "podaj liczbe nr "<<i+1<<": "; cin >>tab[i]; } najw=suma(tab,0); //zmienna najw bedzie miec wartosc najwiekszej sumy 3 kolejnych adr[0]=0; // elementów. Na początek podkładam pod nią sumę pierwszych 3el. for (int k=1; k<(il-2); k++) //tablica adr bedzie przechowywac indeksy pierwszych el. najwiekszych trójek { //w tej petli sprawdzam każdą kolejną trójkę (bez pierwszej) czy jej suma nie jest int pom=suma(tab,k); // wieksza. Pom to zmienna przechowująca sume trzech sprawdzanych elem. if (pom>najw) // jezeli jest to: { najw=pom; //zmiennej najw przypożadkowuje teraz tą wiekszą wartość adr[0]=k; //tablice znakow zaczynam zapelniac od początku. otrzymuje wartosc indeksu pierw wsk=0; //elementu. wsk to zmienna która pokazuje w którym miejscu adr jestem } else { if (pom==najw) //jeżeli suma jest równa najwiekszej { wsk++; //przechodze na kolejne miejsce w adr adr[wsk]=k; //wpisuje kolejny indeks pierwszego elementu } } } cout <<"najwieksza suma to: "<<najw; //po przejsciu powyższej pętli najw ma oczywiście wartość najwiekszej cout <<"\nindeksy najwiekszych sum: \n"; //sumy. for (int u=0;u<=wsk;u++) // w tej petli wypisywane sa indeksy elementow. adr[u] to indeks { //pierwszego el z danej trójki cout << adr[u]<<", "<<adr[u]+1<<", "<<adr[u]+2<<"\n"; } system("pause"); }
Ostatnio edytowany przez Mateusz_Frąckowiak (2008-01-15 21:49:30)
Offline
UÂżytkownik
poniżej zamieszczam dwa programiki, które zrobiłem w tym tyg (program zaliczeniowy z poniedziałku i nasz zaliczeniowy). nie gwarantuje, że nie ma tam błędów (w razie czego to mam jeszcze drugą wersję naszego programu zaliczeniowego wyświetlający w inny sposób te liczby ale działającego na identycznej zasadzie)
na ftp zamieściłem wszystkie swoje programy
to jest moje sumowanie:
#include<iostream>
#include<conio.h>
using namespace std;
main()
{
int x=101, temp, temp1, temp2, suma=0, k, l=0, jaja=0;
while(x>100)
{
if(jaja>=2)cout<<"jaja sobie robisz, czy do 100 liczyc nie umiesz?\n";
cout<<"podaj rozmiar tablicy nie wiekszy niz 100: ";
cin>>x;
jaja++;
}
int tab[x];
for(int i=0;i<x;i++)
{
cout<<"wprowadz element tablicy nr "<<i<<" = ";
cin>>tab[i];
}
temp=tab[0]; //temp jest początkowo równy pierwszemu elementowi tablicy i przechowuje największą wart
temp1=0; // zakres od
temp2=0; // zakres do
for(int j=1; j<=x; j++) // j- ilość liczb, które mam sumować
{
for(int i=0; i<x; i++) // i- pozycja sumowanej liczby (tutaj przesuwanie o 1 pozycję w tablicy w prawo)
{
k=i; // k - licznik zastępujący i, żeby po wykonaniu wewnętrznej pętli spowrotem powrócić do wart generowanej przez zewnętrzną pętlę
for(i, l=0; i<j; i++, l++) // i - l- liczniki sumowań liczb (i nie większe niż j)
{
suma+=tab[i];
if(temp<suma)
{
temp=suma;
temp1=j-1-l;
temp2=j-1;
}
}
i=k;
suma=0;
}
suma=0;
}
cout<<endl<<"najwieksza suma = "<<temp<<" znajdujaca sie w komorkach tablicy od nr "<<temp1<<" do "<<temp2<<endl;
getch();
}
a to jest nasze zaliczenie:
#include<iostream.h>
#include<conio.h>
#include<math.h>
using namespace std;
void binarna(int tab[], int przesile);
/******************************************************************************/
int main()
{
int tab[4], przesile;
for(int i=0;i<4;i++)
{
cout<<"wprowadz element tablicy nr "<<i<<" = ";
cin>>tab[i];
}
cout<<endl<<"wprowadz wartosc przesuniecia bitowego: ";
cin>>przesile;
binarna(tab, przesile);
getch();
return 0;
}
/******************************************************************************/
/******************************************************************************/
void binarna(int tab[], int przesile)
{
int temp[128], temp1[128], a=1, temp2[4]={0,0,0,0};
/*1**************************************/
cout<<endl<<"Wyswietlenie postaci dziesietnej czterech podanych liczb:"<<endl;
for(int i=0;i<4;i++)
{
cout<<"element tablicy nr "<<i<<" = "<<tab[i]<<endl;
}
/*2**************************************/
for(int j=0; j<=3; j++)
{
for(int i=(j*32); i<=32*(j+1); i++)
{
temp[i]=tab[j]%2;
tab[j]/=2;
}
}
cout<<endl<<"Wyswietlenie postaci binarnej czterech podanych liczb w tablicy 128 bitowej:"<<endl;
for(int i=127;i>=0;i--)
{
cout<<temp[i];
if(i==32) cout<<" ";
if(i==64) cout<<" ";
if(i==96) cout<<" ";
}
cout<<endl;
/*3**************************************/
for(int i=127; i>=przesile; i--)
{
temp1[i-przesile]=temp[i];
}
for(int i=0; i<=przesile; i++)
{
temp1[128-przesile+i]=temp[i];
}
cout<<endl<<"Wyswietlenie po przesunieciu cyklicznym w postaci binarnej czterech podanych liczb w tablicy 128 bitowej:"<<endl;
for(int i=127;i>=0;i--)
{
cout<<temp1[i];
if(i==32) cout<<" ";
if(i==64) cout<<" ";
if(i==96) cout<<" ";
}
cout<<endl;
/*4**************************************/
for(int j=0; j<=3; j++)
{
for(int i=(j*32); i<=32*(j+1); i++)
{
if(temp1[i]==1)
{
for(int k=0; k<=i-(32*j); k++)
{
a*=2;
if(k==0)a=1;
}
temp2[j]+=a;
a=1;
}
}
}
cout<<endl<<"Wyswietlenie po przesunieciu cyklicznym w postaci dziesietnej czterech podanych liczb:"<<endl;
for(int i=0;i<4;i++)
{
cout<<"element tablicy nr "<<i<<" = "<<temp2[i]<<endl;
}
}
/******************************************************************************/
Ostatnio edytowany przez Frodo (A. Gorgolewski) (2008-01-17 21:52:05)
Offline