Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Си, функциональная декомпозиция

Ответить
Настройки темы
C/C++ - Си, функциональная декомпозиция

Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 18-10-2009
Описание: Тег - код - #
Написал текст программы, которая определяет простое ли число или нет( число записано в файле), чтобы ее сдать, нужно выполнить ф. декомпозицию. Что это такое в общем я понимаю, ну понимаю каким образом нужно раскинуть эти функции, чтобы они в нужном порядке выполнялись и возвращали те значения. которые необходимы для дальнейшей работы. Буду очень признателен, за какую-либо помощь в этом деле)

(заголовочный файл 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();
}

Отправлено: 23:42, 17-10-2009

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата 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();

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

Отправлено: 10:57, 18-10-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


сдаюсь - никак не могу понять, почему не передается значение функции 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;
}

Отправлено: 21:56, 18-10-2009 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Lisiy_egik, вызов функции
Цитата Lisiy_egik:
Код: Выделить весь код
if(Simple(int num) == false)
»
необходимо поправить на if(Simple(num) == false).

Отправлено: 22:11, 18-10-2009 | #4


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


Цитата Admiral:
необходимо поправить на if(Simple(num) == false). »
заработало) спасибо) Только теперь проблема в другом - он всегда принимает значение true, даже тогда. когда он этого делать не должен. пойду искать в чем я опять напортачил

Отправлено: 08:11, 19-10-2009 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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)]);

Последний раз редактировалось pva, 19-10-2009 в 09:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:09, 19-10-2009 | #6


Новый участник


Сообщения: 33
Благодарности: 12

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 17:15, 19-10-2009 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Си, функциональная декомпозиция

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Не работает функциональная кнопка яркость (+/-) на Sony VAIO Petya V4sechkin Ноутбуки 313 23-01-2022 11:01
Не работает функциональная кнопка WiFi iPetry Ноутбуки 10 12-10-2011 13:07
Система - Функциональная схема с описанием работы всех блоков и систем Pashuta Программное обеспечение Windows 1 23-05-2009 11:14




 
Переход