Przypisanie elementów do tablicy

0

Chciałbym osiągnąć coś takiego screen1.png tyle że w C. Napisałem w C coś podobny kod ale nie działa screen2.png, screen3.png.

2
printf("%d", tablicaLiczb);

Nie robi tego co oczekujesz.
To wyświetla kawałek adresu tej tablicy.
Dodaj do kompilatora flagi -Wall -Wextra -Werror a kompilator wszystko ci wyjaśni.

3

Tablice indeksujesz od zera, zarówno w js jak i w C.

0
#include <stdio.h>
int main()
{

int i;
int tab[10];
for(i = 0; i<10;i++)
{
    //wpisujesz liczby do tab[i]
}
for(i = 0; i<10;i++)
{
    //wypisujesz tab[i]
}
return 0;

}
0
#include<stdio.h>
#include<stdlib.h>
int main()
{
   int tablicaLiczb[10];
   int liczby;
   int i;
   printf("Podaj 10 liczb);
   for(i = 0; i < 10; i++)
   {
      scanf("%d", &liczby);
      tablicaLiczb[i] = liczby;
   }
   printf("Te liczby to:%d", tablicaLiczb);
  return 0;
}

Po skompilowaniu tego kodu wyświetla mi się dziwna wartość 6422000. Co to za wartość?

Dobra już działa dzięki

0

A gdybym chciał policzyć średnią arytmetyczną. Napisałem taki kod ale nie działa

#include<stdio.h>
#include<stdlib.h>
int main()
{
int tablicaLiczb[5];
    int liczby;
    int i;
    int wynik = 0;
    printf("Podaj liczby\n");
    for(i = 0; i < 5; i++)
    {
        scanf("%d", &liczby);
        tablicaLiczb[i] = liczby;
    }
    for(i = 0; i < 5; i++)
        {
            printf("%d", tablicaLiczb[i]);
        }
    for(i = 0; i < sizeof(tablicaLiczb) / sizeof(tablicaLiczb[0]); i++)
        {
            wynik = wynik + tablicaLiczb[i] / sizeof(tablicaLiczb) / sizeof(tablicaLiczb[0]);
            printf("%d", &wynik);
        }
    return 0;
}

napisałem co prawda ale nie działa
chciałbym uzyskać to samo co w JS

let tablicaLiczb = [];
undefined
let liczby;
let wynik = 0;
for(let i = 0; i < 5; i++){
    liczby = Number(prompt("Podaj 5 liczb"));
    tablicaLiczb.push(liczby);
    console.log(liczby);
}
for(let i = 0; i < tablicaLiczb.length; i++){
    wynik = wynik + tablicaLiczb[i] / tablicaLiczb.length;
}

JS.png

0

Kiedy wprowadzę jakieś liczby to dostaje coś takiego screen.png

No czemu to nie działa?

0

Czytaj warningi kompilatora, a zamiast screenów wrzucaj sformatowany tekst...

0

warninigi warnignami ale naucz się używać debuggera żeby obserwować przebieg programu krok po kroku.
do codeblocks

co do średniej w C
https://stackoverflow.com/questions/44043617/arithmetic-average-of-an-array-with-range-5-to-5-in-c
możesz poczytać zobaczyć i przemyśleć. Bo ja tu widzę aż 3 pętle for. Czy są pogrzebne aż 3? bym się zastanowił.

0

Czuje się zakłopotany. Mam mianowcie 2 kody:

#include<stdio.h>
#include<math.h>
int main()
{
    double tabLiczb[3];
    int liczby;
    int i;
    double wynik = 0.0;
    printf("Podaj 3 liczby\n");
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        scanf("%d", &liczby);
        tabLiczb[i] = liczby;
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }
    printf("%f", wynik);
}

co w efekcie zwraca mi taki wynik

1.0000002.0000003.0000002.000000

a jak mam taki kod

#include<stdio.h>
#include<math.h>
int main()
{
    double tabLiczb[5];
    int liczby;
    int i;
    double wynik = 0.0;
    printf("Podaj 5 liczb\n");
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        scanf("%d", &liczby);
        tabLiczb[i] = liczby;
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }
    printf("%f", wynik);
}

dostaje prawidłowy wynik

4.000000.

Co się konkretnie dzieje. Już wiem że problematyczna jest ta pętla

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }

pytanie tylko dlaczego?

0

Czyżby te 2 pętle

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }

