• 0
fofo_last

ترتيب ملف شكلا

سؤال

السلام عليكم

لدي سؤال متعلق بتنضيم ملف...يعني حجز عدد من الخانات للكلمة في ملف...بحيت يطلع مرتب كل كلمة في عمود ...

انا لدي ملف زي كدا



AlAslAm [AlAslAm] a l a s l a m
AlwHydyn [AlwHydyn] a l w h y d y n
AtxAd [AtxAd] a t kh a d
hm [hm] h m
mnHhm [mnHhm] m n h h m
qwp [qwp] q w pp
ymlkwn [ymlkwn] y m l k w n

واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

حتى يبدو مرتب متل الاتي

AlAslAm [AlAslAm] a l a s l a m

AlwHydyn [AlwHydyn] a l w h y d y n

.........

يعني كل كلمة تحتها كلمة بالضبط وضبط الفراغات بين كلمات في السطر الواحد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

8 إجابة على هذا السؤال .

  • 0

السلام عليكم

لدي سؤال متعلق بتنضيم ملف...يعني حجز عدد من الخانات للكلمة في ملف...بحيت يطلع مرتب كل كلمة في عمود ...

انا لدي ملف زي كدا



AlAslAm [AlAslAm] a l a s l a m
AlwHydyn [AlwHydyn] a l w h y d y n
AtxAd [AtxAd] a t kh a d
hm [hm] h m
mnHhm [mnHhm] m n h h m
qwp [qwp] q w pp
ymlkwn [ymlkwn] y m l k w n

واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

حتى يبدو مرتب متل الاتي

يعني كل كلمة تحتها كلمة بالضبط وضبط الفراغات بين كلمات في السطر الواحد

وخاصة مع تعامل مع ملفات يعني مو بس نص بطبعه لا كيف يتم طباعته مرتب لملف؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

همم .. لم افهم السؤال

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

والله انا ساعات مااعرف اوصف مشكلتي

عموما السموحه

الموضوع ببساطة النص الي فوق هو مخرجات لملف من تلات اعمدة .... بس زي ماشايفين كل شي داخل ببعضه؟؟

وودي يكون ملف مرتب يعني كل كلمة في عمود .......اتمنى وصلت الفكرة؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ...

واريد كل كلمة تكون تحتها كلمات وهكدا منضم...شفت انو في داله justified بس ماعرفت كيف اسويها لكل سطر؟

فكري فيها كأنت تقومين بتصميم برنامج كـ Excel. مجموعة من الصفوف و الأعمدة. خلايا المصفوفة عبارة عن الكلمات, و أطول كلمة في كل عامود هي من يحدد طول الخلية. بالطبع نحتاج للمرور على جميع الكلمات في كل عمود و صف للحصول على أطول كلمة في كل عمود. ثم نقوم بعملية الإخراج بناء على طول أطول كلمة في كل عامود و نضيف الـ justification الإضافية التي نريدها. أنا أضفت مسافتين إضافيتين في لكل عمود. المشكلة أن الكود بـ ++C, لذلك حاولي أن تجدي طريقك فيه :)

#include <cstddef>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

// look down for what this function does!
bool words_count_comparator
(const vector<string>& lhs, const vector<string>& rhs)
{ return lhs.size() < rhs.size(); }

int main()
{
// get the unjustified text from input.txt,
// and produce justified text in output.txt
ifstream input("input.txt");
ofstream output("output.txt", ios::out);
// we store in words_matrix every word in every line alone.
vector<vector<string>> words_matrix;
// this will store how many characters we need in each column.
vector<size_t> columns_justification;
// used for extracting the lines and words out of raw text.
string line, word;
// get the longest line(words per line)
size_t max_words_in_row;

// extract words out of text.
while( getline(input, line) )
{
vector<string> tokenized_line;
stringstream line_tokenizer(line);
while( line_tokenizer >> word )
tokenized_line.push_back(word);
words_matrix.push_back(tokenized_line);
}
max_words_in_row = max_element
(words_matrix.begin(), words_matrix.end(),
words_count_comparator)->size();

columns_justification.resize(max_words_in_row);
for(size_t i = 0; i < words_matrix.size(); ++i)
for(size_t j = 0; j < words_matrix[i].size(); ++j)
columns_justification[j] = max
(words_matrix[i][j].size(), columns_justification[j]);

for(size_t i = 0; i < words_matrix.size(); ++i)
{
for(size_t j = 0; j < words_matrix[i].size(); ++j)
{
// print them with the specified justification for each column.
// we added two spaces for each column as extra spaces.
output << words_matrix[i][j]
<< string(columns_justification[j] - words_matrix[i][j].size()+2, ' ');
}
output << endl;
}
}

