Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Си, функциональная декомпозиция (http://forum.oszone.net/showthread.php?t=153509)

Lisiy_egik 17-10-2009 23:42 1245727

Си, функциональная декомпозиция
 
Написал текст программы, которая определяет простое ли число или нет( число записано в файле), чтобы ее сдать, нужно выполнить ф. декомпозицию. Что это такое в общем я понимаю, ну понимаю каким образом нужно раскинуть эти функции, чтобы они в нужном порядке выполнялись и возвращали те значения. которые необходимы для дальнейшей работы. Буду очень признателен, за какую-либо помощь в этом деле)

(заголовочный файл rus8.h позволяет выводить на экран на русском, а не козиябликами, это чтоб вопросов не возникало)) )

вот текст программы:

Код:

#include "stdio.h"
#include "conio.h"
#include "rus8.h"

#define FNAME "qwe.txt\0"

void main()
{
        rus();

        char fname[20] = FNAME;
        FILE *f;
        int num;
        int del = 2;
        double ost;
       
        printf("\nПрограмма, проверяющая простоту числа. содержащегося в файле %s\n", fname);

        if((f = fopen(fname, "r")) == NULL)
        {
                printf ("Ошибка при открытии файла");
                getch();       
                return;
        }
       
        while(!feof(f))
        {
                fscanf(f, "%i", &num);
        }

        fclose(f);

        printf("проверяемое число - это : %i\n", num);

        while(del <= num-1)
        {
                ost = num % del;
                if(ost == 0)
                {
                        printf ("Число %i не являтся простым", num);
                        getch();
                        return;
                }
                else
                        del++;
        }
       
        printf ("Число %i - простое число!", num);
        getch();
}


pva 18-10-2009 10:57 1245919

Цитата:

Цитата Lisiy_egik
#define FNAME "qwe.txt\0" »

в C/C++ запись "qwe.txt" обозначает что будет автоматически добавлен ноль в конец; sizeof("1") = 2

разбей по принципу
1. инициализация void init();
2. ввод int input();
3. обработка bool process(int);
4. вывод void output(bool);
5. чистка мусора void cleanup();

потом навык пригодится в ООП

Lisiy_egik 18-10-2009 21:56 1246433

сдаюсь - никак не могу понять, почему не передается значение функции Simple, вот что у меня получилось:

Main.cpp
Код:

#include "stdio.h"
#include <stdlib.h>
#include "conio.h"
#include "rus8.h"

#include "FileOpen.h"
#include "Simple.h"

bool ReadInputData( FILE *fin, int *pnum );
void main()
{
        rus();

        FILE *fin;
        int num;

        if( false == FileOpen( &fin, "number.txt", "rt" ) ) exit( 1 );
        if( false == ReadInputData( fin, &num ) ) exit( 2 );
       
        FileClose( fin );

        if(Simple(int num) == false)
        {
                printf( "Число %i не является простым\n", num );
                getch();
        }
        else
                printf( "Число %i простое!\n", num );
        getch();
}

bool ReadInputData( FILE *fin, int *pnum )
{
        int retScan = fscanf( fin, "%i", pnum );
        if( retScan == EOF )
        {
                printf( "Файл для чтения пуст\n" );
                getch();
                return false;
        }
        if( retScan != 1 )
        {
                printf( "Неверный формат ввода\n" );
                getch();
                return false;
        }
        return true;
}

FileOpen.h
Код:

#pragma once
#include "stdio.h"

bool FileOpen( FILE **pFin, const char *filename, const char *mode );
void FileClose( FILE *f );

FileOpen.cpp
Код:

#include "Simple.h"

bool Simple(int num)
{
        int del = 2;
        double ost;

        while(del <= num-1)
        {
                ost = num % del;

        if( ost = 0 )
        {
                return false;
        }
        else
                        del++;
        }
                return true;
}

Simple.h
Код:

#pragma once
#include "stdio.h"

bool Simple(int num);

Simple.cpp
Код:

#include "Simple.h"

bool Simple(int num)
{
        int del = 2;
        double ost;

        while(del <= num-1)
        {
                ost = num % del;

        if( ost = 0 )
        {
                return false;
        }
        else
                        del++;
        }
                return true;
}


Admiral 18-10-2009 22:11 1246442

Lisiy_egik, вызов функции
Цитата:

Цитата Lisiy_egik
Код:

if(Simple(int num) == false)
»

необходимо поправить на if(Simple(num) == false).

Lisiy_egik 19-10-2009 08:11 1246631

Цитата:

Цитата Admiral
необходимо поправить на if(Simple(num) == false). »

заработало) спасибо) Только теперь проблема в другом - он всегда принимает значение true, даже тогда. когда он этого делать не должен. пойду искать в чем я опять напортачил

pva 19-10-2009 09:09 1246661

Lisiy_egik, почему ты используешь такие угловатые конструкции (типа == false). Попробуй как бы написать словами, что ты хочешь сделать:
Код:

bool get_from_file(int& value); // здесь открывается и закрывается файл
void output(const int& value, bool prime); // здесь печатается текст
bool is_prime(const int& value); // только проверка на простоту
void error_message(const char*); // выдача сообщения в лог

int main()
{
    init(); // здесь установить русскую кодировку
    int value = 0; // значение
 
  if (get_from_file(value)) // если взял значение value из файла
  {
      output(value, is_prime(value)); // вывел значение value и "простое оно или нет"
  }
  else
  {
      error_message("не могу прочитать значение");
  }
}

в таком коде ввод, обработка и вывод разделены так, что ты можешь изменять каждую часть программы, независимо от другой. Например: ввод - просто присваивание числа. Вывод - вывод в диалоговом окне. Потом передумал - сделал ввод из файла. Программа продолжает работать без переделки других модулей. При этом текст программы написан почти на человеческом языке

ещё 2 подхода в булевым выражениям, облегчающие жизнь:

1. хитрая форма оператора if:
условие ? выражение_да : выражение_нет
выражение_да и выражение_нет должны иметь один тип данных
printf(is_prime ? "да" : "нет");

2. табличные функции. Пользуемся тем, что по правилам С++ (но не С), булевское выражение имеет значения 0 или 1. значит его можно использовать в качестве индекса массива из 2-х элементов
static const char* str_primes[2] = {"не простое", "простое"};
printf(primes[is_prime]);
если is_prime - не булевское, надо сделать приведение:
printf(primes[bool(is_prime)]);

Lisiy_egik 19-10-2009 17:15 1247081

pva, , спасиб за совет, он совсем не будет лишним в дальнейшей практике)

а насчет предыдущего своего сообщения об постоянном возвращении правды - у меня была опечатка, в Simple.cpp я условие цикла if задал как присваивание, а не сравнение))


Время: 06:22.

Время: 06:22.
© OSzone.net 2001-