Şimdi Ara

Bir string i büyük harf sayısına göre kelimelere bölmek? C' de

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
7
Cevap
0
Favori
1.919
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar. Bu hafta string konusuna geçiş yaptık okulda. Ufak çapta bir ödev teslim yapmam gerekli. Soru şu.
    Bize verilen bir string' i. Örneğin "MustafaKemalAtaturk" Bunu, içindeki büyük harf sayısına göre parçalıcak ve tek tek ekrana yazdırıcak.

    Program interaktif şu şekilde olmalı:
    Enter a full name> MustafaKemalAtaturk

    There are first, middle & last names:
    first: Mustafa middle: Kemal last: Ataturk
    -------------------------------------------------------
    Diğer bir şekilde 2 isim olursa.
    Enter a full name> MustafaKemal

    There are first & last names:
    first: Mustafa last: Kemal

    Eğer 1 veya 4 ve 4' den büyük isimler olursa Program ekrana "Invalid Names" olarak prompt vericek.

    String konusunda o kadar iyi değilim. bu yüzden gerçekten yardımınızı istiyorum. Gece en geç 24.00 e kadar mail atmam gerekiyor. Şimdiden teşekkürler.



    < Bu mesaj bu kişi tarafından değiştirildi saxahan -- 25 Mart 2010; 20:44:38 >







  • Siz sadece okulunuzun verdiği bilgiylemi yetiniyorsunuz? Kendi başınıza çalışmayı denediniz mi? İsteksiz olduğunuz bir işi zorla yaparak nasıl mühendis olacaksınız? Şu okulların yazılım eğitimini gerçekten merak etmeye başladım doğrusu...
    Neyse ben sana bir amatör olarak biraz teorik bilgi vereyim kodu kendin yazmayı dene.

    String dediğimiz karakter katarının her bir karakteri 1 baytlık bir sayıdır. Her birinin tipi char'dır. Demekki string aslında 1 baytlık sayılardan oluşan ve bellekte art arda gelen bir sayı dizisidir.
    Bir sayı karakter olarak yorumlanıyorsa artık o sayı, o karakterin ASCII numarasıdır. Şu adresten ascii tablosuna baktığın zaman her karakterin bir numarası olduğunu görürsün.
    http://www.asciitable.com/

    Tabloya dikkat edersen büyük harfler önce gelir ve son büyük harfin ascii kodu 90'dır. Yani bir karakterin numarası 90'dan büyük ise küçük harf, değilse büyük harf'tir diyebiliriz. Bir fikir verdi mi?
    Senin yapman gereken bir döngü içinde dizinin sonuna kadar gitmek ve karakterleri, yani sayıları teker teker karşılaştırmak.
    Peki bir karakter dizisinin sonunu nasıl bileceğiz? Kodun içinde sabit bir string yazdığımız, veya çalışma zamanında giriş yağtığımız zaman derleyici dizinin sonuna bir NULL karakteri ekler. Bu karakter, ascii tablosunun ilk, yani 0 numaralı karakteridir. Bunu döngüyü bitirmek için kontrol amaçlı kullanırız.

    Bir harfin büyük mü küçük mü olduğunu anlamanın çok kolay bir yolu daha var. Ascii numarasının 5 numaralı biti 0 ise harf büyük, 1 ise harf küçüktür. Ama bunun kontrolünü yapabilmek için bit operatörlerini bilmek gerekir. Biliyorsan bu şekilde yapman daha iyi olur bence.

    Eğer gene yazamam diyorsan bir iki kelam kodda yazarız artık. Ama önce kendin dene.




  • Hayır bit operatorunu bilmiyorum. Bu arada konu ile ilgili bir fikrim vardı ama yazmadım. Hemen kızma :) anlattığın teorik kısmı da biliyorum ama bit operatörlerini bilmiyorum.
    Şu kodları yazdım.

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

    #define SIZE_ROW 30
    #define SIZE_COL 22

    int main (void)
    {
    char name[SIZE_ROW][SIZE_COL];
    char first[SIZE_COL], middle[SIZE_COL], last[SIZE_COL];
    int i, j, k;
    int count = 0; // counting for capital letters.

    printf("Enter a full name without white-space>> ");
    scanf("%s", name);

    i = 0;

    for(i = 0; i < SIZE_COL; ++i) {

    for(j = 0; name[i][j] < "a"; ++j) {

    if(name[i][j] >= 'A' && name[i][j] <= 'Z') {
    count = count + 1;
    }
    }
    }

    if(count == 3) {

    printf("\nThere are first, middle & last names.");

    } else if(count == 2) {

    printf("\nThere are first and last names.");

    } else {

    printf("\nInvalid Names.");

    }



    printf("\n\n");
    return (0);


    }


    Yapamadığım kısım şu. stringlen ile aldığım uzunluğun neresinden başlamalıyım kelimeleri bölmeyi. Bir sonraki büyük harfi görene kadar. Ama orasını beceremedim. Orasını çözsem biticek program :)




  • Niye iki boyutlu dizi kullandın onu anlamadım. Sadece bir giriş yapıyorsun programda. Ayrıca parçaladığın stringleri depolamana gerek varmı? Şöyle olmazmı.

     
    #define NAME_SIZE 40

    int main()
    {
    char name[NAME_SIZE];
    int i, count = 0;
    printf("Enter a full name without white-space>> ");
    scanf("%s", name);
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') ++count;
    }
    if(count == 1 || count > 3) {
    printf("Invalid Names.\n");
    return 0;
    }
    int k = 0;
    if(count == 3) {
    printf("There are first, middle & last names.\n");
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') {
    if(k == 0) printf("first: ");
    if(k == 1) print(" middle: ");
    if(k == 2) print(" last: ");
    ++k;
    }
    printf("%c", name[i]);
    }
    }
    if(count == 2) {
    else printf("There are first and last names.\n");
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') {
    if(k == 0) printf("first: ");
    if(k == 1) print(" last: ");
    ++k;
    }
    printf("%c", name[i]);
    }
    }
    }

    Acele yazdım yazım hatası olabilir.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 25 Mart 2010; 23:49:47 >




  • quote:

    Orijinalden alıntı: elektro_gadget

    Niye iki boyutlu dizi kullandın onu anlamadım. Sadece bir giriş yapıyorsun programda. Ayrıca parçaladığın stringleri depolamana gerek varmı? Şöyle olmazmı.

     
    #define NAME_SIZE 40

    int main()
    {
    char name[NAME_SIZE];
    int i, count = 0;
    printf("Enter a full name without white-space>> ");
    scanf("%s", name);
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') ++count;
    }
    if(count == 1 || count > 3) {
    printf("Invalid Names.\n");
    return 0;
    }
    int k = 0;
    if(count == 3) {
    printf("There are first, middle & last names.\n");
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') {
    if(k == 0) printf("first: ");
    if(k == 1) print(" middle: ");
    if(k == 2) print(" last: ");
    ++k;
    }
    printf("%c", name[i]);
    }
    }
    if(count == 2) {
    else printf("There are first and last names.\n");
    for(i = 0; name[i]; i++) {
    if(name[i] < 'a') {
    if(k == 0) printf("first: ");
    if(k == 1) print(" last: ");
    ++k;
    }
    printf("%c", name[i]);
    }
    }
    }

    Acele yazdım yazım hatası olabilir.


    Yardımın için teşekkürler. Verdiklerin kafamda bir fikir oluşturdu :) ve programı yazdım. gayet güzel çalışıyor.
    Şu şekilde:

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

    #define SIZE_ROW 30
    #define SIZE_COL 20

    int main (void)
    {
    char name[SIZE_ROW];
    char first[SIZE_COL], middle[SIZE_COL], last[SIZE_COL];
    int i, j;
    int loop = 0; // counting for capital letters.

    printf("Enter a full name without white-space>> ");
    scanf("%s", name);

    for(i = 0; i < strlen(name); i++){
    if(name[i] >= 'A' && name[i] <= 'Z'){
    loop++;
    }
    }

    if (loop == 3) {

    i = 0;
    do {
    first[i] = name[i];
    i++;
    } while(!(name[i] >= 'A' && name[i] <= 'Z'));
    first[i] = '\0';
    loop = i;

    i = 0;
    do{
    last[i] = name[loop];
    loop++;
    i++;
    } while(!(name[loop] >= 'A' && name[loop] <= 'Z'));
    last[i] = '\0';


    i = 0;
    do{
    middle[i] = name[loop];
    loop++;
    i++;
    } while(name[loop] != '\0');
    middle[i] = '\0';

    printf("There are first, middle, and last names\n\n");

    printf("First: %s Last: %s Middle: %s", first, middle, last);
    printf("\n\n");
    exit(1);
    }

    else if (loop == 2) {
    i = 0;
    do {
    first[i] = name[i];
    i++;
    } while(!(name[i] >= 'A' && name[i] <= 'Z'));
    first[i] = '\0';
    loop = i;

    //Cut Last
    i = 0;
    do {
    last[i] = name[loop];
    loop++;
    i++;
    } while(name[loop] != '\0');
    last[i] = '\0'; //end of the string

    printf("There are first, and last names\n\n");

    printf("first: %s last: %s", first, last);
    printf("\n\n");
    exit(1);

    } else {

    printf("\nInvalid Names\n\n");
    exit(1);

    }



    return(0);
    }




  • Sevindim.
    Bu arada yazım hatası yapmışım.

    Ve son soru: Hocan da burayı takip ediyorsa ne olacak.
  • Yoksa siz misiniz ? :D
    Bilmem. Birşey olacağını düşünmemiştim. Çünkü bir arkadaşla gün boyu çok uğraş verdik. Son çare yardım almayı düşündük :)
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.