مشکل:در تفکیک یک مجموعه

mhabat

Member
سلام.
من می خوام از کاربر یک مجموعه مثل:
کد:
uint8_t k[] ={0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
از کاربر بگیرم و اون رو به دو قسمت تبدیل و نمایش بدم.
به این شکل:
کد:
uint8_t  f_state[4] = {0x04,0x00,0x00,0x00};
* uint8_t ff_state[4] = {0x00,0x00,0x00,0x00};
حالا فکر کنید من یک مجموعه 80 بیتی رو از کاربر بگیرم چطور میتونم تقسیمش کنم به دو زیر مجموعه؟
اون صفز ها یعنی 8بایت فکر کنم تو code block.
شما اطلاعاتی در مورد unti8دارین؟
در ضمن حروف فارسی در سی یا سی پلاس پلاس باید به unit8باشند؟یا اسکی؟یا هیچ کدام؟

خیلی ممنون.
 

the_king

مدیرکل انجمن
سلام.
من می خوام از کاربر یک مجموعه مثل:
کد:
uint8_t k[] ={0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
از کاربر بگیرم و اون رو به دو قسمت تبدیل و نمایش بدم.
به این شکل:
کد:
uint8_t  f_state[4] = {0x04,0x00,0x00,0x00};
* uint8_t ff_state[4] = {0x00,0x00,0x00,0x00};
حالا فکر کنید من یک مجموعه 80 بیتی رو از کاربر بگیرم چطور میتونم تقسیمش کنم به دو زیر مجموعه؟
اون صفز ها یعنی 8بایت فکر کنم تو code block.
شما اطلاعاتی در مورد unti8دارین؟
در ضمن حروف فارسی در سی یا سی پلاس پلاس باید به unit8باشند؟یا اسکی؟یا هیچ کدام؟

خیلی ممنون.
uint8 یعنی یک عدد integer که بیتی برای علامت مثبت و منفی نداشته باشد (unsigned) و 8 بیتی باشد (یک بایت).
در کامپایلر هایی که با رشته های ANSI یا ASCII کار می کنند، نوع داده uint8 همان unsigned char است،
چون char در سیستم ASCII و ANSI یک بایت است.

یک مجموعه 80 بیتی، 10 عضو از نوع char است، یعنی یک آرایه [char[10 که هر کدام از اعضاء یک char هستند.
هر char یک مقدار بین 0x00 الی 0xff هگزادسیمال یا به عبارتی از 0 الی 255 دسیمال را نگهداری می کند.

رشته ای که از کاربر می گیرید یک فرمت و قالب مشخص داره که دست خودتان است و به کاربر اعلام می کنید،
بر اساس اون قالب یکی یکی عضو ها رو جدا می کنید و وقتی همگی جدا شدند بر اساس تعداد عضو ها
دو آرایه جداگانه از نوع char ایجاد کرده و نصف شان را در اولی و بقیه را در دومی درج می کنید.
 

mhabat

Member
سلام.آقا خیلی خوب توضیح میدین.ممنون.

نقل قول:رشته ای که از کاربر می گیرید یک فرمت و قالب مشخص داره که دست خودتان است و به کاربر اعلام می کنید.

میشه یه راهنمایی کنید چطور می تونم فرمت و قالب بنویسم.
برای جدا سازی تک تک عضو ها اونم متوجه نمیشم.
لطفا فقط راهنمایی کنید.کد رو خودم مینویسم.
مرسی
 

the_king

مدیرکل انجمن
سلام.آقا خیلی خوب توضیح میدین.ممنون.

نقل قول:رشته ای که از کاربر می گیرید یک فرمت و قالب مشخص داره که دست خودتان است و به کاربر اعلام می کنید.

میشه یه راهنمایی کنید چطور می تونم فرمت و قالب بنویسم.
برای جدا سازی تک تک عضو ها اونم متوجه نمیشم.
لطفا فقط راهنمایی کنید.کد رو خودم مینویسم.
مرسی

فرض کنید قالب این باشه، یک عدد هگزادسیمال (با 0x شروع شود)، بعد کاراکتر جداکننده ای مثل ,
و مجددا یک هگزادسیمال دیگر و باز یک جداکننده , و ...
حالا شما رشته ورودی رو از ابتدا تا انتها پردازش می کنید :

1) اشاره گر p را روی ابتدای رشته ورودی s تنظیم می کنید و متغیر count (تعداد مقادیر) برابر 0 است.
2) اگر p* کاراکتر null بود به انتهای رشته رسیده اید و تمام.
3) اگر p* کاراکتر 0 و (p + 1)* کاراکتر x بود به مرحله 5 می روید (مقدار جدید)
4) مقدار p* کاراکتری است که در فرمت پیش بینی نشده، پیغام خطا.
5) مقدار p را دو واحد افزایش می دهید (از روی 0x می گذرید) و متغیر n را صفر می کنید.
6) اگر p* کاراکتری بین 0 الی 9 یا کاراکتر a الی f باشد عدد متناظر اش (0 الی 15) را با n * 16 جمع کرده و
نتیجه را در n ذخیره کنید (n = n * 16 + c) ، مقدار p را یک واحد افزایش داده و به مرحله 6 باز گردید.
7) مقدار n را در [array[count ثبت کرده و count را یک واحد افزایش دهید.
8) اگر p* کاراکتر , باشد مقدار p را یک واحد افزایش دهید.
9) به مرحله 2 باز گردید.

حالا count تعداد مقادیر و array آرایه ای است که مقادیر در آن قرار گرفته.
 

mhabat

Member
سلام.خیلی ممنون.
4)این قسنت رو تموجه نمشم.
6)نمی تانم کاری کنم که عدد متناظر رو جمع کنم(به جاش pگزاشتم)

مشکلی داره اگه ازwhileوgetlineاستفاده کنم؟

برای اینکهarrayرو به صورت دوقمت نمایش بدم می تونم یک اشاره گر تعریف کنم که تا نصف مقدارcountرو چک کنه؟ودر یک آرایه دیگه
بریزه؟و بقیشو در یک آرایه دیگه؟(مشکلی نداره؟)
سورس:
کد:
#include<conio.h>
#include<iostream.h>
#include<string.h>
int main() {
char a[1024];
int n,count=0;
cin>>a;
while(!getline(a)){
char *p=a;
here:
if(p=='\0')
break;
else if((*p=='\0')&&(*P+1=120))
p+=2;
n=0;
if((*p>=0 && *p<=9) || (*p>=97 && *p<=101)){
n=n*16+p;
p++;
contenue;
}
a[count]=n;
n++;
if(p!='\0')
p++;
goto gere;
}
getch();
return 0;\}
 

mhabat

Member
سلام.قسمت جدا سازی شو از یکی گرفتم مشکلی نداره؟
کد:
void functionpln(uint8_t *input,uint8_t *des1,uint8_t *des2)
{
int i;
 
for(i=0;i<4;i++)
{
des1[i]=input[i];
}
 
for(i=4;i<8;i++)
{
des2[i]=input[i];
}
printf("\npln:%X,%X",des1,des2);
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام.خیلی ممنون.
4)این قسنت رو تموجه نمشم.
6)نمی تانم کاری کنم که عدد متناظر رو جمع کنم(به جاش pگزاشتم)

مشکلی داره اگه ازwhileوgetlineاستفاده کنم؟

برای اینکهarrayرو به صورت دوقمت نمایش بدم می تونم یک اشاره گر تعریف کنم که تا نصف مقدارcountرو چک کنه؟ودر یک آرایه دیگه
بریزه؟و بقیشو در یک آرایه دیگه؟(مشکلی نداره؟)
مرحله 4 ، قراره ارقام با 0x شروع شوند، اگر به کاراکتر دیگری بجز اینها مثل % رسیدید معلوم است که رشته ورودی
ایراد دارد. اگر به مرحله 4 رسیدید پس رشته ورودی ایراد دارد، همین. باید یک پیغام خطا به کاربر نشان دهید.

عدد متناظر یعنی یک کاراکتر هگزادسیمال را به معادل عددی دسیمال اش تبدیل کنید، یعنی برای کاراکتر های
'0' الی '9' به ترتیب اعداد 0 الی 9 و برای کاراکتر های 'a' الی 'f' به ترتیب اعداد 10 الی 15 را بدست بیاورید و در
متغیری مثل c قرار دهید.

