Çözüldü C dilinde kalori hesaplama

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

aLLii

Decapat
Katılım
26 Ocak 2022
Mesajlar
5
Daha fazla  
Cinsiyet
Erkek
Bir büfede satılan tüm yiyeceklerin bir porsiyonunun ve içeceklerin bir bardağının kalori miktarları "kalori.txt" dosyası içinde saklanmaktadır. Sipariş veren müşterinin istediği n adet sipariş ve porsiyon miktarları "siparis.txt" dosyasına kaydedilmiştir. Buna göre sipariş dosyasındaki siparişi verilen ürünlerin toplam kalorisi hesaplanarak ekrana yazan programı yazınız. C dilinde.

Balik 350
Börek 300
Hamburger 240
Makarna 350
Kabak 70
Patates 200
Pilav 300
Tatlı 400
Türlü 200
Ayran 70
Kola 110
Yardımcı olabilir misiniz?
 
Son düzenleyen: Moderatör:
Çözüm
Anlamadığın yerleri sorabilirsin.
C:
#include <stdio.h>
#include <string.h>

#define MAX_SIZE 30

struct Yemek {
    char isim[MAX_SIZE];
    int kalori;
};

int main() {
    struct Yemek yemekler[MAX_SIZE];
    char siparis[MAX_SIZE];
    int adet, toplam_kalori;
    FILE *kalori_dosyasi, *siparis_dosyasi;

    kalori_dosyasi = fopen("kalori.txt", "r");
    int i = 0;
    while (fscanf(kalori_dosyasi, "%s %d", yemekler[i].isim, &yemekler[i].kalori) != EOF) {
        i++;
    }
    fclose(kalori_dosyasi);

    siparis_dosyasi = fopen("siparis.txt", "r");
    while (fscanf(siparis_dosyasi, "%s %d", siparis, &adet) != EOF) {
        for (int j = 0; j < MAX_SIZE; j++) {
            if (strcmp(siparis, yemekler[j].isim) == 0) {
                toplam_kalori += yemekler[j].kalori * adet;
                break;
            }
        }
    }
    fclose(siparis_dosyasi);

    printf("Toplam kalori: %d\n", toplam_kalori);
    return 0;
}
Örnek siparis.txt:
Kod:
Patates 2
Pilav 1
Tatlı 1
Türlü 4
Çıktı:
Bash:
Toplam kalori: 1900
Chatgpt kullanabilirsiniz.


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

#define MAX_LINE_LENGTH 100
#define MAX_ITEM_COUNT 100

typedef struct {
char itemName[50];
int caloriesPerPortion;
} MenuItem;

typedef struct {
char itemName[50];
int portionCount;
} OrderItem;

// Dosyayı okuyarak menü öğelerini yükler
int loadMenu(const char *fileName, MenuItem menu[], int *menuCount) {
FILE *file = fopen(fileName, "r");
if (!file) {
perror("Dosya açılamadı");
return -1;
}

char line[MAX_LINE_LENGTH];
*menuCount = 0;

while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "%s %d", menu[*menuCount].itemName, &menu[*menuCount].caloriesPerPortion) == 2) {
(*menuCount)++;
}
}

fclose(file);
return 0;
}

// Dosyayı okuyarak siparişleri yükler
int loadOrders(const char *fileName, OrderItem orders[], int *orderCount) {
FILE *file = fopen(fileName, "r");
if (!file) {
perror("Dosya açılamadı");
return -1;
}

char line[MAX_LINE_LENGTH];
*orderCount = 0;

while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "%s %d", orders[*orderCount].itemName, &orders[*orderCount].portionCount) == 2) {
(*orderCount)++;
}
}

fclose(file);
return 0;
}

// Bir öğenin kalorisini menüden bulur
int findCalories(const char *itemName, MenuItem menu[], int menuCount) {
for (int i = 0; i < menuCount; i++) {
if (strcmp(itemName, menu.itemName) == 0) {
return menu.caloriesPerPortion;
}
}
return -1; // Bulunamadıysa
}

int main() {
MenuItem menu[MAX_ITEM_COUNT];
OrderItem orders[MAX_ITEM_COUNT];
int menuCount, orderCount;

// Menü ve siparişleri dosyadan yükle
if (loadMenu("kalori.txt", menu, &menuCount) != 0) {
return 1;
}

if (loadOrders("siparis.txt", orders, &orderCount) != 0) {
return 1;
}

int totalCalories = 0;

// Siparişlerdeki her öğenin kalorisini hesapla
for (int i = 0; i < orderCount; i++) {
int caloriesPerPortion = findCalories(orders.itemName, menu, menuCount);
if (caloriesPerPortion != -1) {
totalCalories += caloriesPerPortion * orders.portionCount;
} else {
printf("Uyarı: '%s' isimli öğe menüde bulunamadı.\n", orders.itemName);
}
}

printf("Toplam Kalori: %d\n", totalCalories);

return 0;
}
Teşekkür ederim fakat bu benim seviyemin biraz üzerinde,bu yüzden çok anlayamadım.
 
