Şimdi Ara

DEV C++ Anlamadığım Nokta

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
8
Cevap
0
Favori
591
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba bir program ödevi aldım ödevin sorusu
    Bir cümle yazılsın ve bu cümlede her kelimeden kaç adet olduğunu ekrana bastırsın.
    Evet bu soruyu yaptım ancak şöyle bir sorun olduğunu gördüm ve çözemedim
    Sorun şu yazdığım cümlenin içindeki harfleri cümleyi tekrar ederek yazıyor.Bu da her kelimeyi tekrar etmesi anlamına geliyor
    yani AAA cümlesinde kaç harf vardır sorusuna programın cevabı
    A-3 ADET VARDIR
    A-3 ADET VARDIR
    A-3 ADET VARDIR
    CEVABI YERİNE
    A - 3 ADET VARDIR
    CEVABINI VERMESİNİ İSTİYORUM.Hatalı programı Aşşağıya bırakıyorum


    #include<stdio.h>
    #include<conio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    main(){
    char cumle[250];
    int j,c=0,d,i=0,uz,tek[100];
    cout<<"Cumleyi Yaziniz:";
    for ( i = 0; i<100; i++){
    tek=0;
    }
    gets(cumle);
    i=0;
    c=0;
    uz=strlen(cumle);
    j=strlen(cumle);
    for(c=0;c<uz;c++){
    j=uz;
    for(j-1;j>=0;j--){

    if(cumle[c]==cumle[j]){
    tek[c]++;

    }
    }
    }
    for(c=0;c<uz;c++){


    cout<<cumle[c]<<" Harfi "<<tek[c]<<":Kere"<<endl;

    }
    }
    //bir cümlede her harften kaç tane oldugunu bulan programDEV C++ Anlamadığım Nokta







  • Merhaba yazdığın kodu düzelttim. açıklama da ekledim.
    #include<stdio.h> 
    #include<conio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    main()
    {
    char cumle[250];
    int j,c=0,d,i=0,uz,tek[100];
    char harfler[26];
    int bayrak = 0;
    cout<<"Cumleyi Yaziniz:";
    for ( i = 0; i<100; i++)
    {
    tek[i]=0;
    if(i < 26)
    harfler[i] = '+';
    }
    gets(cumle);
    i=0;
    c=0;
    uz=strlen(cumle);
    j=strlen(cumle);
    for(c=0;c<uz;c++)
    {
    j=uz;
    for(j-1;j>=0;j--)
    {
    if(cumle[c]==cumle[j])
    {
    tek[c]++;
    }
    }
    }
    for(c=0;c<uz;c++)
    {
    bayrak = 0;
    for(j = 0; j < 26; j++)
    {/* harf daha önce yazdırılmışsa ( yedeklenmişse ) bayrak = 1 olacak */
    if(harfler[j] == cumle[c])
    {/* dolayısı ile bir daha aşağıda yazdırılamayacak*/
    bayrak = 1;
    break;
    }
    }
    if(bayrak == 0) // ilgili harf ilk kez yazdırılıyor
    {
    cout<<cumle[c]<<" Harfi "<<tek[c]<<":Kere"<<endl;
    for(j = 0; j < 26; j++)
    {
    if(harfler[j] == '+')
    {/* ilk kez yazdırılan harf yedekleniyor */
    harfler[j] = cumle[c];
    break;
    }
    }
    }
    }
    }




  • rukaplan R kullanıcısına yanıt
    Merhaba ilgin ve cevabın için çok teşekkür ederim.Açıklamaların beni aydınlattı anladığım kadarıyla operatörleri tam olarak bilmiyorum.Bu yüzden sorun çıktı aynı for döngüsünü bende yarattım.Ama if kısmında aynı kelimeden olduğu zaman yedeklesin yazmasın ve diğer harfe geçsin kısmını düşünmüştüm ama nasıl yapacağımı bilmiyordum birde en baştaki harfler[26] kısmında harflere neden 50 değil 60 değil 26 verdiniz birde '+' nedir , açıklayabilirmisiniz ? bunları öğrenebileceğim yer varsa tavsiye edermisiniz çok teşekkür ederim.
  • crazzy_danger kullanıcısına yanıt
    rica ederim.ingilizce karakterlersi test edeceğini düşündüm, ingilizce 26 harf olduğu için o şekilde ayarladım. aslında boşluk karakterini dikkate almamışım. bu durumda 27 olarak değiştirilebilir. yazacağın karakterlerin hepsini harf olarak varsaydığım için önceden hepsine '+' karakteri yerleştirdim, içi boş kalmasın ve dizi içinde ilk '+' buluncaya kadarki karakterlerin harf olacağını biliyorum. yani ilk başta harfler içinde +++++++++++++++++++ gibi karakterler var. a harfi geldiğinde a++++++++++++++++++, sonra b harfi gelse ab+++++++++++++++++ halini alacak. örneğin 3. karakter '+'. demek ki ilk iki karakter harf.

    aslında burdaki işlem varsayım üzerine yapılmış. kullanıcını maksimum 26 farklı karakter gireceğini ve sayı girmeyeceğini varsayıyoruz. ama bunun yerine dinamik olan, harflere 26 karakter vermeden, gerek olduğunda kendiliğinden büyüyen bir yedekleme dizisi yapılabilir. pointer, malloc - realloc konularına girer. bilgisayar müh okumuyorsan muhtemelen göstermezler bu konuyu. dikkat gerektirir, hataları saçbaş yoldurur. ama kullanımı varsayımların olduğu kodlarda mecburidir. artık harf mi sayı mı farketmez, hepsi için çalışır. Diğer programlama dillerinde daha kolay kodlarla halledilebilir. kolay gelsin.
    #include<stdio.h> 
    #include<conio.h>
    #include<iostream>
    #include<string.h>
    #include <stdlib.h> /* realloc için gerekli */
    using namespace std;
    main()
    {
    char cumle[250];
    int j,c=0,d,i=0,uz,tek[100];
    char *harfler = NULL; /* yazdırılan harfler buraya yedeklenecek */
    /* ilk başta içi boştur. harf geldikçe dinamik olarak büyüyecek*/
    int boyut;
    int bayrak = 0;
    cout<<"Cumleyi Yaziniz:";
    for ( i = 0; i<100; i++)
    {
    tek[i]=0;
    }
    gets(cumle);
    i=0;
    c=0;
    uz=strlen(cumle);
    j=strlen(cumle);
    for(c=0;c<uz;c++)
    {
    j=uz;
    for(j-1;j>=0;j--)
    {
    if(cumle[c]==cumle[j])
    {
    tek[c]++;
    }
    }
    }
    for(c=0;c<uz;c++)
    {
    // strchr(harfler,cumle[c])==NULL ile yazdırılacak harfin daha önce
    // harfler içine yedeklenmiş mi soruluyor ancak ilk döngüde hata veriyor
    // o nedenle ilk döngüyü pas geçmek için harfler == NULL (yani henüz hiç harf)
    // yazılmadıysa, ilk harf için strchr(harfler,cumle[c]) çalıştırılmasın
    if(harfler == NULL || strchr(harfler,cumle[c])==NULL)
    {
    cout<<cumle[c]<<" Harfi "<<tek[c]<<":Kere"<<endl;
    boyut++; // harflerin yeni boyutu olacak
    // harflerin hafızasını (alabileceği harf sayısını) dinamik olarak 1 artır
    harfler = (char*) realloc (harfler, (boyut) * sizeof(char));
    // yazdırılan harfi yedekle
    harfler[boyut-1] = cumle[c];
    }
    }
    }




  • rukaplan R kullanıcısına yanıt
    Teşekkür ederim peki boşluk harfini göstermesini nasıl engelleyebilirim
    cumlec[c]!='\0' Tanımını yapıyorum ama yinede boşluk tuşununda kaç adet girildiğini yazıyor .
  • crazzy_danger kullanıcısına yanıt
    '\0' tahminimce string sonu için kullanılır. boşluk için ' ' veya ascii tablosu karşılığı sayı olarak 32 kullanılır. her ikisi de çalışır. diğer durumlara && ile bağladım, dolayısı ile boşluk hiçbir zaman işleme alınmıyor. yani yedeklenmiyor da, yazdırılmıyor da. bir nevi boşluk gelince pas geçiliyor.

    if(cumle[c] != ' ' && (harfler == NULL || strchr(harfler,cumle[c])==NULL))


    if(cumle[c] != 32 && (harfler == NULL || strchr(harfler,cumle[c])==NULL))
  • rukaplan R kullanıcısına yanıt
    Anladım ama bu kodu hangi kısıma koyacağımı bulamadım

    #include<stdio.h>
    #include<conio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    main()
    {
    char cumle[250];
    char harfler[29],bosluk='\0';
    int i=0,j,c=0,uz,tekrar[100];
    int yedek=0;

    cout<<"Cumleyi Yaziniz:";
    for(i=0;i<100;i++){
    tekrar=0;
    if(i<29)
    harfler='+';

    }
    gets(cumle);
    i=0;
    c=0;
    uz=strlen(cumle);
    j=strlen(cumle);

    for(c=0;c<uz;c++){
    j=uz;
    for(j-1;j>=0;j--){
    if(cumle[c]==cumle[j])
    {
    tekrar[c]++;
    }

    }
    }
    for(c=0;c<uz;c++){
    yedek=0;
    for(j=0;j<29;j++){
    if(harfler[j]==cumle[c]){
    yedek=1;
    break;
    }
    }
    if(yedek == 0){
    cumle[c]!='\0';
    cout<<cumle[c]<<" Harfi "<<tekrar[c]<<":Kere"<<endl;
    for(j=0;j<29;j++){
    if(harfler[j] == '+') {

    harfler[j]=cumle[c];
    break;
    }

    }

    }

    }
    }





  • crazzy_danger kullanıcısına yanıt
    if(yedek == 0){
    cumle[c]!='\0';


    kısmını

    if(cumle[c] != ' ' && yedek == 0) {

    olarak değiştirmen gerekir.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.