Bagaimana program simulasi yang berhenti dijalankan sebelum atau pada waktu simulasi 24 jam

Terdapat tangki air berukuran 500 galon yang digunakan untuk menampung ikan untuk dijadikan Ikan Goreng dalam waktu 24 jam. Tangki bocor yang kehilangan air dengan laju 10% dari sisa air setiap jam. Bagaimana cara memperbaiki kode saya agar berhenti dijalankan setelah 24 jam atau setelah volume tangki mencapai 100 galon. Untuk beberapa alasan, sepertinya saya tidak bisa memahami loop for.

int main()
{
    double add, gal = 500, vol, newVol, hour;

    printf("Please enter additional water added per hour: ");
    scanf("%f", &add);

    for (int hour = 0; hour <= 24; hour++)
    {
        vol = gal * 0.90 + add;
    }
    printf("The volume is %f gallons after %d hours. \n", &vol, &hour);

}

person intriguedandconfused    schedule 26.03.2019    source sumber
comment
Sederhana: Catat stempel waktu di awal, dan pada interval tertentu, terus periksa stempel waktu.   -  person Sourav Ghosh    schedule 26.03.2019
comment
Tambahkan kondisi di loop Anda untuk memeriksa volumenya juga?   -  person Some programmer dude    schedule 26.03.2019
comment
Tambahkan if (vol >= 100.0) break; ke loop? Walaupun saya kurang paham dengan 100 jika tangkinya berkapasitas 500 galon...   -  person Stefan Becker    schedule 26.03.2019
comment
Atau inisialisasi vol = 0.0 saat dideklarasikan lalu for (int hour = 0; hour <= 24 && vol >= 100; hour++) (dengan asumsi Anda ingin terus menggoreng hingga volume minyak turun di bawah 100 gal - sesuaikan pengujian sesuai kebutuhan) DAN &vol, &hour); seharusnya vol, hour);. (tidak ada tanda '&' untuk dicetak)   -  person David C. Rankin    schedule 26.03.2019
comment
Artinya, Anda tidak cukup mengaktifkan peringatan kompiler. Untuk gcc/clang tambahkan -Wall -Wextra -pedantic ke string kompilasi Anda, untuk VS tambahkan /W3, dan jangan terima kode hingga kode dikompilasi tanpa peringatan.   -  person David C. Rankin    schedule 26.03.2019
comment
Saya mengedit judul untuk berbicara tentang simulasi, karena kode Anda sepertinya tidak menggunakan waktu nyata, dan terlihat seperti simulasi. Jika ini sebenarnya seharusnya menggunakan waktu nyata, silakan putar kembali.   -  person hyde    schedule 26.03.2019
comment
@hyde - Saya pikir Anda aman, tidak ada ikan yang harus diselesaikan pada jam 5:00.   -  person David C. Rankin    schedule 26.03.2019


Jawaban (3)


Ada beberapa masalah dalam program Anda:

  • Anda harus memasukkan <stdio.h>
  • Spesifikasi konversi scanf() untuk tipe double adalah %lf, bukan %f.
  • Anda harus menguji nilai kembalian scanf() untuk menghindari perilaku tidak terdefinisi pada input yang tidak valid.
  • Perulangan diulang 25 kali, bukan 24 kali.
  • ekspresi vol = gal * 0.90 + add; untuk memperbarui volume salah: Anda harus memperbarui gal atau menggunakan vol saja. Selanjutnya, jika air ditambahkan setiap awal jam, seharusnya vol = (gal + add) * 0.90;, tetapi tangki tidak dapat menampung lebih dari 500 galon. Jika air ditambahkan setiap akhir jam, Anda harus menguji apakah airnya mencapai 100 galon sebelum menambahkan air lagi.
  • Anda tidak menguji batas 100 galon
  • format printf salah, begitu pula argumennya: seharusnya printf("The volume is %f gallons after %f hours. \n", vol, hour); atau lebih baik printf("The volume is %f gallons after %d hours. \n", vol, hour); dan hour harus didefinisikan sebagai int.
  • main harus mengembalikan 0.

Ini adalah versi yang telah diperbaiki:

#include <stdio.h>

int main() {
    double add, gal = 500, vol;
    int hour;

    printf("Please enter additional water added per hour: ");
    if (scanf("%lf", &add) != 1) {
        printf("invalid input\n");
        return 1;
    }
    for (vol = gal, hour = 1; hour <= 24; hour++) {
        vol = vol * 0.90;
        if (vol <= 100)
            break;
        /* water is added at the end of each hour */
        vol += add;
        /* the tank cannot hold more than 500 gallons */
        if (vol > gal)
            vol = gal;
    }
    printf("The volume is %f gallons after %d hours.\n", vol, hour);
    return 0;
}

Anda mungkin ingin menghitung waktu yang tepat saat volume turun hingga 100 galon, namun ini lebih rumit.