jakoś kolidowały ze sobą?

0
piotrek1998 napisał(a):

Czuje się zakłopotany. Mam mianowcie 2 kody:

        printf("%f", tabLiczb[i]); // <- brakuje spacji po f

co w efekcie zwraca mi taki wynik

1.0000002.0000003.0000002.000000

ze spacją powinno być ok

1.000000 2.000000 3.000000 2.000000

[...]

dostaje prawidłowy wynik

4.000000.

trudno ocenić czy wynik jest prawidłowy bez podania danych wejściowych

0

W pierwszej pętli jak i drugiej dostajesz prawidłowy wynik.

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }

To w żaden sposób ze sobą nie koliduje. Zwyczajnie w pierwszej pętli wypisujesz to co wpisałeś do tablicy stąd output 1.02.03.02.0 (pierwsze 3 liczby to twoje wpisane wartości zaś ostatnia to średnia arytmetyczna)

W drugim programie gdzie podajesz 5 liczb usunąłeś pętle wypisującą liczby z tablicy

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }

co też powoduje, że twój jedyny output to średnia arytmetyczna (w twoim przypadku 4.0)

0

Czyli w tym przypadku

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]);
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }

nie działa ta pętla?

    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }
1

Rozumiem, że chcesz program który pobiera dane od użytkownika, liczy średnią i ją wyświetla? Nie widzę w twoim kodzie błędnego działania poza niepoprawnym wyświetlaniu tablicy, ale poprawiłbym kilka rzeczy:

#include<stdio.h>
#include<math.h>
int main()
{
    // osobiście deklarowałby zmienne bliżej ich użycia, no chyba że nauczyciel tak sobie życzy
    double tabLiczb[3];
    int liczby;
    int i;  // <- mamy 21 wiek i w C możemy definiować zmienną w pętli for
    double wynik = 0.0;
    printf("Podaj 3 liczby\n");
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)  // sizeof wprowadza trochę szumu w kodzie i ja bym to zastąpił makrem albo jakimś const-em
    {
        scanf("%d", &liczby);  // <- wprowadzasz całkowite a można od razu zmienno-przecinkowe do tablicy
        tabLiczb[i] = liczby;
    }
// poniżej wyświetlasz całą tablice co jest nie potrzebne bo widać je wcześniej jak wstukałeś je w klawiaturze
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        printf("%f", tabLiczb[i]); // <- zapomniałeś spację w napisie i wszystkie liczby się zlewają ze sobą
    }
// poniżej obliczanie średniej
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0])); // dzielenie wywal poza pętlę for
    }
    printf("%f", wynik);
}

twój kod można by znacznie uprościć:

#include<stdio.h>
#include<math.h>

#define TABSIZE 3

int main()
{
    double tabLiczb[TABSIZE];
    double suma = 0.0;
    printf("Podaj %d liczby\n", TABSIZE);
    for(int i = 0; i < TABSIZE; i++) {
        scanf("%lf", &tabLiczb[i]);
        suma += tabLiczb[i];
    }

    printf("wprowadzone liczby: ");
    for(int i = 0; i < TABSIZE; i++) {
        printf("%f ", tabLiczb[i]);
    }

    printf("\nsrednia = %f\n", suma / TABSIZE);
}
0

Dobra A co jakbym chciał dać użytkownikowi możliwość wpisania dowolnej ilości liczb do tablicy. Nie deklarować na sztywno że ma wpisać 5, 10 itd. Tylko tyle ile chce

0
  1. stwórz tablice z np. 1000 elementów, wyświetl użytkownikowi, że ma maksymalną ilość oraz że wprowadzanie się kończy np. zerem lub ujemną wartością pod warunkiem, że takich wartości nie przyjmujemy. Następnie w pętli do while wprowadź liczbę i sprawdzaj czy znacznik końca nastąpił.
  2. kolejna metoda to pobranie na początku ilości elementów od użytkownika i stworzenie dynamicznej tablicy używając funkcji malloc/free. Dalej to wczytywanie w pętli for
  3. Możesz sprawdzać czy nastąpił koniec strumienia feof(stdin) np:
#include <stdio.h>
#include <unistd.h>

#define MAXTABSIZE 5

