Merhaba, hoş geldiniz. Bu derste, bir önceki zorluğumuza
yönelik bir çözümün gösterimini yapacağım.
Str length fonksiyonunu kullanarak
bir dizgideki karakterleri nasıl tersine çevirebileceğimizi
ve ayrıca str compare ve str copy kullanarak dizgileri
sıralamayı ve bubble algoritmasını kullanmayı inceleyeceğim.
Kod bloklarını gündeme getirelim.
Ve sanırım bunun için tek bir program oluşturacağım. Yarışmada iki program oluşturduğunuzdan
bahsetmiştim.
Ancak basitlik ve gösterim açısından, sadece tek bir tane oluşturacağım.
Bir proje oluşturun,
ben buna string functions ya da
bunun bir çeşidi adını vereceğim.
Buna ortak dize işlevleri örneği
diyelim.
Öyleyse tersinden başlayalım. Tersi kendi fonksiyonuna gidebilir ya da
sadece main'in içine koyabiliriz. Onu ana bölüme koyacaktım.
Bu yüzden yapmak istediğim ilk şey bir -- aslında yapmak istediğim ilk şey doğru
başlık dosyasını dahil etmek istiyorum, böylece bu string fonksiyonlarını kullanabilirim,
bu da benim dahil etme dizem. h.
Burası tüm güzel dize fonksiyonlarını içerdiği yerdir.
Şimdi bir karakter dizisi oluşturacağım. Bunu 100 beden yapacağım.
Bu sadece keyfi, 100'den
büyük şeyleri depolayamayacak.
Ayrıştırma işlemimde bana yardımcı olacak birkaç
yerel değişken oluşturacağım. Ve yapmak istediğim şey, kullanıcıya önce
bazı çıktılar göstermek istiyorum.
Bu yüzden sadece birkaç satır beslemesi yapacağım,
dizenin karakterlerini tek tek
yazdıracağım ve sırayı tersine çevireceğim.
Bu, kullanıcıya neler olup bittiğini söyleyecek ve daha belirgin hale
getirmek için bunun gibi bir şeyin çıktısını alacaktır,
böylece okunması daha kolay olacaktır.
Dizeyi girin diyeceğim. Dize içinde okuyacağım.
Ve sonra dizeyi saklayacağım.
Bu yüzden scanf diyeceğim,
s'yi göstereceğim ve str diyeceğim.
Okumak için ampersand'i geçmeme gerek yok.
Sonra ip uzunluğunu alacağım. Bunu l yerel değişkenime koyacağım.
Böylece str link'i sadece str length diyerek çağırabilirim ve bu string
içinde kaç karakter olduğunu döndürür. Çok, çok kolay.
Ve sonra onlara karakterlerin ters sırada olduğunu söyleyen bir şey yazdıracağım.
Yani dizenin karakterleri
ters r ters eğik çizgi n.
Sonra dizimin içinden geçen ve uzunluğa göre tersine
çeviren küçük bir for döngüsü yazacağım.
Bu yüzden ben eşittir ben diyeceğim.
Bu yüzden gerçek dize dizisinde geriye
doğru gideceğim. Sondan başlayıp ileriye doğru gideceğim.
Ve I'nın 0'dan büyük veya eşit olduğunu ve
I eksi eksi olduğunu söyleyin. Ve bu şekilde yaptığımda herhangi bir null sonlandırma
karakterine bakmam gerekmediğini fark etmişsinizdir.
Sonra da karşılaştığım her karakterin çıktısını alacağım.
Bir karakteri yazdırmak ve görmek için sadece yüzde c'yi yapın.
Ve sadece bunu yap ve str sub-I de.
Ve temelde hepsi bu.
Ve sonra yeni bir satır yazdıracağım.
Ve aslında sadece bitirmek için bir sürü şey yazdıracağım,
bir sürü tire.
Bakalım işe yarayacak mı, aslında olması gerektiği gibi
bu çok kolay, uzunluğu elde etmek zor olmamalı.
Satır beslemesini unutmuşum, onu da düzeltelim.
Yani burada dizenin tek tek karakterlerini tersine yazdır veya dizeyi gir diyor.
Şimdi scanf, sadece içeri okuyacak. Yani Jason uzayına girersem Feden.
Scanf sadece Jason'a ve uzaya kadar okuyacak.
Eğer tamamını okumak istiyorsanız f get s gibi başka bir fonksiyon kullanmanız gerekir.
Yani bunun yapacağı şey Jason'ın nosaj çıktısını tersine çevirmek
olacak, ki bunu yapıyor. Dize tersinin karakterleri nosajdır.
Bu oldukça basit, çok karmaşık bir işlev veya uygulama
değil.
Şimdi bunu bir dizeyi sıralayarak deneyelim.
Ve şimdi bir şey yapacağım. Ve sanırım şimdilik bunu ana bölümde yapacağım.
Bunları gerçek fonksiyonların içine koymam gerekirdi, ancak bu derste
fonksiyonları göstermiyoruz, dizeleri gösteriyoruz.
Şimdi ihtiyacımız olacak birkaç yerel değişken daha oluşturalım.
Esas olarak bir isim oluşturacağız.
Ve bu durumda, dizelerden oluşan
bir dizi oluşturacaktım. Dizelerden oluşan bir dizi oluşturacağız ve f get s kullanacağız.
Dizelerden oluşan bir dizi oluşturacağım. Yani bu iki boyutlu bir dizi
gibi görünüyor.
Burada yaptığımız şey, 50 boyutunda 25 dizi oluşturmaktır.
Sonra sadece 25'lik bir tane daha oluşturacağım, bu da
her dizeyi içerecek.
Ve sonra iki değişken daha
ekleyeceğim. Bir N ve bir J ekleyeceğim.
Tersini yaptıktan sonra çıktısını alacağım.
Yaptığımız şeyin bir dizinin dizelerini
bubble sort kullanarak sıralamak
olduğunu söylemek için başka bir mesaj.
Size baloncuk türünü açıklamayacağım. Çünkü yine, bu sadece yaptığımız şeyle ilgili
olmayan bir algoritma. Gerçekten, bu sadece sıralamanın bir yolu.
Aslında en kolay türlerden biridir çünkü esasen sadece değiştirirsiniz.
Ancak yapmak istediğimiz şey, öncelikle kaç dizgi gireceklerini öğrenmektir. Bu yüzden printf giriş
dizesi sayısı diyeceğiz
ve sonra scanf diyeceğiz.
Scanf burada kullanılabilir çünkü sadece bir sayıdır.
Yüzde d diyeceğiz ve bunu yerel değişkenimiz n'de saklayacağız.
Tekrar ediyorum, burada büyük isimler kullanmadığımı
biliyorum, ama bir şey gösteriyorum. Bir it's olduğu için, ampersand'i geçmek zorundayız.
Sonra onlardan dizeleri girmelerini isteyeceğim.
Bu yüzden burada 1, 2 ya
da 3 numaralı giriş dizesini
ve ardından satır beslemesini söyleyeceğim.
Bu sadece girmeleri gereken numara olacaktır.
Birinci dize, ikinci dize veya üçüncü dize.
Sonra aslında içinden geçip girdiyi alan bir döngüm olacak.
Yani burada I eşittir 0, I eşittir n'den
küçük kaç dizgi girmek istediklerini ve I artı
artı veya artı artı I diyeceğim.
Burada aslında dizeyi okuyacağım ve okumak için farklı bir yol kullanacağım
- f get s kullanmayı düşünüyordum, böylece boşluk
içeren bir dize girebilirdiniz. Ama ihtiyacımız olduğunu sanmıyorum.
Scan f yapıyoruz
ve scanf'i names dizimize okuyacağız.
Unutmayın, adımız var ve bu esasen 25 karakterden oluşan bir
dizeler dizisidir.
50 karakter 25 kelime.
Yani girebileceğiniz maksimum kelime sayısı 25'tir.
Bu yüzden bunu name dizimizde
saklayacağız. Bu yüzden sadece scanf diyeceğiz.
Bir dize okuyacağız ve bunu name sub I içine
koyacağız.
Ve böylece dizilerimizi depoladık, yalnızca 25'e kadar depolayabiliriz.
Şimdi döngümüzü tamamladık ve artık baloncuk sıralamamızı yazabiliriz.
Baloncuk sıralamamız, size açıklamayacağım, sadece bir iç döngüye sahip oldukça
basit bir algoritma olduğunu söyleyeceğim.
Yani, I değeri 1'e eşit olan tüm dizeler boyunca ilerleyen bir for döngüsüne
sahipsiniz.
Ve sonra iç döngünüzde, sıfırdan tüm dizelere eksi
bire gidersiniz. Ve bu ilk dizeyi diğer tüm dizelerle karşılaştırırsınız.
Ve aslında onları balonlaştırıyorsunuz. Ancak burada önemli olan
str karşılaştırma işlevidir.
Str kopyalama işlevlerinde bu girintiyi doğru bir
şekilde almaya çalışmama izin verin, gerçekten önemli olan budur.
Her dördü için de bitiş parantezi kullanmadığımı fark edeceksiniz çünkü her ikisinde
de tek bir ifade var.
Bu if'in if gövdesinde bir şey olsa da, bu yalnızca bir ifadedir.
Dolayısıyla, daha önce bir kelimeyi karşılaştırdıktan sonra esasen her kelimeyi
diğer her kelimeyle karşılaştırıyoruz.
Bu durumda, eğer str compare name sub j ve name
sub j sub one dersek, str compare iki
argüman, iki karakter dizisi,
karakter işaretçisi
alır.
Ve eğer eşitlerse, sıfır dönecektir.
İlk parametre ikinci parametreden
küçükse, sıfırdan küçük bir değer
döndürür.
Ve ilk parametre ikinci parametreden büyükse,
sıfırdan büyük bir değer döndürür.
Yani bunun söylediği şey, eğer ilk dize ikinci dizeden büyükse, o zaman her şeyi
değiştirmek istiyoruz. İşte bu yüzden o sıcaklık var.
Temp aslında geçici bir dizeyi depolamaktadır.
Bu yüzden geçici sub j adını koyduk ve sonra
sub j adını j artı bir adlarıyla değiştirdik.
Baloncuk sıralaması bu şekilde çalışır. Yine, burada önemli olan str karşılaştırma ve str kopyalamadır.
Ve eğer güvende olmak istiyorsanız, strn karşılaştırmasını kullanmak istersiniz.
Ve strn karşılaştırması yaptığınızda. Aslında strn karşılaştırması umurunuzda
değil çünkü bu yalnızca öneki karşılaştırmak istiyorsanız geçerlidir.
Str kopyalama için aslında strn kopyalama kullanmak istersiniz.
Önemli olan da bu üçüncü parametredir.
Yani strn kopyalama, sadece temp boyutundan daha fazlasını kopyalamadığınızdan
emin olmak istersiniz, eksi bir çünkü aksi takdirde bir arabellek taşması olur.
Yani tüm bunları kullanabilirdiniz, ayrıca -- eğer bir karakter
tamponu değilse, muhtemelen bir işaretçi olsaydı str uzunluğunu
kullanmak isterdiniz. Ancak boyutu bunun için iyi çalışacaktır.
Ve yine, bu herhangi bir arabellek taşmasını ortadan kaldıracaktır.
Bu yüzden strn copy ve one kullanmak her zaman daha güvenlidir
çünkü sonunda gitmesi gereken null terminatörümüz vardır.
Yani burada strn kopyalama için sadece kaynak hedeftir.
j alt adını temp'e kopyalıyoruz ve aynı şeyi j artı bir ve j alt
adı için de yapıyoruz. Ve son olarak, alt j artı bir isimlerine
geçici. Ve aslında bu değişkenleri
güncellemek zorundayım çünkü yanlışlar çünkü
her zaman kaynak olmak zorundalar. Buraya bir isim verin, alt j.
Ve sonuncusu da j artı bir,
j artı bir isimleri olacaktır.
İşte strn copy ve str compare, kullanımı çok kolay fonksiyonlar.
Bunları sıraladıktan sonra, sadece çıktılarını almak istiyoruz.
Yani dizilerin sıralamadan sonra göründüğünü söylemek,
satır beslemesine
koymak ve ardından dizimizdeki tüm dizileri
yazdırmak için bir
döngüden geçmek istiyoruz.
Yani 4 I eşittir 0 diyoruz.
I, n'den küçük veya n'ye eşittir çünkü n, kaç dizeyi
sıraladığımızı ve girdiğimizi temsil eder.
O zaman sadece dize dizilerimizi gözden geçirmek istiyoruz.
Yani printf s satır beslemesi ve sub
I adını söylemek istiyoruz.
Yani name sub I aslında bizim sıralanmış dizimizdir, bu yüzden name sub
I isimlerini kullandık.
İkincisine sahip olmasak da, çünkü bu her bir karakterin boyutunu temsil eder.
Maksimum 50 kelimeden 25 kelime.
Bakalım işe yarayacak mı?
Kurun, hecelemeyi bilmediğim için birkaç mesaj aldım.
Ve eğer bunu çalıştırırsak. Önce ters fonksiyonumuzu çalıştıracağız, böylece aynı
programa dahil ettiğimiz için bunu tekrar görebilirsiniz.
Fedin ve Idf'in iyi olduğunu söyle.
Sıralamak istediğimiz dizelerin sayısını girin. Beş diyelim, açık
olması için zzzz diyelim, bunun gibi bir
şey.
Biraz karıştırmışım ama hallolmuş gibi görünüyor, a b d f r z.
Yani işe yarıyor. Yine de bir hatam
var çünkü giriş dizesi yüzde d.
n'deki dize sayısını giriyorum ve sonra eşitten küçük diyorum,
sadece daha küçük demeliyim.
Sadece göstermek için tekrar çalıştıralım, ancak bunu oluşturmam gerekiyor.
Bir şeyleri değiştirdikten sonra inşa etmeyi unutmayın.
Yine, burada herhangi bir şey söyleyeceğiz ve sonra
numara dizeleri. Sadece dört tane
yapalım.
Sonra onları alfabetik olarak sıralayıp d e l z diyorlar, yani iyi görünüyor.
Dolayısıyla, her şeyi fonksiyonlara yerleştirmek isteyebileceğiniz bu kodu kesinlikle
geliştirebilir, daha modüler hale getirebilirsiniz. Ancak bu ödevle anlatmaya çalıştığım şey str compare'ın
nasıl kullanıldığı, strn copy'nin nasıl kullanıldığı ve str length'in nasıl kullanılabileceğidir.
Ayrıca str cat, strn cat ve diğer gerçek yaygın
fonksiyonlarla da oynamalısınız.
Arama yapmak için strstr, strchar ile oynamak isteyebilirsiniz. Bunlar gerçekten çok iyi ya
da karakterleri kontrol etmek için is, upper is, lower ya da
atoi nad atof dönüştürme işlevleri.
Teşekkür ederim. Umarım bu yardımcı olmuştur.