Solved

Having Trouble with my C Script that determines Prime and Perfect numbers HELP!:)

Posted on 2004-10-28
372 Views
Last Modified: 2011-09-20
I am having problems making this script below work.  I want this script to check the numbers input from file imput.txt and tell me if they are Prime or Perfect.  (example numbers would be 110, 7, 10, 6 etc.  New to C and trying to learn it by doing these types of excersizes.  Can someone tell me what I am doing wrong?

Thanks in advance,

Jennifer  SEE SCRIPT BELOW:)


# include <stdio.h>
# include <math.h>

int main ()
{
       FILE *inp;
       FILE *outp;
     int num, total, i;
     float ans;
       int IsPrim;


//Initialize
     num = 0;

     do
          {
              inp=fopen("C:input.txt", "r");
              outp=fopen("C:output.txt", "w");

              fscanf(inp, "%d", num);
              printf(outp, "%d", num);

          /* printf("\nEnter a number from 1 to 1000>");
          scanf("%d", num); */
          }
     while (num<=0 || num>=1001);

//Initialize
     total = 0;
     ans = 0;

// For prime
    ans = 1;
    IsPrim = 1;

    for(i = 2; i < num; i++);
       if ( num % i == 0)
       {
          IsPrim=0;
          printf("Divisor of prime");
       }
    if(IsPrim)
       printf("It is Prim");

// For perfect

         total = 0;
         for ( i = 1; i < num; i++)
             if(num%i==0)
                total+=i;
         if(total==num)
         {
             printf("Perfect");  
             for ( i = 1; i < num; i++)
                if(num%i==0)
                   printf("Perfect divisor");
         }

             
fclosef (inp);
fclosef (outp);
return (0);

}
0
Question by:jenmaz
    46 Comments
     
    LVL 11

    Expert Comment

    by:avizit
    >>
     do
              {
                inp=fopen("C:input.txt", "r");
                outp=fopen("C:output.txt", "w");

                fscanf(inp, "%d", num);
                printf(outp, "%d", num);

              /* printf("\nEnter a number from 1 to 1000>");
              scanf("%d", num); */
              }
         while (num<=0 || num>=1001);
    <<

    this will terminate the loop for numbers like 1 , 2, 3 ...etc

    as the number is not <=0 and >= 1001

    so your program will exit the loop after the first number ...
    0
     

    Author Comment

    by:jenmaz
    Thanks for the comments.  I think I understand.  So I would need to take the while (num<=0 || >=1001) at the end of the entire program and make the Perfect LOOP as well as the PRIME check loop as functions and do a function call?

    Thanks in advance,
    Jennifer
    0
     
    LVL 11

    Accepted Solution

    by:
    here is a rough skeleton


    main(){
       
    1. open files
    2. Do{
               read a number
              if number >=1 and <=1000  
                 check_if_prime(number);
                 if (prime)
                       print "prime"
                 else
                       print "not prime"
           }while(!eof)



    explanation :

    1. first of all your conditon was wrong
    >>>>> while (num<=0 || >=1001)
            so only numbers <= 0 or numbers >= 1001 will satisfy the above condition . i.e numbers like -1 ,-2 or 10987867867868  :)
    also you dont need the condition in the while loop as in that case , you wilexit the program when you encounter the first number which doesnt satisfy ( maybe that's what you want .. but anyway you need to be clear on this ..

    so you need a condition like

    while ((num >=1) && (num <=1000) )

    but i think you dont need the condition in the "while" anyway cos in that case if your file has

    10
    12
    -1
    3
    4
    5
     the loop will exit when -1 is encountered

    hence i think you should use the "rough steps" given at top and check for the numbers inside the loop

    Hope I make myself clear .and dint confuse you more
    0
     
    LVL 45

    Assisted Solution

    by:sunnycoder
    There are a number of issues with your program

    # include <stdio.h>
    # include <math.h>

    int main ()
    {
          FILE *inp;
          FILE *outp;
         int num, total, i;
         float ans;
          int IsPrim;


    //Initialize
         num = 0;

         do
              {
                inp=fopen("C:input.txt", "r");        << These file operations have been included within the loop ... this means that in each iteration, file will be opened again and again and previous file handle/descriptor, overwritten .... this is not a very good idea and will lead to leaking file descriptors (yes they are a precious progamming resource) ... Move the file openeing to the beginning of the program, outside the loop .... Once you do this, you will be opening the files only once, at the beginning of the program and closing them before you exit ...

                outp=fopen("C:output.txt", "w");

                fscanf(inp, "%d", num);   << arguments to any scanf need not the variable name but variable address ... this statement should have been fscanf (inp, "%d", &num); ... notice the & (address of operator) infront of num ... note that it is required only for scanf family of functions and not printfs ...

                printf(outp, "%d", num);  <<perhaps you wanted fprintf here

              /* printf("\nEnter a number from 1 to 1000>");

              scanf("%d", num); */   << again missing & ... also this will be read from keyboard and not file ... are you sure you want scanf and not fscanf here ?

              }
         while (num<=0 || num>=1001);  << note that this check is carried out at the end of the loop ... within the loop you are reading two values into variable num ... thus the first value is getting overwritten and this test will appply only to the second value read in the loop ... either you should be reading one value in the loop or you should be storeing them separately and checking them both ... Former is preferable


    <<by the time you get out of the loop, you would have read several values into the same variable num, each read overwriting the previous value and processed none of them !!! So there was no point in reading those values ... you need to move these checks to inside loop .... If you have been reading a bit about functions, this might be the place to use them
    //Initialize
         total = 0;
         ans = 0;

    // For prime
        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num; i++);  << this loop can be terminated at a value atleast 1/2 num ....
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");

    // For perfect

             total = 0;
             for ( i = 1; i < num; i++)
                 if(num%i==0)
                    total+=i;
             if(total==num)
             {
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");
             }

               
    fclosef (inp);
    fclosef (outp);
    return (0);

    }

    There might be more issues but this should be enough to get you going ... Obviously there are some compilation errors that you must have encountered while compiling this program ... it helps us a lot if you post all those EXACT error messages ...

    cheers
    sunnycoder
    0
     

    Author Comment

    by:jenmaz
    Thanks Sunnycoder..  I am almost getting it but I am having problems with the fclosef statement.  

    Basically I would like to read numbers from an imput.txt files.  Any numbers and then tell the user that the number read was prime or a perfect number and the program would run until the there are no more numbers or if the number read is -999.  After I get this running then I want to figure out how to make the Prime and Perfect a function and just place a function call in the loop.  Hope this makes sense.  I am trying to understand it.  Think I am getting it.



    My code is below.... The error I am getting when compiling is this.

    --------------------Configuration: perfectnumber - Win32 Debug--------------------
    Compiling...
    perfectnumber.c
    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(60) : warning C4013: 'fclosef' undefined; assuming extern returning int
    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(64) : fatal error C1004: unexpected end of file found
    Error executing cl.exe.

    perfectnumber.exe - 1 error(s), 1 warning(s)

    --------------------
    --------------------



    # include <stdio.h>
    # include <math.h>

    #define SENTINEL -999

    int main ()
    {
           FILE *inp;
           FILE *outp;
         int num, total, i, number, prime;
         float ans;
           int IsPrim;


    //Initialize
         number = 0;
           prime = 0;

           inp=fopen("C:input.txt", "r");
           outp=fopen("C:output.txt", "w");

         do
              {

                  fscanf(inp, "%d", &num);
                  fprintf(outp, "%d", &num);

              //Initialize
         total = 0;
         ans = 0;

    // For prime
        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num; i++);
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");

    // For perfect

             total = 0;
             for ( i = 1; i < num; i++)
                 if(num%i==0)
                    total+=i;
             if(total==num)
             {
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");

              }while(number != SENTINEL);

    fclosef (inp);
    fclosef (outp);
    return (0);
                  }
    0
     
    LVL 11

    Expert Comment

    by:avizit


    fclose()  and not fclosef()
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    function is fclose and not fclosef :-)
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    that was faaaast avizit
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    >fprintf(outp, "%d", &num);

    I told you

    "notice the & (address of operator) infront of num ... note that it is required only for scanf family of functions and not printfs ..."

    pls read the previous post carefully http:#12441280
    0
     

    Author Comment

    by:jenmaz
    Thanks
    0
     
    LVL 11

    Expert Comment

    by:avizit
    hehe sunny :)

    welcome back from hibernation :)
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    thnx :-)
    0
     

    Author Comment

    by:jenmaz
    One more little silly question... When compiling I am getting an error

    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(64) : fatal error C1004: unexpected end of file found

    Which it points to this code below.  I  know this is a silly mistake that I am missing

    return (0);
                }
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    check if your opening and closing braces and paranthesis in the program are balanced
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
           if(total==num)
             {
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");

              }while(number != SENTINEL);

    here is the imbalance ... if closes with do while :-)
    0
     
    LVL 11

    Expert Comment

    by:avizit
    one more thing i just notice

    >>> for(i = 2; i < num; i++);

    the above is a empty for loop which doesnt really accomplish anything
    normally you will have

    for(i=XX; i< YY; i++ ){

    /*** some statements here ***/



    ....
    ....

    }

    0
     

    Author Comment

    by:jenmaz
    Thanks Guys,

    I am not focused tonight and am giving up for the night.  I got all the issues and resolutions that you all gave me accept the last comment from avisit.  I actually was trying to create a loop to check the input data to see if it is prime.  After all the cut and pasting I think I lost part of that code for that loop.  It did work before I added everything else.  At this time the script below executes but then closes as soon as the black box opens.  The error I get is from the fscanf or something.  So the black window does not really execute even though there is 0 errors when compiling.  I really wanted to get the prime and perfect part working so that I can go ahead and try to make functions out of them.  ANY HELP IN REVIEWING THE CODE would be apreciated.

    I am a beginner.  I will give all the points I can to whomever can resolve this for me.:)

    # include <stdio.h>
    # include <math.h>

    #define SENTINEL -999

    int main ()
    {
           FILE *inp;
           FILE *outp;
         int num, total, i, number, prime;
         float ans;
           int IsPrim;


    //Initialize
         number = 0;
           prime = 0;

           inp=fopen("C:input.txt", "r");
           outp=fopen("C:output.txt", "w");

         do
              {

                  fscanf(inp, "%d", &num);
                  fprintf(outp, "%d", num);

              //Initialize
         total = 0;
         ans = 0;

    // For prime
        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num; i++)
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");

    // For perfect

             total = 0;
             for ( i = 1; i < num; i++)
                 if(num%i==0)
                    total+=i;
             if(total==num)
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");

              }
                 while(number != SENTINEL);
                 
    fclose(inp);
    fclose(outp);
    return(0);
                  }
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    Are you sure it is crashing .. I do not see any scanf or getch to wait for pressing a char to exit !!! ... If you are using something line VC++, then it should give you the error message and wait for a key press on its own

    >I am a beginner.  I will give all the points I can to whomever can resolve this for me.:)
    be careful on those lines ... I would not like to answer further questions from an asker who chose to give all points to someone who posted only one last correction like say an extra ; while I was out for lunch ...

    Points mean recognition of efforts, be careful about how you distribute them.
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    btw what avizit's last comment meant was

    > for(i = 2; i < num; i++);
                                         ^
    this ; terminates the loop and following statements are executed anyway ... remove that ;
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    >while(number != SENTINEL);
    infinite loop ... number was initialized to 0 and never changed !!!! ... perhaps you wanted to use num here

    while ( num != SENTINEL);
    0
     

    Author Comment

    by:jenmaz
    Sorry Sunnycoder for making that comment about the points.  I appreciate the correction.  I will make sure I remember that.  I am new and really did not know what big value the points had.
    0
     

    Author Comment

    by:jenmaz
    Found the comment.  When I execute the script it gives me no errors until it brings up the black box and then another window pops up and says Windows debug failed.  Line 54 fscanf.c
    Then says that Expression: Stream != NULL
    0
     

    Author Comment

    by:jenmaz
    Still not working but thanks for all your help.
    0
     
    LVL 11

    Expert Comment

    by:avizit
    i think you have to change

     inp=fopen("C:input.txt", "r");
          outp=fopen("C:output.txt", "w");


    to

     inp=fopen("C:\\input.txt", "r");
          outp=fopen("C:\\output.txt", "w");

    0
     

    Author Comment

    by:jenmaz
    Thanks.. I tried that and it still did not work.  I am sure it is something very silly that I am over looking.  It is driving me crazy!
    0
     
    LVL 16

    Expert Comment

    by:PaulCaswell
    Do you want to repost what you've got now with a brief description of the problem.

    Paul
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    check if you are actually able to open the file "input.txt"
    by doing the following ..



    int main ()
    {
          FILE *inp;
          FILE *outp;
         int num, total, i, number, prime;
         float ans;
          int IsPrim;


    //Initialize
         number = 0;
          prime = 0;

          inp=fopen("C:input.txt", "r");     //or may be inp=fopen("C:\\input.txt", "r");
          outp=fopen("C:output.txt", "w");
          if(!inp){
                     printf("Unable to open file input.txt");
                      exit(1);
          }

    ......... //rest of you code
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    you are probably looping too many times. (as sunnycoder has already mentioned)

    make sure your `fscanf' s do read some value.

    if(fscanf(inp, "%d", &num) != 1)
        break;

    -- Adil
    0
     

    Author Comment

    by:jenmaz
    Sure this what I have so far.  Like I stated above there were no errors when I compiled but an error when the black window came up stating something about a fscanf.c file and an Expression: != NULL.

    I just wanted to have this script test numbers that were coming from an imput.txt file (ex. 3, 6, 91, 19, 11 etc.) and have the script tell  me whether or not the number is prime or not prime and/or a perfect number or not a perfect number.  Then after I got it working I would go back and clean it up by creating functions for Prime and Perfect etc.  I am still learning functions so I would save that for last.  I am just stuck right now.  Maybe cause it is late.

    # include <stdio.h>
    # include <math.h>

    #define SENTINEL -999

    int main ()
    {
           FILE *inp;
           FILE *outp;
         int num, total, i, number, prime;
         float ans;
           int IsPrim;


    //Initialize
         number = 0;
           prime = 0;
           num = 0;

            inp=fopen("c:\\input.txt", "r");
          outp=fopen("c:\\output.txt", "w");

           fscanf(inp, "%d", &num);
           fprintf(outp, "%d", num);

         do
              {

              //Initialize
         total = 0;
         ans = 0;

    // For prime
        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num; i++)
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");

    // For perfect

             total = 0;
             for ( i = 1; i < num; i++)
                 if(num%i==0)
                    total+=i;
             if(total==num)
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");

              }
                 while(num != SENTINEL);
                 
    fclose(inp);
    fclose(outp);

    return(0);
                  }
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    call fscanf inside your do{}while loop
    0
     

    Author Comment

    by:jenmaz
    I tried the script to check to see if I can open my input.txt file and the black screen prints "Unable to open file input.txt"
    0
     
    LVL 5

    Assisted Solution

    by:van_dy
    ok that means you aRE not able to open the file.
    the meaning of this is that either the path you specify
    to open your file is not correct.. or you dont have the permission to open the file.
    add the strerror(errno) part to what i told u and tell wats the error printed.

          if(!inp){
                     printf("Unable to open file input.txt, %s\n", strerror(errno));
                      exit(1);
          }

    0
     

    Author Comment

    by:jenmaz
    --------------------Configuration: perfectnumber - Win32 Debug--------------------
    Compiling...
    perfectnumber.c
    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(23) : warning C4013: 'strerror' undefined; assuming extern returning int
    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(23) : error C2065: 'errno' : undeclared identifier
    C:\Program Files\Microsoft Visual Studio\MyProjects\perfectnumber\perfectnumber.c(24) : warning C4013: 'exit' undefined; assuming extern returning int
    Error executing cl.exe.

    perfectnumber.exe - 1 error(s), 2 warning(s)
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    have you include <string.h> , <stdlib.h> and <errno.h> in the beginning of your source file?

    please do that and see if it works
    0
     

    Author Comment

    by:jenmaz
    OK did that and the black screen says no such file or directory.  If that is the case then it is not reading that file from my c drive.  It is in my C drive.  I do not hava an a drive.  Should I try to put the file somewhere else and call it from there?
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    >> I tried the script to check to see if I can open my input.txt file and the black screen prints "Unable to open file input.txt"

    Well in any case, the above simply shows that you are not able to open the file input.txt.
    there can be various reasons for this, most common being:
    1) you arent specifying the pathname to your file correctly.
    2) you dont have permissions to read the file, or search the directories in the path.

    try running the program in the same directory as in whch you have the file "input.txt",
    and specify the fopen() call in your source file as follows.

           inp=fopen("input.txt", "r");
          outp=fopen("output.txt", "w");


    i think it should work then,
    van_dy
    0
     

    Author Comment

    by:jenmaz
    That did not work.  
    0
     

    Author Comment

    by:jenmaz
    This is what is in the imput.txt file ---

    6 7 28 18 496 31 24 17 36 3 19 -999

    Just numbers that I want the script to read to determine if they are prime or perfect and -999 stops and exits the program.
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    find the correct pathname to your file.  like supposse input.txt is in some folder name PROJECT in you C drive, then
    the correct call to fopen will be

    inp = fopen("c:\\PROJECt\\input.txt", "r");

    do that and it will work for sure

    0
     
    LVL 16

    Assisted Solution

    by:PaulCaswell
    You are reading from the file ouitside the loop.

    Change:

         fscanf(inp, "%d", &num);
          fprintf(outp, "%d", num);

         do
              {


    to:

         do
              {

         fscanf(inp, "%d", &num);
          fprintf(outp, "%d", num);

    Paul
    0
     
    LVL 16

    Expert Comment

    by:PaulCaswell
    Actually, that's not a perfect solution but it will get you on your way once you solve the 'fopen' problem. It may be better to change your loop to a for loop but lets get it doing something first.

    Paul
    0
     
    LVL 12

    Assisted Solution

    by:stefan73
    Hi Jennifer,

    It looks like you're checking only once, not for every number in your file.
    You'd probably want to put the checks of each number into an extra function.

    fscanf needs the address of a variable, not the variable itself, so instead of
    fscanf(inp, "%d", num);
    write
    fscanf(inp, "%d", &num);

    Put your number analysis in an extra function:

    void check_num(FILE* out, int num){
       int num, total, i;
     //Initialize
         total = 0;
         ans = 0;

    // For prime
        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num; i++);
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");

    // For perfect

             total = 0;
             for ( i = 1; i < num; i++)
                 if(num%i==0)
                    total+=i;
             if(total==num)
             {
                 printf("Perfect");  
                 for ( i = 1; i < num; i++)
                    if(num%i==0)
                       printf("Perfect divisor");
             }
    }
    (it's incomplete, but I'm sure you can complete it by yourself.)

    You'd also want to use fprintf(out,...) instead of printf().

    Cheers!

    Stefan
    0
     
    LVL 5

    Expert Comment

    by:van_dy
    hello jen,

    here is another reccommendation, after u can successfully open your
    input file i would reccommend you to loop as follows

        ans = 1;
        IsPrim = 1;

        for(i = 2; i < num/2; i++);
           if ( num % i == 0)
           {
              IsPrim=0;
              printf("Divisor of prime");
           }
        if(IsPrim)
           printf("It is Prim");


    well you  loop in the similar fashion for perfect numbers.
    consider, if you can't device  37 by a number till 18, wats the point
    testing its divisibility with numbers from 19 to 36 ?? so  test the divisibility
    as prescribed above. there are ways to make the algorithm better, but i hope
    you get it working at least as we reccommend
    0
     
    LVL 2

    Expert Comment

    by:Sadrul
    i <= num/2

    for detecting primes, it suffices to test only upto sqrt(num)

    -- Adil
    0
     
    LVL 45

    Expert Comment

    by:sunnycoder
    Were you able to solve the problem ?
    0
     
    LVL 8

    Expert Comment

    by:ssnkumar
    Are you still getting compilation errors?
    May be the "include path" is not set properly in the environment.
    Also, the correct dlls are not getting compiled!

    -ssnkumar
    0

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    How to run any project with ease

    Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
    - Combine task lists, docs, spreadsheets, and chat in one
    - View and edit from mobile/offline
    - Cut down on emails

    Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
    Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
    The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
    The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.

    933 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    17 Experts available now in Live!

    Get 1:1 Help Now