PDA

View Full Version : سوال: پیدا کردن عناصر تکرار شده در آرایه



dj_dj_dj
چهارشنبه 24 تیر 1394, 17:06 عصر
سلام دوستان من میخوام یه برنامه بنویسم که اون عدد هایی که تکرار شده توو آرایه رو نشونم بده برای عضو های آرایه ما 1و2و3و4و5و1و6و2 باشه خرجی برنامه چاپ عدد 2 و 1 باشه
که توو یکی از پست های همین قسمت کاربر sa1378 توو این پست (http://barnamenevis.org/showthread.php?473817-%D8%AF%D9%81%D8%B9%D8%A7%D8%AA-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D9%87%D8%B1-%D8%B9%D9%86%D8%B5%D8%B1-%D8%AF%D8%B1%D9%88%D9%86-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87) یه برنامه نوشتن که با یکم تغییر اونی که من میخواستم شده البته اینجا تعداد دفعات تکرار عدد ه ولی واسه من فقط چاپ اون عدد هایی که تکرار شده . البته با یکم تغییر کار کرد ولی فقط واسه اجرای اول !

#include <iostream>
using namespace std;
#define N 1000
int n,a[N],b[N],c[N],p,ex;

int main() {

n=6;
a[]={1,2,3,4,3,2};

for(int i=0;i<n;i++)
{
ex=0;
for(int j=0;j<n;j++)
{
if(a[i]==b[j])
{
ex++;
c[j]++;
break;
}
}
if(ex==0)
{
b[p]=a[i];
c[p]++;
p++;
}
}
for(int i=0;b[i]!=0;i++)
if (c[i]>1)
cout<<b[i]<<"\n";
return 0;
}



این برنامه واسه اولین بار اجرا کار میکنه ولی برنامه من یه حلقه while که هر بار یه ارایه با اعداد و طول متفاوت رو با همین برنامه اجرا میکنه ولی واسه بار دوم به بعد دیگه یه اعدادی رو تکراری چاپ میکنه
و سوال دوم چرا متغیر ها و آرایه ها به صورت سراسری تعریف شدن وقتی متفیر p رو میارم توو تابع main تعریف میکنم stop working میده میندازه بیرون !!!!
انگار بعد از اینکه ارایه b خروجی رو مرتبه اول داد مرتبه دوم دیگه محتواش پر میشه
یا اگه قطعه کد دیگه ای مد نظرتون هست فقط یه راهنمایی کنین بقیشو در میارم
با تشکر

rahnema1
چهارشنبه 24 تیر 1394, 18:34 عصر
سلام
با استفاده از unordered_map یا map می شه انجام داد

#include <vector>
#include <unordered_map>
#include <iostream>
int main()
{
std::vector<int> arr = {1, 2, 3, 4, 5, 1, 6, 2};
std::unordered_map<int, int> counter;
for (auto& num : arr)
{
if(counter.find(num) == counter.end())
{
counter[num] = 0;
}
else
{
++counter[num];
}
}
for (auto& entry : counter)
{
if(entry.second > 0)
{
std::cout<< entry.first << std::endl;
}
}
}

dj_dj_dj
چهارشنبه 24 تیر 1394, 21:18 عصر
ممنون شما از چه کامپایلری استفاده میکنین؟ GCC کلا به ساختار این گیر میده نمیشه کامپایل کرد
من با وکتور ها کار نکردم راه ساده تری سراغ ندارین

133286

rahnema1
چهارشنبه 24 تیر 1394, 21:41 عصر
از جدید ترین gcc استفاده کنید که حداقل با استاندارد c++11 سازگاری داشته باشه توی codeblocks در قسمت settings , در قسمت تنظیمات compiler این عبارت را اضافه کنید
-std=c++1y

یا std=c++11-
http://www.sharefile.ir/uploads/1437077168.png

dj_dj_dj
چهارشنبه 24 تیر 1394, 22:05 عصر
ممنون کامپایل شد و یه سوال کوچیک دیگه اعداد من توو یه آرایه معمولی یک بعدی هست و تعداد خانه هم مثلا بذاریم 100 نحوه فراخوانی این تابع چطوریه ؟ شرمنده هیچ اطلاعاتی راجع وکتور ها ندارم

rahnema1
چهارشنبه 24 تیر 1394, 22:08 عصر
ممنون کامپایل شد و یه سوال کوچیک دیگه اعداد من توو یه آرایه معمولی یک بعدی هست و تعداد خانه هم مثلا بذاریم 100 نحوه فراخوانی این تابع چطوریه ؟ شرمنده هیچ اطلاعاتی راجع وکتور ها ندارم

خب پیشنهاد می کنم برید وکتور را یاد بگیرید
مثلا آرایه شما اسمش arr باشه

for (int i = 0; i < 100; i++)
{
if(counter.find(arr[i]) == counter.end())
{
counter[arr[i]] = 0;
}
else
{
++counter[arr[i]];
}
}