المثال التي وضعتيه:

post-89451-074392100 1279233746_thumb.pn

بعد المرور على البرنامج:

post-89451-026849400 1279233752_thumb.pn

تحياتي...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كما قال خالد،

و هذه نسخة بايثونية .. لاحظ الفرق الشاسع بين الاناقة و التشابك!


maxes = {}
table = []
for line in open("input.txt"):
parts = line.split()
for index, part in enumerate(parts):
maxes[index] = max(len(part), maxes.get(index,0))
table.append(parts)
for row in table:
for index, col in enumerate(row):
print col.ljust(maxes.get(index) + 1),
print


و هنا المدخلات و المخرجات:



hasenj ~/tmp
$ cat input.txt
AlAslAm [AlAslAm] a l a s l a m
AlwHydyn [AlwHydyn] a l w h y d y n
AtxAd [AtxAd] a t kh a d
hm [hm] h m
mnHhm [mnHhm] m n h h m
qwp [qwp] q w pp
ymlkwn [ymlkwn] y m l k w n

hasenj ~/tmp
$ python cols.py
AlAslAm [AlAslAm] a l a s l a m
AlwHydyn [AlwHydyn] a l w h y d y n
AtxAd [AtxAd] a t kh a d
hm [hm] h m
mnHhm [mnHhm] m n h h m
qwp [qwp] q w pp
ymlkwn [ymlkwn] y m l k w n



شيء من الشرح:

ljust ياخذ كلمة و يعملها left justify بمعنى يضيف مسافات لكي يجعل الكلمة تاخذ مساحة اضافية، بحسب البارامتر. مثلا:


"abc".ljust(6)

سيضيف مسافات لكي يكون طول النص 6 احرف (تخيل ان - هي مسافة) ستكون النتيجة:


abc---

بالنسبة لاطوال الخانات .. استخدمت dictionary لتخزين عرض كل عمود. في البداية فكرت في استخدام list و لكن لاحظت اننا لا نعرف كم عدد الاعمدة، لهذا استخدمت dictionary بدلا من ذلك (كان يمكن بسهولة ان استخدم list ايضا .. و لكن القلب و ما يهوى :lol: )

الدكشنري عنده خاصية get تسمح لنا بارجاع قيمة اصلية اذا لم يكن الـ key موجودا

مثلا الدكشنوي هذا فيه 'a' و 'b' و لكن ليس فيه 'c':


>>> d = {'a': 5, 'b': 10}
>>> d.get('a', 2)
5
>>> d.get('b', 2)
10
>>> d.get('c', 2)
2
>>>

الفنكشن max ياخذ متغيرين و يعطينا الاكبر منهم.

عن طريق جميع الفكرتين معا في سطر واحد ..


maxes[index] = max(len(part), maxes.get(index,0))

ناخذ طول الكلمة الحالية

و اطول طول سابق سجلناه في العمود رقم index

و ناخذ الاكبر بينهما

و نسجله على انه اطول طول معروف لحد الان في العمود رقم index

تم تعديل بواسطه hasan_aljudy
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنا طلعت جاي أبيع الماء في حارة السقايين :lol:

أكيد يا حسن لا يمكن المقارنة بين Python و ++C في هذا النوع من البرامج, لأن Python أفضل بكل بساطة. عموماً, أنا لم أرد استخدام Boost, و إلا كان الكود سيصبح أفضل بكثير و أقرب لكود Python, و لكن ليس كثيراً :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكورين ماقصرتو

بشوف الكود وبطبقه

جزاكم الله عني كل الخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .