C/C++ Check Symmetry of Array Elements ödevinin kodu doğru mu yazılmış?

Bir kere C ve C++'ta dizi boyutunu kullanıcıdan alamazsın, ki olay zaten orada başlıyor. VS Code'a kodunu yapıştırır yapıştırmaz bağırmaya başladı zaten:
Eki Görüntüle 2044382

STL kütüphanesini kullanmana izin verilmiyor ise new operatörünü kullan. Bir kısıtlama yoksa da std::vector kullan.

Ayrıca derleyip çalıştırdım kodunu, algoritman da yanlış. Onu da sen bul, tüm ödevi ben yapamam. Fakat O(n) zamanda bunu yapmanın bir yolu olabileceğini düşünüyorum.
Üzgünüm ama testcaselerde size yazılıyor.
 
Üzgünüm ama testcaselerde size yazılıyor.
Yazılmıyor demedim ki. Statik allokasyon ile dinamik allokasyonun ne anlama geldiğini biliyor musun?

Edit: Kullanıcıdan alınmıyordan kastım, oluşturduğun dizinin boyutunun ne büyüklükte olacağını kullanıcıdan alamazsın. Alırsın ama o aldığın değişkeni kullanarak diziyi tanımlayamazsın. En azından düşündüğün dizi tanımı için bu geçerli değil.

Statik allokasyon ile yapamazsın demek istediğim. Dediğim linkleri incele.
 
Kodun ne yapması gerektiğini belirtmişim.
Madem "belirttiniz". Kod şöyle olmalıydı. Dediğim gibi sizinki hatalı ve okunaksız.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>

#define ARRAY_SIZE N

void getArrayInput(std::array<int, ARRAY_SIZE>& arr) {
    std::string input;
    std::getline(std::cin, input);
    std::istringstream iss{ input };

    for (auto i{ 0 }; i < ARRAY_SIZE; ++i) {
        iss >> arr[i];
    }
}

bool isArraySymmetric(std::array<int, ARRAY_SIZE>& arr) {
    auto start{ arr.begin() };
    auto end{ arr.rbegin() };

    while (*start == *end) {
        ++start;
        ++end;
    }

    return start == arr.end();
}


int main() {
    std::array<int, ARRAY_SIZE> arr;

    getArrayInput(arr);

    std::cout << "The array is " << (isArraySymmetric(arr) ? "symmetrical\n" : "asymmetrical\n");

    return 0;
}

Yazılmıyor demedim ki. Statik allokasyon ile dinamik allokasyonun ne anlama geldiğini biliyor musun?
Bilse şunu dediğimde hatasını anlardı.

O şekilde dinamik boyutlu C array'i oluşturamazsınız.
 
Madem "belirttiniz". Kod şöyle olmalıydı. Dediğim gibi sizinki hatalı ve okunaksız.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>

#define ARRAY_SIZE N

void getArrayInput(std::array<int, ARRAY_SIZE>& arr) {
    std::string input;
    std::getline(std::cin, input);
    std::istringstream iss{ input };

    for (auto i{ 0 }; i < ARRAY_SIZE; ++i) {
        iss >> arr[i];
    }
}

bool isArraySymmetric(std::array<int, ARRAY_SIZE>& arr) {
    auto start{ arr.begin() };
    auto end{ arr.rbegin() };

    while (*start == *end) {
        ++start;
        ++end;
    }

    return start == arr.end();
}


int main() {
    std::array<int, ARRAY_SIZE> arr;

    getArrayInput(arr);

    std::cout << "The array is " << (isArraySymmetric(arr) ? "symmetrical\n" : "asymmetrical\n");

    return 0;
}


Bilse şunu dediğimde hatasını anlardı.
Fonksiyonlara daha geçmediğim için kendi yazdığım kodu attım.Ayrıca kurs türkçe değil.Türkçemin kötü olmasının sebebi hiç türkiyede yaşamamış olmam.
 
Türkçenize laf eden olmadı. Aradaki yazım farkını göremiyorsanız bir de şöyle deneyelim. Daha okunaklı oldu gerçekten. Hem daha az satır var. JS kodu gibi hızlı da çalışır.

