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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2013, 20:25   #1
Олег1
 
Регистрация: 30.04.2013
Сообщений: 3
По умолчанию маленькая проблема

проблема с файловым вводом-выводом(С)
Олег1 вне форума Ответить с цитированием
Старый 30.04.2013, 20:38   #2
Олег1
 
Регистрация: 30.04.2013
Сообщений: 3
По умолчанию

задача в исходном файле "absent.in" находится две строки в первой количество цифр во второй строке, в которой через пробел записаны 1 и 2 в произвольном порядке. Необходимо подсчитать сколько цифр находится "не на своем месте", т. е. не соответствует такой же по величине последовательности расположенной в правильном порядке (1 2 1 2 1 2 1 2), и вывести в файл absent.out.
Например
входной файл:
7
1 2 1 2 1 2 2
выходной файл :
1
или
входной файл:
6
2 1 2 1 2 1
выходной файл :
6
вот что навоял:
#include <stdio.h>
#include <conio.h>
main()
{
FILE *Fin, *Fout;
char* s;
int count=0;
short i=1;
Fin=fopen("absent.in","r");
Fout=fopen("absent.out","w+");

fscanf(Fin,"%s",s);

while((*s) != '\0')
{

if (i>2) i=1;
fscanf(Fin,"%s",s);
if ( (*s)-48-i != 0)count++;
i++;
}

fprintf(Fout,"%i",count);

getch();

fclose(Fout);
fclose(Fin);
}


но вот беда - при попытке чтения из файла программа вылетает!
Помогите, в чем ошибка?
заранее очень благодарен.
Олег1 вне форума Ответить с цитированием
Старый 30.04.2013, 21:34   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Можно, конечно, объяснить Ваши ошибки, но лучше переписать по-другому:
Код:
#include <stdio.h>
#include <conio.h>

int
main() {
    FILE *fin, *fout;
    fin = fopen("absent.in", "r");
    fout = fopen("absent.out", "w+");
    int n, k, count = 0, i;
    fscanf(fin, "%d", &n);
    for (i = 0; i < n; ++i) {
        fscanf(fin, "%d", &k);
        count += k % 2 ^ (i + 1) % 2;
    }
    fprintf(fout, "%d", count);
    fclose(fout);
    fclose(fin);
    return 0;
}
Цикл можно записать так:
Код:
for (i = 1; i <= n; ++i) {
    fscanf(fin, "%d", &k);
    count += k % 2 ^ i % 2;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.04.2013 в 22:28.
BDA вне форума Ответить с цитированием
Старый 30.04.2013, 22:06   #4
Олег1
 
Регистрация: 30.04.2013
Сообщений: 3
По умолчанию

Премного благодарен.
Простите, что не сообщил о языке: это Си
и не могли бы Вы немного пояснить следующую строку
Цитата:
count += k % 2 ^ (i + 1) % 2;
Я не совсем понимаю, что здесь происходит и почему работает?
Олег1 вне форума Ответить с цитированием
Старый 30.04.2013, 22:25   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
проблема с файловым вводом-выводом(С)
Я эту C в скобках воспринял как указание языка, а приведенный код развеял возможные сомнения
Цитата:
Простите, что не сообщил о языке: это Си
А, это Вы о моей подписи (она приписывается ко всем сообщениям и к Вам не относилась).
Разберем на примере, почему это работает:
Код:
k = 2 1 2 1 2 2 (считываются по очереди из файла)
i = 0 1 2 3 4 5
k%2 0 1 0 1 0 0 (остаток от деления на 2)
i%2 0 1 0 1 0 1 (остаток от деления на 2)
Операция ^ (xor, исключающее ИЛИ, Сложение по модулю два) имеет следующую таблицу истинности:
Код:
a b = c
0 0   0
0 1   1
1 0   1
1 1   0
Таким образом, если остатки не совпадают, то к количеству прибавляется единичка.
Код:
j = i + 1, тогда
j%2 1 0 1 0 1 0
k%2 0 1 0 1 0 0
^ = 1 1 1 1 1 0
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графика в delphi(маленькая проблема) VENOMIK Помощь студентам 1 13.05.2012 19:43
маленькая проблема с TsShellListView(AlphaSkins) abzhapparovmaxat Общие вопросы Delphi 0 19.10.2011 20:36
маленькая проблема передачи через сокеты. dj-botsman Работа с сетью в Delphi 0 17.05.2010 19:26
маленькая проблема pinch000 C++ Builder 4 10.12.2009 23:26