شما یکبار بیشتر که getline نمی کنید، همان اول که رشته ورودی را دریافت می کنید. از آن به بعد در حلقه
while صرفا کاراکتر های ورودی رو از ابتدا تا انتها پردازش می کنید.
اگر تعداد ارقام ورودی مشخص است، می توانید موقع ثبت کردن در آرایه تفکیک شان کنید، وگرنه باید همه را
در یک آرایه بخوانید تا در انتها بدانید چند تا مقدار هستند که بعد بتوانید تقسیم شان کنید.

کد:
#include <iostream.h>
#include <conio.h>
#include <string.h>

int main()
{
    char a[1024];
    int part1[5], part2[5], n, i, count = 0;
    for (i = 0; i < 5; i++)
    {
        part1[i] = 0;
        part2[i] = 0;
    }
    cin.getline(a, 1024);
    char *p = a;
    while (*p)
    {
        if ((*p == '0') && (*(p + 1) == 'x'))
        {
            p += 2;
            n = 0;
            do
            {
                if ((*p >= '0') && (*p <= '9'))
                {
                    n = n * 16 + *p - '0';
                    p++;
                }
                else if ((*p >= 'a') && (*p <= 'z'))
                {
                    n = n * 16 + *p - 'a' + 10;
                    p++;
                }
                else if ((*p == ',') || (*p == '\0'))
                {
                    if (count < 5)
                    {
                        part1[count] = n;
                        count++;
                    }
                    else if (count < 10)
                    {
                        part2[count - 5] = n;
                        count++;
                    }
                    if (*p == ',')
                        p++;
                    break;
                }
                else
                {
                    if (*p)
                    {
                        cout << "'" << *p << "' is a invalid character!" << endl;
                        p++;
                    }
                    break;
                }
            } while(1);
        }
        else
        {
            cout << "'" << *p << "' is a invalid character!" << endl;
            break;
        }
    }
    cout << "Part 1 : ";
    for (i = 0; i < 5; i++)
        cout << part1[i] << ", ";
    cout << endl << "Part 2 : ";
    for (i = 0; i < 5; i++)
        cout << part2[i] << ", ";
    getch();
    return 0;
}
 

mhabat

Member
سلام.خیلی ممنون بابت سورس.
این قسمت رو متجه نمشم.چرا دو بار یک دستور رو زیدنبرا چاپ؟ اون ifو elseرو نفهمیدم.
اون while(1)1منظورتون همون trueوfaleکه بعضب از کامپایلر ها نمیشناسنش؟
چرا از while(1)1استفادده کردیم؟ک اون یک میشه صفر؟
کد:
if (*p)
                    {
                        cout << "'" << *p << "' is a invalid character!" << endl;
                        p++;
                    }
                    break;
                }
            } while(1);
        }
        else
        {
            cout << "'" << *p << "' is a invalid character!" << endl;
            break;
فقط این قسمت هاشو نفهمیدم اما بقیه جاهاش مشکلی ندارم.
خیلی ممنون
بدرود
 

the_king

مدیرکل انجمن
سلام.خیلی ممنون بابت سورس.
این قسمت رو متجه نمشم.چرا دو بار یک دستور رو زیدنبرا چاپ؟ اون ifو elseرو نفهمیدم.
اون while(1)1منظورتون همون trueوfaleکه بعضب از کامپایلر ها نمیشناسنش؟
چرا از while(1)1استفادده کردیم؟ک اون یک میشه صفر؟
فقط این قسمت هاشو نفهمیدم اما بقیه جاهاش مشکلی ندارم.
خیلی ممنون
بدرود
true و false در شرط های بولی در واقع مقدار عددی اند، عدد صفر همان false است و هر عددی بجز صفر به معنای
true است. چه (while (1 باشد و چه (while (123 و چه (while (-1 فرقی نمی کند. برای سازگار با همه کامپایلر ها از
true و false استفاده نمی کنم.

موقعیت هایی که می توانید کاراکتر غیر قابل قبول وارد کنید فقط یک جا نیست، می توانید بعد از 0x کاراکتر غیر مجاز
وارد کنید و یا قبل و بعد از کاراکتر , به همین دلیل در دو موقعیت مختلف بروز خطا را بررسی می کنیم. این دو پیغام
در دو بخش جدا هستند و هیچوقت برای یک کاراکتر غیر مجاز هر دو پیغام نمایش داده نمی شوند، بستگی دارد
که کاراکتر غیر مجاز مورد نظر بعد از 0x باشد یا قبل از آن.
 

جدیدترین ارسال ها

بالا