Gözlerim kanadı.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>
#define ARRAY_SIZE N
int main(){
    std::array<int, ARRAY_SIZE> arr;
    std::string input;
     std::getline(std::cin,input);
   std::istringstream iss{input};
  for(auto i{0};i<ARRAY_SIZE;++i){
    iss>>arr[i];
 }auto start{arr.begin()};
    auto end{arr.rbegin()};
   while (*start==*end){
      ++start;
        ++end;
    }
    std::cout<<"The array is "<<(start==arr.end()?"symmetrical\n":"asymmetrical\n");
}

Ne öğrendiğinizi, neleri kullanma izniniz olduğunu söylemediniz. Hatalı ve okunmayan bir kod paylaştınız. Üçüncü kez belirtiyorum.

O şekilde dinamik boyutlu C array'i oluşturamazsınız.
 
Yanlışta ısrar etmek de ayrı bir mantalite, öğrenmek mi istiyorsunuz yoksa bildiğinizi okumak mı? Forum sakinleri için problem yok, günün sonunda zararlı çıkan yine siz olacaksınız. Bu ve önceki konuda yazılanlara dikkat edip, öğrenmeye çalışın yoksa bir cacık gelişemezsiniz.
 
Yanlışta ısrar etmek de ayrı bir mantalite, öğrenmek mi istiyorsunuz yoksa bildiğinizi okumak mı? Forum sakinleri için problem yok, günün sonunda zararlı çıkan yine siz olacaksınız. Bu ve önceki konuda yazılanlara dikkat edip, öğrenmeye çalışın yoksa bir cacık gelişemezsiniz.
Nerede gördünüz ısrar etdiğimi?

Türkçenize laf eden olmadı. Aradaki yazım farkını göremiyorsanız bir de şöyle deneyelim. Daha okunaklı oldu gerçekten. Hem daha az satır var. JS kodu gibi hızlı da çalışır.

Gözlerim kanadı.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>
#define ARRAY_SIZE N
int main(){
    std::array<int, ARRAY_SIZE> arr;
    std::string input;
     std::getline(std::cin,input);
   std::istringstream iss{input};
  for(auto i{0};i<ARRAY_SIZE;++i){
    iss>>arr[i];
 }auto start{arr.begin()};
    auto end{arr.rbegin()};
   while (*start==*end){
      ++start;
        ++end;
    }
    std::cout<<"The array is "<<(start==arr.end()?"symmetrical\n":"asymmetrical\n");
}

Ne öğrendiğinizi, neleri kullanma izniniz olduğunu söylemediniz. Hatalı ve okunmayan bir kod paylaştınız. Üçüncü kez belirtiyorum.
Kodum doğru olsa neden sizinle paylaşayım ki zaten?Kod okunuyor.

Türkçenize laf eden olmadı. Aradaki yazım farkını göremiyorsanız bir de şöyle deneyelim. Daha okunaklı oldu gerçekten. Hem daha az satır var. JS kodu gibi hızlı da çalışır.

Gözlerim kanadı.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>
#define ARRAY_SIZE N
int main(){
    std::array<int, ARRAY_SIZE> arr;
    std::string input;
     std::getline(std::cin,input);
   std::istringstream iss{input};
  for(auto i{0};i<ARRAY_SIZE;++i){
    iss>>arr[i];
 }auto start{arr.begin()};
    auto end{arr.rbegin()};
   while (*start==*end){
      ++start;
        ++end;
    }
    std::cout<<"The array is "<<(start==arr.end()?"symmetrical\n":"asymmetrical\n");
}

Ne öğrendiğinizi, neleri kullanma izniniz olduğunu söylemediniz. Hatalı ve okunmayan bir kod paylaştınız. Üçüncü kez belirtiyorum.
Kodun neresinin okunmadığını tam olaray söyleye bilirmisiniz?
 
Şu ikisi arasındaki farkı anlayamayan birine diyeceğim tek şey benimkiyle farklı olan her yanı yanlış.
Size okunabilen kodunuzla mutluluklar.

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>

#define ARRAY_SIZE N

void getArrayInput(std::array<int, ARRAY_SIZE>& arr) {
    std::string input;
    std::getline(std::cin, input);
    std::istringstream iss{ input };

    for (auto i{ 0 }; i < ARRAY_SIZE; ++i) {
        iss >> arr[i];
    }
}

bool isArraySymmetric(std::array<int, ARRAY_SIZE>& arr) {
    auto start{ arr.begin() };
    auto end{ arr.rbegin() };

    while (*start == *end) {
        ++start;
        ++end;
    }

    return start == arr.end();
}