Chatgpt kullanabilirsiniz.


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

#define MAX_LINE_LENGTH 100
#define MAX_ITEM_COUNT 100

typedef struct {
char itemName[50];
int caloriesPerPortion;
} MenuItem;

typedef struct {
char itemName[50];
int portionCount;
} OrderItem;

// Dosyayı okuyarak menü öğelerini yükler
int loadMenu(const char *fileName, MenuItem menu[], int *menuCount) {
FILE *file = fopen(fileName, "r");
if (!file) {
perror("Dosya açılamadı");
return -1;
}

char line[MAX_LINE_LENGTH];
*menuCount = 0;

while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "%s %d", menu[*menuCount].itemName, &menu[*menuCount].caloriesPerPortion) == 2) {
(*menuCount)++;
}
}

fclose(file);
return 0;
}

// Dosyayı okuyarak siparişleri yükler
int loadOrders(const char *fileName, OrderItem orders[], int *orderCount) {
FILE *file = fopen(fileName, "r");
if (!file) {
perror("Dosya açılamadı");
return -1;
}

char line[MAX_LINE_LENGTH];
*orderCount = 0;

while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "%s %d", orders[*orderCount].itemName, &orders[*orderCount].portionCount) == 2) {
(*orderCount)++;
}
}

fclose(file);
return 0;
}

// Bir öğenin kalorisini menüden bulur
int findCalories(const char *itemName, MenuItem menu[], int menuCount) {
for (int i = 0; i < menuCount; i++) {
if (strcmp(itemName, menu.itemName) == 0) {
return menu.caloriesPerPortion;
}
}
return -1; // Bulunamadıysa
}

int main() {
MenuItem menu[MAX_ITEM_COUNT];
OrderItem orders[MAX_ITEM_COUNT];
int menuCount, orderCount;

// Menü ve siparişleri dosyadan yükle
if (loadMenu("kalori.txt", menu, &menuCount) != 0) {
return 1;
}

if (loadOrders("siparis.txt", orders, &orderCount) != 0) {
return 1;
}

int totalCalories = 0;

// Siparişlerdeki her öğenin kalorisini hesapla
for (int i = 0; i < orderCount; i++) {
int caloriesPerPortion = findCalories(orders.itemName, menu, menuCount);
if (caloriesPerPortion != -1) {
totalCalories += caloriesPerPortion * orders.portionCount;
} else {
printf("Uyarı: '%s' isimli öğe menüde bulunamadı.\n", orders.itemName);
}
}

printf("Toplam Kalori: %d\n", totalCalories);

return 0;
}
Allah rizasi icin;

Foruma bu ozelligi bosuna koymuyorlar. Su kod ne kadar korkunc gorunuyor goruyor musun? Ek olarak;
 
Anlamadığın yerleri sorabilirsin.
C:
#include <stdio.h>
#include <string.h>

#define MAX_SIZE 30

struct Yemek {
    char isim[MAX_SIZE];
    int kalori;
};

int main() {
    struct Yemek yemekler[MAX_SIZE];
    char siparis[MAX_SIZE];
    int adet, toplam_kalori;
    FILE *kalori_dosyasi, *siparis_dosyasi;

    kalori_dosyasi = fopen("kalori.txt", "r");
    int i = 0;
    while (fscanf(kalori_dosyasi, "%s %d", yemekler[i].isim, &yemekler[i].kalori) != EOF) {
        i++;
    }
    fclose(kalori_dosyasi);

    siparis_dosyasi = fopen("siparis.txt", "r");
    while (fscanf(siparis_dosyasi, "%s %d", siparis, &adet) != EOF) {
        for (int j = 0; j < MAX_SIZE; j++) {
            if (strcmp(siparis, yemekler[j].isim) == 0) {
                toplam_kalori += yemekler[j].kalori * adet;
                break;
            }
        }
    }
    fclose(siparis_dosyasi);

    printf("Toplam kalori: %d\n", toplam_kalori);
    return 0;
}
Örnek siparis.txt:
Kod:
Patates 2
Pilav 1
Tatlı 1
Türlü 4
Çıktı:
Bash:
Toplam kalori: 1900
 
