Показать полную графическую версию : Си, функциональная декомпозиция
Lisiy_egik
17-10-2009, 23:42
Написал текст программы, которая определяет простое ли число или нет( число записано в файле), чтобы ее сдать, нужно выполнить ф. декомпозицию. Что это такое в общем я понимаю, ну понимаю каким образом нужно раскинуть эти функции, чтобы они в нужном порядке выполнялись и возвращали те значения. которые необходимы для дальнейшей работы. Буду очень признателен, за какую-либо помощь в этом деле)
(заголовочный файл 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();
}
#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
сдаюсь - никак не могу понять, почему не передается значение функции 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;
}
Lisiy_egik, вызов функции
if(Simple(int num) == false)»
необходимо поправить на if(Simple(num) == false).
Lisiy_egik
19-10-2009, 08:11
необходимо поправить на if(Simple(num) == false). »
заработало) спасибо) Только теперь проблема в другом - он всегда принимает значение true, даже тогда. когда он этого делать не должен. пойду искать в чем я опять напортачил
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
pva, , спасиб за совет, он совсем не будет лишним в дальнейшей практике)
а насчет предыдущего своего сообщения об постоянном возвращении правды - у меня была опечатка, в Simple.cpp я условие цикла if задал как присваивание, а не сравнение))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.