person chqrlie    schedule 26.03.2019
comment
Di C (menurut saya karena C99), Anda tidak memerlukan return di main, dan jika tidak ada maka diharapkan nilai pengembalian 0. - person hyde; 26.03.2019
comment
@hyde: itu benar untuk C99 dan yang lebih baru, panitia meretas spesifikasi C untuk memastikan kode lama yang ceroboh akan secara implisit mengembalikan 0 jika main keluar tanpa pernyataan return. Menjadikan return 0; implisit ini eksplisit adalah gaya yang bagus. - person chqrlie; 26.03.2019
comment
Bagaimana vol bisa menjadi <= 100 karena di atas vol = gal * 0.90 dan gal konstan dalam loop? Bukankah seharusnya for (vol=gal, hour... dan vol *= 0.9 di bawah? - person Breaking not so bad; 26.03.2019
comment
@RingØ: memang kamu benar! selalu ada satu bug lagi :) - person chqrlie; 26.03.2019
comment
@chqrlie Saya kira itu masalah opini. Dalam C menjadi eksplisit adalah suatu hal (dibandingkan dengan C++ misalnya, di mana konstruktor dapat melakukan jumlah pemrosesan yang tidak diketahui dalam salinan, dll). OTOH, setiap baris yang tidak membawa apa pun ke kode adalah baris yang buruk, hanya kekacauan. Saya pikir solusi yang tepat adalah mengubah tipe pengembalian menjadi void main(), karena itu diperbolehkan di C (IIRC). - person hyde; 26.03.2019
comment
@hyde: void main() tidak diizinkan oleh Standar C. Eksplisit return 0; berarti mengembalikan kesuksesan ke lingkungan eksekusi. Membuat beberapa hal implisit menjadi eksplisit adalah masalah gaya dan kejelasan IMHO. Misalnya char *p = NULL; lebih disukai daripada char *p = 0; yang setara tetapi kurang eksplisit. - person chqrlie; 30.03.2019
comment
@chqrlie Setelah beberapa googling, tampaknya standar C memungkinkan implementasi tanda tangan utama yang ditentukan (tidak seperti C++, saya yakin). Ini mungkin yang saya ingat. Tapi itu tidak penting, karena barang-barang yang melanggar portabilitas jelas tidak boleh digunakan tanpa alasan yang kuat. - person hyde; 30.03.2019
comment
@hyde: C19 5.1.2.2.1 Startup program Fungsi yang dipanggil saat startup program diberi nama main. Implementasinya menyatakan tidak ada prototipe untuk fungsi ini. Ini harus didefinisikan dengan tipe pengembalian int dan tanpa parameter: int main(void) { /* ... */ } atau dengan dua parameter (disebut di sini sebagai argc dan argv, meskipun nama apa pun dapat digunakan, karena nama tersebut bersifat lokal pada fungsi yang dideklarasikan): int main(int argc, char *argv[]) { /* ... */ } atau setara atau dengan cara lain yang ditentukan implementasi. - person chqrlie; 30.03.2019
comment
Implementasi lain yang ditentukan dengan cara biasanya mengacu pada penambahan argumen ketiga pada sistem unix seperti: int main(int argc, char **argv, char** envp) {...}. Saya tidak dapat memikirkan lingkungan C mana pun yang void main() akan menyebabkan masalah, namun tetap saja itu salah. - person chqrlie; 30.03.2019

Sepengetahuan saya, ini hanya simulasi saja, tidak perlu real time.

Cukup tambahkan baris:

if (vol <= 100) break;

Jadi itu keluar dari loop for.

Sebagai tambahan, pasti ada kesalahan lain dalam kode Anda. Misalnya, vol akan selalu bernilai sama. Juga variabel Anda hour yang digunakan untuk loop for tidak sama dengan yang Anda gunakan di luar (misalnya di printf). Anda harus melakukan sesuatu seperti itu untuk membuatnya berfungsi:

vol = gal
for (hour = 0; hour <= 24; hour++)
{
    vol = vol * 0.90 + add;
    if (vol <= 100) break;
}
person Puck    schedule 26.03.2019

Anda dapat menggunakan fungsi gettimeofday(), untuk mendapatkan waktu awal (saat proses dimulai) dan kemudian menggunakan gettimeofday() berulang kali untuk mendapatkan waktu saat ini. Ketika perbedaan antara waktu saat ini dan waktu awal adalah 24 jam, putuskan perulangan.

Untuk referensi, periksa http://man7.org/linux/man-pages/man2/gettimeofday.2.html

person Shrishty Deorari    schedule 26.03.2019
comment
Ya -- ya, tetapi perulangan hour = 0; hour <= 24; ... melakukannya berdasarkan jumlah perulangan :) - person David C. Rankin; 26.03.2019
comment
Saya rasa pertanyaannya bukan tentang menunggu 24 jam sebenarnya, melainkan menjalankan simulasi secepat yang dijalankan, jadi gettimeofday tidak berguna. - person hyde; 26.03.2019