Son düzenleme:
Çözüm
Bir büfede satılan tüm yiyeceklerin bir porsiyonunun ve içeceklerin bir bardağının kalori miktarları "kalori.txt" dosyası içinde saklanmaktadır. Sipariş veren müşterinin istediği n adet sipariş ve porsiyon miktarları "siparis.txt" dosyasına kaydedilmiştir. Buna göre sipariş dosyasındaki siparişi verilen ürünlerin toplam kalorisi hesaplanarak ekrana yazan programı yazınız. C dilinde.

Balik 350
Börek 300
Hamburger 240
Makarna 350
Kabak 70
Patates 200
Pilav 300
Tatlı 400
Türlü 200
Ayran 70
Kola 110
Yardımcı olabilir misiniz?
Cok zor degil.

Oncelikle file read isini cozmelisin. File API'si biraz kafa karistirici gelebilir en basta ama gercekten o kadar zor degil. Bol bol arastirma yapman lazim ama derste gormus de olmalisin ayni zamanda.

Neyse algoritma sana acikca verilmis ama ben asamalara bolup gerekli kaynaklari vereyim, kendin birlestir. Yapamadigin yerde sor. Bu odevin amaci senin ogrenmeni saglamak. Ben kodu direkt verirsem sana bir katkisi olmayacak.

Daha once de soyledigim gibi dosya okuyarak baslamalisin.

Structurelari gordugunu varsayarak; ilk bir struct olustur. Olusturdugun struct'in adi Urun olsun ve icinde urun adini (ipucu: char[] kullanman lazim) ve urun kalorisini (ipucu: unsigned int yeterli) tutman gerekli.

Bu Urun structure'undan bir adet array olusturmalisin. Bu array senin urun listen olacak.

Sonra once kalori.txt'yi okursun. Okudugun degerlerin her birini bir Urun'e donusturursun ve birer birer arraye yerlestirirsin. (Ipucu: kalori.txt'de her satir gordugum kadariyla <urun_ismi> <kalori> seklinde formatlanmis. Basit bir donguyle once boslugun oldugu index'i bulur daha sonrasinda strcpy kullanarak isme kopyalarsin, digerini de bir gecici degiskene kopyalayip onu da stoi kullanarak int'e donusturursun.)

Sonrasinda siparis.txt'yi okur, her cikan ismi Urunler listende aratirsin. (Ipucu: Basit bir dongu ve strcmp yeterli. Iki string bir birine esit mi diye kontrol eder strcmp. Esitse 0 dondurur, degilse farkli karakter sayisini.) Esit geldikce toplam_kalori adli bir degiskine toplarsin. En sonda bu degiskeni yazdirirsin.

Dedigim gibi, kod vermek istemiyorum cunku sana yardimci olmayacagini dusunuyorum.
 
Anlamadığın yerleri sorabilirsin.
C:
#include <stdio.h>
#include <string.h>

#define MAX_SIZE 30

struct Yemek {
    char isim[MAX_SIZE];
    int kalori;
};

int main() {
    struct Yemek yemekler[MAX_SIZE];
    char siparis[MAX_SIZE];
    int adet, toplam_kalori;
    FILE *kalori_dosyasi, *siparis_dosyasi;

    kalori_dosyasi = fopen("kalori.txt", "r");
    int i = 0;
    while (fscanf(kalori_dosyasi, "%s %d", yemekler[i].isim, &yemekler[i].kalori) != EOF) {
        i++;
    }
    fclose(kalori_dosyasi);

    siparis_dosyasi = fopen("siparis.txt", "r");
    while (fscanf(siparis_dosyasi, "%s %d", siparis, &adet) != EOF) {
        for (int j = 0; j < MAX_SIZE; j++) {
            if (strcmp(siparis, yemekler[j].isim) == 0) {
                toplam_kalori += yemekler[j].kalori * adet;
                break;
            }
        }
    }
    fclose(siparis_dosyasi);

    printf("Toplam kalori: %d\n", toplam_kalori);
    return 0;
}
Örnek siparis.txt:
Kod:
Patates 2
Pilav 1
Tatlı 1
Türlü 4
Çıktı:
Bash:
Toplam kalori: 1900
Öncelikle teşekkür ederim yaptığım hataları nerelerde yaptigimi anladim fakat çözemediğim bir sorun var.Dosyayi bir türlü bulduramiyorum .txt dosyamin yolunu kopyalip yapistiriyorum gerekli duzenlemeyi yapiyorum("C:\\Users\\Rıdvan\\Desktop\\proje\\kalori.txt" bu şekilde yazıyorum) ama Dosyayı bulamıyor sistem.Hatayi nerede yapıyor olabilirim?Kod için teşekkür ederim tekrardan.
 

Technopat Haberler

Yeni konular

Geri
Yukarı