Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 10:45   #11
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ну дык покажи, как именно ты это написал и на что компилятор ругается.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 15.01.2013, 11:35   #12
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

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

Код:
#include <iostream>//подключение заголовочного файла для операторов ввода/вывода
using namespace std;//использование стандартного пространства имен std для операторов ввода/вывода

FILE *file;//файловая переменная, описанная в структуре файл
char filename[100];//адрес файла
char digit[100];//входной поток, используемый для проверки и получения целого числа
int stream[100];//входной поток обработанных данных
int streamout[100];
int N;//целочисленная переменная для хранения количества вводимых элементов
int i;//итератор для прохода по массиву значений

//функция проверки на целое число
int IntegerCheck(char *digitstring) {
	int stepcurrent=0;//текущий шаг
	int state=1;//переменная флаг

	while ((stepcurrent<=strlen(digitstring)) && (!(state==0))) {
		if (digitstring[stepcurrent]<'0' || digitstring[stepcurrent]>'9') {
			state=0;
		}
		stepcurrent=stepcurrent+1;
	}
	if (state==1) {
		return state;
	}
	else return state;
	}

//функция вывода данных
void DataOutput(const int *matrix, const int amount) {
	int a;
	for (a=0; a<amount; a++)
		cout << "[" << a+1 << "]: " << matrix[a] << "\n";
}

//функция изменения данных
void DataChangeInFile(FILE *fileconst, int *buffer, const int amount) {
	int a;
	int tempdigit;
	int *pTempdigit=&tempdigit;
	for (a=0; a<amount; a++) {
		fseek(fileconst, sizeof(int)*a, 0);
		fread(pTempdigit, sizeof(int), 1, fileconst);
		if (*pTempdigit<0) 
			buffer[a]=0;
	}
	fseek(file, 0, 0);
	fwrite(buffer, sizeof(int), amount, fileconst);
}

void DataInput(char *charbuffer, int *buffer, const int amount) {
	int a;
	for (a=0; a<amount;) {
		gets(charbuffer);
		if (IntegerCheck(digit)==1) {
			buffer[a]=atoi(digit);
			a++;
			fflush(stdin);
		}
		else {
			cout << "Wrong. Re-enter: ";
			fflush(stdin);
		}
	}
}
void main() {
	cout << "Enter filename: ";
	gets(filename);
	file=fopen(filename, "w+b");
	if (file!=0) {
	cout << "Enter amount of digits: ";
	cin >> N;
	fflush(stdin);//очистка буфера
	DataInput(digit, stream, N);
	cout << "Data you have entered: " << "\n";
    DataOutput(stream, N);
	fwrite(stream, sizeof(int), N, file);
	DataChangeInFile(file, stream, N);
	fseek(file, 0, 0);
	fread(streamout, sizeof(int), N, file);
	cout << "Processed data written to the address: ";
	puts(filename);
	cout << "\n";
	for (i=0; i<N; i++) {
		cout << "element: " << streamout[i] << " ";
	}
	fclose(file);
	}
	else cout << "Error opening file..." << "\n";
	system("pause");
	}
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:01   #13
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Дело в том, что в конце каждой строки стоит символ '\0', который и даёт ложь при этой проверке

Код:
if (digitstring[stepcurrent]<'0' || digitstring[stepcurrent]>'9') {
Как вариант, можно не проверять последний символ. Либо игнорировать конец строки. Вот, подправил функцию (здесь не проверяю последний символ и убрал явно лишнюю state). В принципе, лучше возвращать значение типа bool, но я остаивл просто 0 и 1, как и было у тебя.

Код:
int IntegerCheck(char *digitstring) {
    size_t stepcurrent=0;//текущий шаг, тип size_t чтобы не было предупреждения в цикле

    while (stepcurrent<strlen(digitstring)) {
        if (digitstring[stepcurrent]<'0' || digitstring[stepcurrent]>'9') {
            return 0;
        }
        ++stepcurrent;
    }
    return 1;
}
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 15.01.2013 в 12:05.
sVasilich вне форума Ответить с цитированием
Старый 15.01.2013, 12:30   #14
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

аааа))) я понял!))) спасибо)
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:34   #15
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

а что насчет такого варианта? тоже рабочий:
Код:
int IntegerCheck(char *digitstring) {
	int stepcurrent=0;//текущий шаг
	int state=1;//переменная флаг

	while ((stepcurrent<=strlen(digitstring)-2) && (!(state==0))) {
		if (digitstring[stepcurrent]<'0' || digitstring[stepcurrent]>'9') {
			state=0;
		}
		stepcurrent=stepcurrent+1;
	}
	if (state==1) {
		return state;
	}
	else return state;
	}
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:35   #16
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
int IntegerCheck(char *digitstring) {
	int stepcurrent=0;//текущий шаг
	int state=1;//переменная флаг

	while ((stepcurrent<=strlen(digitstring)-1) && (!(state==0))) {
		if (digitstring[stepcurrent]<'0' || digitstring[stepcurrent]>'9') {
			state=0;
		}
		stepcurrent=stepcurrent+1;
	}
	if (state==1) {
		return state;
	}
	else return state;
	}

//функция вывода данных
void DataOutput(const int *matrix, const int amount) {
	int a;
	for (a=0; a<amount; a++)
		cout << "[" << a+1 << "]: " << matrix[a] << "\n";
}
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:35   #17
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

второй вариант, с первым я ошибся (2 вместо 1 написал)
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:36   #18
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Да, тоже рабочий. Протестируй ещё на всякий случай
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 15.01.2013, 12:52   #19
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

момент пропустили один: ввода отрицательного числа не будет, т.к - находится вне промежутка от 0 до 9)) но эта проблема решаемая
Igor95 вне форума Ответить с цитированием
Старый 15.01.2013, 12:54   #20
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

короче нужно еще думать
Igor95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оцените работу Bek-Z Общие вопросы Delphi 0 27.12.2010 13:06
Оцените работу.. stainer Общие вопросы Delphi 1 17.11.2010 15:04
Устроился на работу. Оцените уровень. fs444 Свободное общение 20 31.10.2010 12:00
Angelic Player v1.0 (Оцените пожалуйста работу) SalasAndriy Софт 23 17.09.2009 20:57
Оцените пожалуйтса мою первую работу Kirill1 Свободное общение 5 02.09.2009 22:57