الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كود لا يظهر اخطاء ولا يتم تنفيذه

بدأه yousefal في 25 فبراير 2012 · 8 رد · 678 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي الكود التالي

#include <stdio.h>
#include <stdlib.h>
/*
THIS PROGRAM TO ADD NODE AT THE FIRST ONLY AND AT FINAL WILL PRINT ALL THE DATA
*/
typedef struct node {
int day;
float av;
struct node *next;}student;
int main()
{student *head ,*n ,*k;
head=(student*)malloc(sizeof(student));
printf("give me day & av");
scanf(" %d%f",head->day,head->av);

printf("do u want to enter new value :yes press yes ,,other press any key");
char x=getchar();
while(x=='y')//ربما نقوم بدور مرادف من خلال استخدام اقترانات النصية
{printf("give me day &av");
n=(student*)malloc(sizeof(student ));
scanf(" %d%f",n->day,n->av);
n->next=head;
head=n;
    //قم بالتالي:اضف نود جديدة واربطها لتسبق ما قبلها ثم اظهر جملة الطباعة
    printf("do u want to enter new value :yes press yes ,,other press any key");
    char x=getchar();
}

//ما تبقى من حالات حين يرفض ادخال نود جديدة نطلب منه طباعة كل النود الموجود

k=head;
while(k!=NULL)
{
     printf("%d%f",k->day,k->av);
  k=k->next;
}
    return 0;
}

لا يظهر فيه اي اخطاء لكن حين التنفيذ لايتم تنفيذه .. علما بان وظيفة الكود مذكورة فيه..

الصورة ادناه للتوضيح

412526479.jpg

#2

عذرا لقد التزمنا بأن لك مشاركة مشكلة واحدة يتناولها اﻻعضاء.

الحمد لله انك قمت بنقل الكود الى مشاركة جديدة

المشكلة الرئيسية بهذا الكود وهوكود سي وليس سي++ وهى كيفية التخلص من علامة السطر الجديد \n الموجودة بمنطة الذاكرة المؤقتة أحد الحلول لهذة المشكلة هو استخدام الدالة getchar() لألتقاط علامة السطر الجديد وان لم نفعل ذلك فأنها سوف تعتبر قيمة مدخلة عند استدعاء الدالة getchar() للمرة الثانية .

يمكن اختبار ذلك بساطة عندما تستدعى دالة getchar() بعد دالة getchar()

هذة المشكلة فى لغة سي أن شاء الله لى وقفة معها قريبا .

/* 
 * File:   main.c
 * Author: auda
 *
 * Created on February 25, 2012, 9:23 PM
 */
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int day;
    float av;
    struct node *next;
} student;

int main()
{
    student *head = 0 ,*pNewNode ,*pCurrent = 0, *plast = 0;
    int Day=0;
    float Av=0.00;

    printf("do u want to enter new value :(y) press yes\nother press any key: ");

    while( getchar() == 'y')
    {
        pNewNode =(student*)malloc(sizeof(student));
        printf("give me day: "); scanf("%d",&Day);
        printf("give me day & av: "); scanf("%f", &Av);

        pNewNode->day = Day;
        pNewNode->av = Av;
        pNewNode->next = 0;

        if(head == 0 )
        {
            head = pNewNode;
            plast = pNewNode;
        }
        else
        {
            plast->next = pNewNode;
            plast = plast->next ;
        }

        printf("Do u want to enter new value :press (y) yes\no press any key to Continue: ");
        getchar();
    }

    pCurrent = head;
    while(pCurrent != NULL)
    {
        printf("\n%d, %f",pCurrent->day,pCurrent->av);
        pCurrent = pCurrent->next;
    }
    printf("\n");
    return 0;
}

واليك مخرجات الكود:

do u want to enter new value :(y) press yes
other press any key: y
give me day: 3
give me day & av: 4
Do u want to enter new value :press (y) yes
o press any key to Continue: y
give me day: 6
give me day & av: 7
Do u want to enter new value :press (y) yes
o press any key to Continue: y
give me day: 2
give me day & av: 90
Do u want to enter new value :press (y) yes
o press any key to Continue: n

3, 4.000000
6, 7.000000
2, 90.000000

RUN SUCCESSFUL (total time: 2m 6s)

تقبل مرورى والله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 26 فبراير 2012 في 00:13

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

لكن يا اخي الكريم لو تجري عليه تعديلاات ليعمل بحيث تكون التعديلات بسيطة قدر الامكان مع اجراء اقل ما يمكن من التغييرات على الكود اللي انا وضعته .. يعني وكانك وضعت كود جديد وانا اريد بناء على شي افهمه .. يعني ان لم يكن هنالك خطا في جمل الربط فلا باس من ابقائها كما هي والتعديل فقط في الاقتران getchar......