int main() {
    std::array<int, ARRAY_SIZE> arr;

    getArrayInput(arr);

    std::cout << "The array is " << (isArraySymmetric(arr) ? "symmetrical\n" : "asymmetrical\n");

    return 0;
}

Kod:
#include <iostream>
#include <array>
#include <string>
#include <sstream>
#define ARRAY_SIZE N
int main(){
    std::array<int, ARRAY_SIZE> arr;
    std::string input;
     std::getline(std::cin,input);
   std::istringstream iss{input};
  for(auto i{0};i<ARRAY_SIZE;++i){
    iss>>arr[i];
 }auto start{arr.begin()};
    auto end{arr.rbegin()};
   while (*start==*end){
      ++start;
        ++end;
    }
    std::cout<<"The array is "<<(start==arr.end()?"symmetrical\n":"asymmetrical\n");
}
 
Kodun neresinin okunmadığını tam olaray söyleye bilirmisiniz?
C++:
int main() {
  int size;
  cin>>size;
  int counter = 0 ;
  int array[size];
  for(int f = 0 ; f<size ; ++f) {
    cin >> array[f] ;
  }
    bool marker = false ;
  for (int f = 0 ; f < size ; ++f) {
    for (int s = size ; s == 0 ; --s) {
      if (array[f] == array[s]) {
        marker = true ;
      }
      if (marker) {
       ++counter ;
     }
    }
  }
  if (counter==size) {
    cout << "Symmetrical" << endl ;
  } else {
    cout << "Not Symmetrical" << endl ;
  }
}
Fonksiyonlara gelmediğinizi belirttiğiniz için fonksiyonlar dışında her şeyden bahsedeceğim, fakat normal şartlar altında fonksiyonların her şeyden önce konuşulması ve kullanılması taraftarıyım. Neyse, geçelim.

İlk olarak C++'ta dinamik boyuta sahip array bu şekilde tanımlanmaz. Container tiplerini kullanın bunun yerine. Yada sabit büyüklükte bir array oluşturun, kullanıcının belirttiği kadar alanı kullanın. Örneğin;
C++:
#include<iostream>
#include<array> //C++ 11 Array
#define ARRAY_SIZE 1024

int main(void) {
    std::array<int, ARRAY_SIZE> array;
    int size = 0;
    std::cout << "Lütfen array boyutunu belirtin." << std::endl;
    std::cin >> size;
    for(int i = 0; i < size; i++) {
        //Arrayle bir şeyler yapın
    }
}
Yukarıdaki de hala uygun bir çözüm değil ancak yaptığınız kullanımdan daha sağlıklı. Dinamik kullanım isteniyorsa vector kullanımı daha sağlıklı.

İki indentations/girintiler. Kodunuz berbat durumda girintiler söz konusu olduğunda. Not defterinde mi yazıyorsunuz bilmiyorum. Okumak bile göz rahatsızlığı veriyor.
C++:
int main() {
    int size;
    cin >> size;
    int counter = 0 ;
    int array[size];

    for(int f = 0 ; f<size ; ++f) {
        cin >> array[f] ;
    }
   
    bool marker = false ;

    for (int f = 0 ; f < size ; ++f) {
        for (int s = size ; s == 0 ; --s) {
            if (array[f] == array[s]) {
                marker = true ;
            }

            if (marker) {
                ++counter;
            }
        }
    }

    if (counter==size) {
        cout << "Symmetrical" << endl;
    }
    else {
        cout << "Not Symmetrical" << endl;
    }

    return 0;
}

Girintiler aşağı yukarı böyle olmalı. Her yeni bir scope başlatmadan önce ve sonra bir satır bırakmak adettir. Kodu daha okunabilir kılar.

Üç, using namespace std;. Genel alan adı tanımlarından kaçınılmalı. İlla kısaltmak isteniyorsa scope içerisinde tanımlama yapılabilir ancak öyle bir durumda bile yine de kaçınılması gerekilir. Aynı isme sahip fonksiyonların kafa karışıklığı yaratabilme durumu olduğu gibi okumayı da zorlaştırır.

Eksik, atladığım bir şeyler olabilir. Yine de bunlar bile yeterli olmalı kodunuzun neden okunmaz durumda olduğunu anlatmak için.
 

Technopat Haberler

Yeni konular

Geri
Yukarı