int main(int argc, char* argv[]) {

    double tab[MAXTABSIZE];

    if (isatty(fileno(stdin))) { // drukuj prompt gdy wejście jest terminalem
        printf("wprowadz max %d elementow\n", MAXTABSIZE);
    }
    int size = 0;
    while (!feof(stdin) && size < MAXTABSIZE) {
        scanf("%lf", &tab[size++]);
    }
    if (feof(stdin)) {
        size = size-1; // korekta
    }

    printf("wprowadzono %d liczb: ", size);
    for (int j = 0; j < size; j++) {
        printf("%lf ", tab[j]);
    }
    printf("\n");

    return 0;
}

program kończy wprowadzania liczb w przypadku:

  1. użytkownik wcisnął Ctrl-D
  2. zapełnił całą tablice (program zignoruje pozostałe)
  3. przy przekierowaniu pliku $ ./srednia < dane.txt gdy wczytał wszystkie dane z pliku ale nie więcej niż wielkość tablicy

Możesz się bawić z funkcją realloc, żeby zwiększać dynamicznie wielkość tablicy tak jak to robi push_back w kontenerze std::vector w c++, ale czasami w danych wejściowych pierwszą liczbą jest wielkość tablicy co znacznie upraszcza sprawę.

0

Konkretnie chodzi mi o coś takiego(tylko to jest kod w JS), a teraz chce przełożyć to na C

let tablicaLiczb = [];
let liczby;
let wynik = 0;
let n;
n=prompt("Ile liczb chcesz wprowadzić");
for(let i = 0; i < n; i++){
    liczby=Number(prompt("Podaj te liczby"));
    tablicaLiczb.push(liczby);
    console.log(liczby);
for(let i = 0; i < tablicaLiczb.length; i++){
    wynik = wynik + tablicaLiczb[i] / tablicaLiczb.length;
}
4
console.log(tablicaLiczb);
Array(5) [ 6, 4, 2, 4, 4 ]
console.log(wynik)
4
1

@piotrek1998: to trzeba użyć malloc i realloc oraz pamiętać pojemność tablicy oraz ilość elementów, np. tak:

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

int main(int argc, char* argv[]) {
    int capacity = 2;
    double* tab = (double*)malloc(capacity * sizeof(double));

    int size = 0;
    while (!feof(stdin)) {
        if (size >= capacity) {
            capacity *= 2;
            printf("realloc to %d\n", capacity); // 
            tab = (double*)realloc(tab, capacity * sizeof(double));
        }
        scanf("%lf", &tab[size++]);
    }
    if (feof(stdin)) {
        size = size - 1;
    }

    printf("wprowadzono %d liczb: ", size);
    for (int j = 0; j < size; j++) {
        printf("%lf ", tab[j]);
    }
    printf("\n");

    return 0;
}
0

No dobrze ale czy możemy opierać się na moim kodzie

#include<stdio.h>
#include<math.h>
int main()
{
    double tabLiczb[5];
    int liczby;
    int i;
    double wynik = 0.0;
    printf("Podaj 5 liczb\n");
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        scanf("%d", &liczby);
        tabLiczb[i] = liczby;
    }
    for(i = 0; i < sizeof(tabLiczb) / sizeof(tabLiczb[0]); i++)
    {
        wynik = wynik + tabLiczb[i] / (sizeof(tabLiczb) / sizeof(tabLiczb[0]));
    }
    printf("%f", wynik);
}

Nie chce bezmyślnie kopiować od kogoś. To jest kod początkującego i na nim chce się bazować.

1
  • Czemu nie chcesz użyć operatora +=?
  • Czemu dzielisz każdy element przez rozmiar zamiast zrobić to jeden raz na końcu?
  • Czemu używasz i++? http://forum.4programmers.net/1101404
  • Czemu twój main() nie zwraca kodu 0 ? Owszem per..nia na temat co niektórych standardów ale ta sama odpowiedź co wyżej!
  • Czemu wynik sizeof(tabLiczb) / sizeof(tabLiczb[0]) nie obliczysz tylko raz co najmniej dla skrócenia kodu?
  • Po kiego ci zmienna liczby? scanf("%d",&tabLiczb[i]); lub scanf("%d",tabLiczb+i);

Jak widać z powyższego, należy spalić dopóki nie złożyło jaj ... i napisać od nowa!

0

Że tak powiem błędy początkującego ale dzięki za cenne rady. Każda jest dla mnie cenna na tym etapie nauki

1 użytkowników online, w tym zalogowanych: 0, gości: 1