#4

السلام عليكم ورحمة الله وبركاته

أقدر أخى أنك تريد أن تبنى على شيئ تفهمه ولكن إطلاعك على طريقة حل الأخرين سوف تكسبك مهارات أكثر بالإضافة لمهاراتك ... حاول أن تفهم وتحلل أكواد الأخرين ستفيدك أنت كثيراً ... وليس عيباً أن تعمل على كود غيرك

بل كونك إستطعت أن تفسره وتبنى عليه وتطور فيه سوف يكسبك مهارات أكثر لا شكك.

بالنسبه لكودك ضع علامة & قبل المتغيرات التى تستقبلها من المستخدم عن طريق جمله scanf , أى تضع لجملة scanf عناوين المتغيرات .

أى تصبح جملة scan على الشكل التالى :

scanf(" %d%f",&head->day,&head->av);

وبالنسبة للتحقق لإدخال قيمة جديدة أو الخروج فكما أسلف الذكر الأخ محمد عن إستخدام دالة getchar , أو فقم بإستخدام جملة scanf لقراءه حرف على سبيل المثال .

وأيضاً لماذا قمت بتعريف المتغير x مره أخرى راجع شرح " فتره حياه المتغيرات "

وبالنسبة للكود بشكل عام حاول من تحسين طريقة عمله وإستخدم الدوال لمزيد من التنظيم والتعامل بسهوله مع مقاطع البرنامج. ... وهذا يأتى كما أسلفت بالإطلاع على نفس عمل البرنامج بأساليب أخرى ...

والسلام عليكم

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 26 فبراير 2012 في 02:50

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#5

أخى الكريم:

لقد كانت مشكلة الكود فى السطر الجديد وتم حلها.

وبما اننا نعى تماما انة ﻻيمكن ان يعمل الكود بالصورة السابقة الا لعدد اثنين عقدة أى كتلة بيانات فأننا قمنا بأدخالة فى دوراة وتعديلة بيما يحقق ابسط مفاهيم تركيب القائمة الموصولة.

أم اﻻن المشكلة فى فهم تركيب البيانات المسمى القائمة الموصولة

عليك اﻻجابة على اﻻسئلة التالية وان شاء الله سيكون التمرين بالنسبة لك متعة ﻻ مشقة:

1.ماهى القائمة الموصولة؟

2.فكرة ربط كل عقدة بأخرى فى القائمة الموصولة؟

أنصحك بأستخدام محرك جوجل بأسفل الصفحة واكتب قائمة موصولة- تراكيب البيانات -

أخى اذا كنت تريد المثابرة واالتعلم فعليك فهم تركيب القائمة الموصولة. أم اذا كنت تريد الحل على نهج طريقة حلك ساحاول أن ارسلة لك ﻻنة بة أخطاء فنية؟

اليك الكود:

/*
 * File:   main.c
 * Author: caster
 *
 * Created on February 26, 2012, 8:42 AM
 */

#include <stdio.h>
#include <stdlib.h>

/*
THIS PROGRAM TO ADD NODE AT THE FIRST ONLY AND AT FINAL WILL PRINT ALL THE DATA
 */
typedef struct node {
    int day;
    float av;
    struct node *next;
} student;

int main() {
    student *head, *n, *k;
    head = (student*) malloc(sizeof (student));
    printf("Give me day & av: ");
    scanf("%d%f", &head->day, &head->av);
    getchar();
    printf("do u want to enter new value :yes press yes ,,other press any key");
    char x = getchar();
    while (x == 'y')//ربما نقوم بدور مرادف من خلال استخدام اقترانات النصية
    {
        printf("give me day &av");
        n = (student*) malloc(sizeof (student));
        scanf(" %d%f", &n->day, &n->av);
        n->next = head;
        head = n;
        //قم بالتالي:اضف نود جديدة واربطها لتسبق ما قبلها ثم اظهر جملة الطباعة
        printf("do u want to enter new value :yes press yes ,,other press any key");
        x = getchar();
        getchar();
    }

    //ما تبقى من حالات حين يرفض ادخال نود جديدة نطلب منه طباعة كل النود الموجود

    k = head;
    while (k != NULL) {
        printf("\n%d%f", k->day, k->av);
        k = k->next;
    }
    return 0;
}

تحياتى العطرة والله ولى التوفيق

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 26 فبراير 2012 في 09:52

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#6

شكرا لكم جميعا .. بالطبع اريد الفهم اكثر من التلقين لكن احيانا الوقت لايسمح للفهم !!

