Chciałbym osiągnąć coś takiego tyle że w C. Napisałem w C coś podobny kod ale nie działa , .
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.
Tablice indeksujesz od zera, zarówno w js jak i w C.
#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;
}
#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
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;
}
Kiedy wprowadzę jakieś liczby to dostaje coś takiego
No czemu to nie działa?
Czytaj warningi kompilatora, a zamiast screenów wrzucaj sformatowany tekst...
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ł.
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?
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ą?
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
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)
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]));
}
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);
}
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
- 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ł. - 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ętlifor
- 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:
- użytkownik wcisnął
Ctrl-D
- zapełnił całą tablice (program zignoruje pozostałe)
- 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ę.
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
@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;
}
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ć.
- 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 kodu0
? 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]);
lubscanf("%d",tabLiczb+i);
Jak widać z powyższego, należy spalić dopóki nie złożyło jaj ... i napisać od nowa!
Że tak powiem błędy początkującego ale dzięki za cenne rady. Każda jest dla mnie cenna na tym etapie nauki