[C] Sumowanie liczb w tablicy jednowymiarowej

Gouranga
Użytkownik
Użytkownik
Posty: 1596
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Gouranga »

gotowiec, dopisz tylko wczytywanie danych, printfy itd.

Kod: Zaznacz cały

int n;
// podaj n
int arr[n];
// wypełnij tablicę arr liczbami
int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
int i;
ps[0] = 0;
ss[n-1] = 0;
for (i=1; i<n; i++){
  ps[i] = ps[i-1] + arr[i-1];
  ss[n-1-i] = ss[n-i] + arr[n-i];
}
int index = -1;
for (i=0; i<n; i++){
  index = ps[i] == ss[i] ? i : index;
}
if (index == -1) nie ma takiej liczby 
else wypisz arr[index]
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

moglbym prosic o jakies dodatkowe opisy - bardziej szczegolowe do poszczegolnych funkcji? co kiedy sie dzieje i co, co robi (lopatologicznie). jestem kompletnie zielony a bd musial zdac dosc szczegolowa relacje z tego jak pisalem program w czasie kolokwium. bd bardzo wdzieczny-- 4 sty 2015, o 15:02 --i czy nie jest to zbyt zaawansowane rozwiązanie jak na pierwszy semestr?
Gouranga
Użytkownik
Użytkownik
Posty: 1596
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Gouranga »

nie jest zaawansowane
masz tablicę arr o wymiarze n wypełnioną liczbami
dajmy na ten przykład takie dane:
n = 5
arr = [7,4,5,0,2]
tworzymy tablicę ps i jej pierwszy element zerujemy:
ps = [0, , , , ]
oraz ss z ostatnim zerowym:
ss = [ , , , ,0]
teraz chodzi o to, że ps to suma wszystkiego co jest przed arr
czyli przed pierwszym elementem jest 0 (z treści zadania)
analogicznie z sumą ss za ostatnim
teraz mamy pętlę po i od 1 do n-1 włącznie
i rozpisujemy jej obroty:
i=1:
ps[1] = ps[0] + arr[0]; czyli na ps[1] przypisz poprzedni ps i dopisz wartość z tablicy, na ps[1] będzie 0+7 = 7 czyli suma wszystkiego przed arr[1]
analogicznie
ss[5-1-1] = ss[5-1] + arr[5-1] czyli na ss[3] (przedostatni) przypisz ss[4] (ostatni) + wartość ostatniego z tablicy
i = 2:
ps[2] = ps[1] + arr[1] czyli ps[2] = 7+4 = 11
ss[5-2-1] = ss[5-2] + arr[5-2] czyli ss[2] = 2 + 0 (ss[3] + arr[3])

tak się zapełniają na raz obie tablice z sumami
potem masz pętlę, która leci po całej tablicy i sprawdza już z gotowych tablic, czy w danym miejscu suma po lewej jest równa sumie po prawej
z tym indexem to taka sztuczka, że ustawiasz na początku niedorzeczną wartość np. -1 i jak ona przejdzie to wiesz, że się nic nie znalazło
ta linia:

Kod: Zaznacz cały

index = ps[i] == ss[i] ? i : index
jest trochę uproszczonym ifem, jak nie chcesz, żeby podpadło że ktoś ci to pisał zamień ją na:

Kod: Zaznacz cały

if (ps[i] == ss[i]) index = i;
no i potem jak nie ma -1 to jest sensowna wartość i można ją wyświetlić

dla naszego przykładu:
arr = [7,4,5,0,2]
ps = [0,7, 11,16,16]
ss = [11,7,2,2,0]
zauważ, że w obu drugi element jest taki sam, więc na końcu index == 1 i arr[1] == 4 i to zwróci program
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

nie kompiluje mi tego (błąd: C:Users710DesktopcMakefile.win [Build Error] [Projekt2.exe] Error 1 ) oraz czy to wlasciwy sposob scanf

Kod: Zaznacz cały

("%d",&arr); // wypełnij tablicę arr liczbami
- 12 linijka

Kod: Zaznacz cały

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

int main(int argc, char *argv[])
{
    
int n;
printf ("podaj wielkosc tablicy");
scanf ("%d",&n); // podaj n
int arr[n];
printf ("podaj liczby do tablicy");
scanf ("%d",&arr); // wypełnij tablicę arr liczbami
int ps[n], ss[n]; // ps - prefix-sum, ss - sufix-sum
int i;
ps[0] = 0;
ss[n-1] = 0;
for (i=1; i<n; i++){
  ps[i] = ps[i-1] + arr[i-1];
  ss[n-1-i] = ss[n-i] + arr[n-i];
}
int index = -1;
for (i=0; i<n; i++){
  index = ps[i] == ss[i] ? i : index;
}
if (index == -1) // nie ma takiej liczby 
{
printf ("nie ma takiej liczby");
}
else
{
printf ("arr[index]");    
    } // wypisz arr[index]
    


system("PAUSE");	
return 0;
}
Gouranga
Użytkownik
Użytkownik
Posty: 1596
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Gouranga »

bo nie można tak robić
musisz wypełnić tablicę tak:

Kod: Zaznacz cały