#7
ahmedsaoud31 كتب:

السلام عليكم ورحمة الله وبركاته

أقدر أخى أنك تريد أن تبنى على شيئ تفهمه ولكن إطلاعك على طريقة حل الأخرين سوف تكسبك مهارات أكثر بالإضافة لمهاراتك ... حاول أن تفهم وتحلل أكواد الأخرين ستفيدك أنت كثيراً ... وليس عيباً أن تعمل على كود غيرك

بل كونك إستطعت أن تفسره وتبنى عليه وتطور فيه سوف يكسبك مهارات أكثر لا شكك.

بالنسبه لكودك ضع علامة & قبل المتغيرات التى تستقبلها من المستخدم عن طريق جمله scanf , أى تضع لجملة scanf عناوين المتغيرات .

أى تصبح جملة scan على الشكل التالى :

scanf(" %d%f",&head->day,&head->av);

وبالنسبة للتحقق لإدخال قيمة جديدة أو الخروج فكما أسلف الذكر الأخ محمد عن إستخدام دالة getchar , أو فقم بإستخدام جملة scanf لقراءه حرف على سبيل المثال .

وأيضاً لماذا قمت بتعريف المتغير x مره أخرى راجع شرح " فتره حياه المتغيرات "

وبالنسبة للكود بشكل عام حاول من تحسين طريقة عمله وإستخدم الدوال لمزيد من التنظيم والتعامل بسهوله مع مقاطع البرنامج. ... وهذا يأتى كما أسلفت بالإطلاع على نفس عمل البرنامج بأساليب أخرى ...

والسلام عليكم

لم تنجح للاسف .. تبقى الوضع كما هو :S

#8

السلام عليكم

اقتباس
لم تنجح للاسف .. تبقى الوضع كما هو :S

أنا ما قلته هو حل للمشكله الموجوده فى الصوره وهى توقف البرنامج عن العمل وإظهار الرسالة كما فى الصورة عند إدخال البيانات . فهل ظهرت لك رسالة الخطأ مره أخرى ؟؟؟؟؟؟؟؟؟؟؟

وبالنسة لدالة getchar هل غيرت طريقه إستخدامك لها ؟

عموماً هذا هو برنامجك كما هو قمت بتجربته وهو يعمل بعد التعديلات التى ذكرتها لك فى المشاركة السابقة :

#include <stdio.h>
#include <stdlib.h>
/*
THIS PROGRAM TO ADD NODE AT THE FIRST ONLY AND AT FINAL WILL PRINT ALL THE DATA
*/
typedef struct node {
int day;
float av;
struct node *next;}student;
int main()
{student *head ,*n ,*k;
	char x;
head=(student*)malloc(sizeof(student));
printf("give me day & av");
scanf(" %d%f",&head->day,&head->av);

printf("do u want to enter new value :yes press yes ,,other press any key");

scanf("%s",&x);
while(x=='y')//ربما نقوم بدور مرادف من خلال استخدام اقترانات النصية
{printf("give me day &av");
n=(student*)malloc(sizeof(student ));
scanf(" %d%f",&n->day,&n->av);
n->next=head;
head=n;
    //قم بالتالي:اضف نود جديدة واربطها لتسبق ما قبلها ثم اظهر جملة الطباعة
    printf("do u want to enter new value :yes press yes ,,other press any key");
    scanf("%s",&x);
}

//ما تبقى من حالات حين يرفض ادخال نود جديدة نطلب منه طباعة كل النود الموجود

k=head;
while(k!=NULL)
{
     printf("%d %f\n",k->day,k->av);
  k=k->next;
}
    return 0;
}

إن لم تحل المشكلة أنصحك بتغيير الكومبايلر أو تنزيل نسخة جديدة لجهازك وتهيئة الكومبايلر من جديد !!!

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 27 فبراير 2012 في 03:41

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#9
يوسف حسين كتب:

لم تنجح للاسف .. تبقى الوضع كما هو :S

اخى يوسف هذا الكود فى المشاركة رقم 5 كود قياسى وقمت بتشغيلة على بيئتى تطوير NetBeans IDE 7.1 و Qt Creator-2.4.1 و Code::Blocks IDE 10.5 على ابينتو Ubuntu 10.10

وكان التشغيل يشمل اﻻختبار.

لعلك تأخذ باﻻقتراح الذى تبناة اخى أحمد أنصحك بأستخدام بيئة NetBeans IDE 7.1 المخصصة للسي واليس++

تقبل مرورى والله ولى التوفيق ... .

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

مواضيع مشابهة