Chciałbym osiągnąć coś takiego tyle że w C. Napisałem w C coś podobny kod ale nie działa
,
.
- screen3.png (86 KB) - ściągnięć: 30
- screen4.png (83 KB) - ściągnięć: 6
- screen1.png (50 KB) - ściągnięć: 13
- screen2.png (83 KB) - ściągnięć: 56
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.
#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?
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
do while
wprowadź liczbę i sprawdzaj czy znacznik końca nastąpił.malloc/free
. Dalej to wczytywanie w pętli for
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:
Ctrl-D
$ ./srednia < dane.txt
gdy wczytał wszystkie dane z pliku ale nie więcej niż wielkość tablicyMoż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ć.
+=
?i++
? http://forum.4programmers.net/1101404main()
nie zwraca kodu 0
? Owszem per..nia na temat co niektórych standardów ale ta sama odpowiedź co wyżej!sizeof(tabLiczb) / sizeof(tabLiczb[0])
nie obliczysz tylko raz co najmniej dla skrócenia kodu?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!
i
w pętli for
C98
...
Że tak powiem błędy początkującego ale dzięki za cenne rady. Każda jest dla mnie cenna na tym etapie nauki