int i;
for (i=0; i<n; i++) scanf("%i", &arr[i]);
bo jest konflikt typów, %d (%i) odpowiada za typ int a zmienna arr jest typu int*
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

a do czego służy %i?
Gouranga
Użytkownik
Użytkownik
Posty: 1596
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Gouranga »

%i i %d to to samo - format dla zmiennych typu int, chodzi tylko i wyłącznie o kwestie przyzwyczajenia do nazewnictwa - i to integer, d to decimal, ja wolę używać %i bo jednoznacznie się kojarzy z typem int
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Vardamir »

Zmień IDE na jakieś z tego tysiąclecia, Dev jest przestarzały i słaby
jabluszko pisze:a do czego służy %i?
Może zacznij od jakiegoś podstawowego kursu, ale nie przeglądnij go, tylko przeczytaj ze zrozumieniem. Na tej zasadzie, każda rzecz będzie 'zaawansowana' i 'trudna'. Natomiast cytowanie tutaj stron poświąconych tym zagadnieniom mijają się z celem.
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

przerobilem juz jakies tam drobne kursiki. tak jak piszesz kazda rzecz na razie jest dla mnie zaawansowana i trudna. nasz prowadzący zalecił nam korzystanie z dev. z niego rowniez korzystamy na uczelni-- 4 sty 2015, o 18:54 --czy moglbys mi podac wersje kodu z wczytywaniem danych? kompletnie sb nie radze..
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Vardamir »

W takim razie nic z nich nie zrozumiałeś, przeczytaj jeszcze raz.

Tu jest opisane w prosty sposób jak obsługiwać wejście/wyjście:
... j.C5.9Bcia
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

zaden kod nie chce mi sie skompilowac. nawet to

Kod: Zaznacz cały

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

int main(int argc, char *argv[])
{
  
  system("PAUSE");	
  return 0;
}
log
Kompilator: Default compiler
Building Makefile: "C:Users710DesktopcprojektXMakefile.win"
Wykonywanie make...
make.exe -f "C:Users710DesktopcprojektXMakefile.win" all
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"

gcc.exe main.o -o "ProjektX.exe" -L"C:/Dev-Cpp/lib"

gcc.exe: Internal error: Aborted (program collect2)
Please submit a full bug report.
See <url:> for instructions.

make.exe: *** [ProjektX.exe] Error 1

Wykonanie zakończone

caly czas wyskakuje build error. dlaczego tak sie dzieje?
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Vardamir »

Po pierwsze korzystaj z takiego szablonu:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
   
return 0;
}
bez żadnych argumentów dla main i tego okropnego system("PAUSE").

Odnośnie błędu który się pojawia:

Dev korzysta ze starej wersji kompilatora MinGW, ten błąd wskazuje, że nie może odnaleźć plików kompilatora lub są one nieaktualne.

Spróbuj zaktualizować MinGW do wersji co najmniej 4.2.2 bo wcześniejsze sprawiają problemy na systemach nowszych niż XP.

Albo zastanów się nad innym IDE, to już nawet CodeBlocks są lepszym od Dev choć również niepolecanym środowiskiem. Ewentualnie rozważ pracowanie na cyngwin+Clion (albo innym sensownym), ale to jeśli Ci zależy na nauczeniu się programowania.
Gouranga
Użytkownik
Użytkownik
Posty: 1596
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: Gouranga »

Vardamir, używanie int main() jest niezalecane, jak już to int main(void) jest dobre
jabluszko
Użytkownik
Użytkownik
Posty: 39
Rejestracja: 3 sty 2015, o 18:55
Płeć: Mężczyzna
Lokalizacja: WW
Podziękował: 15 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jabluszko »

wykladowca kaze pracowac na tym ide. na poczatku wole sie trzymac jego wytycznych. zainstalowalem wersje orwellowska deva i wszystko smiga.

-- 6 sty 2015, o 17:15 --

przy wielkosci tablicy 5 i liczbach 1,2,3,3,0 krzyczy ze nie ma takiej liczby a powinien podac ta srodkowa trojke bo sumy liczb po jej lewej oraz prawej stronie sa takie same. 0+1+2=3 i 3+0+0=3

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
 
int main()
  {
   unsigned n;
   printf ("podaj wielkosc tablicy :");
   scanf ("%u",&n); // podaj n
   int *arr=(int*)malloc(n*sizeof(int));
   printf ("podaj liczby do tablicy:
");
   int i,sum=0,half=0,value;
   for(i=0;i<n;sum+=arr[i++]) scanf ("%d",&arr[i]);
   for(i=0;(i<n)&&(half<sum);half+=value,sum-=value,++i) value=arr[i];
   if(half==sum) printf("sum(0..%d)=sum(%d..%d)=%d
",i-1,i,n-1,half);
   else printf("nie ma takiej liczby
");
   //system("PAUSE");
   return 0;
  }
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C] Sumowanie liczb w tablicy jednowymiarowej

Post autor: jarzabek89 »

Kod: Zaznacz cały

for(i=0;i<n;sum+=arr[i++]) scanf ("%d",&arr[i]);
Czym się kierowałeś pisząc to?
ODPOWIEDZ