2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Вопрос по программированию
Сообщение06.02.2007, 22:48 
Требовалось написать программу, которая для 3-х введенных чисел определяла, верно ли что ровно одно из этих чисел отрицательное. Код я написал, но он почему то не совсем верно работает. При первом проходе она работает верно, но после вопроса продолжить, когда вводишь не "q", то она позволяет принять только два числа, а потом пишет ответ. В чем моя ошибка? Компилятор Microsoft Visual.

Код:
#include <stdio.h>
#include <stdlib.h>
main()
{
   int a,b,c;
   char q='w';
   while(q != 'q')
   {
     printf("\nВведите 3 числа: ");
     scanf("%i",&a);
     scanf("%i",&b);
     scanf("%i",&c);
     if ((a*b*c < 0) && ((a>0) || (b>0) || (c>0)))       printf("\nВерно ");
     else printf("\nНеверно ");
     printf("\nПродолжить?");
     scanf("%с",&q);
   } 
   
   return 0;
}

 
 
 
 Re: Вопрос по программированию
Сообщение06.02.2007, 23:14 
Аватара пользователя
Gecr писал(а):
scanf("%с",&q);

Ну как минимум в этой строке с - русская. Попробуйте заменить на c - английскую.

 
 
 
 
Сообщение07.02.2007, 23:22 
заменил, но теперь после вопроса "Продолжить? " сразу пишет "Введите 3 числа", т.е. не дает ответить на вопрос :cry:

 
 
 
 
Сообщение07.02.2007, 23:47 
Аватара пользователя
:evil:
Такое часто бывает, и связано с тем, что в буффере клавиатуры остаются символы (после запуска программы). Поэтому, их надо считать (и выбросить) до того, как Вы начали вводить данные.

Кроме того, выбранный Вами способ ввода символа неудачен -- лучше пользоваться вводом строки.

 
 
 
 
Сообщение08.02.2007, 22:36 
Еще просьба: подскажите системный вызов из windows.h или просто функцию, которая переименовывает файл и функцию, которая перемещает файл

 
 
 
 
Сообщение09.02.2007, 18:49 
Аватара пользователя
:evil:
Код:
#include <stdio.h>
int rename(const char *old, const char *new);

Делает обе запрошенных операции. quod vide.

 
 
 
 
Сообщение12.02.2007, 11:06 
незваный гость писал(а):
Такое часто бывает, и связано с тем, что в буффере клавиатуры остаются символы (после запуска программы). Поэтому, их надо считать (и выбросить) до того, как Вы начали вводить данные.

Боже мой! каких только ужастиков не наслушаешься в Сети!
Этот маразм только под Windows, или шире распространён?
Если шире, то подскажите, пожалуйста, тестовый пример, достоверно воспроизводящий такой эффект, -- интересно пощупать такое чудо своими руками.

 
 
 
 
Сообщение13.02.2007, 03:25 
Аватара пользователя
:evil:
Нет. Еще и в Dos. :P

Но, на самом деле, проблема встречается куда шире. Например, многие коммуникационные протоколы позволяют использовать, CR, LF, или CR/LF в качестве разделителя строки. При передаче по каналу CR может быть получен, но отработка LF может оказаться блокирующим вызовом. Поэтому правильный способ отработки — распозновать строку по CR, и взводить флажок (чтобы, если последует LF, его пропустить молча).

Я встречал в некоторых файлах Adobe CR CR в качестве ограничителя строки. До сих пор гадаю, где такая конвенция...

А пример программы… Я обычно делал что-либо в таком духе, но это все — совсем не posix.
Код:
#include <stdio.h>
#include <conio.h>
int main(int argc, char** argv)
{
  int ch;

  do {
    ch = _getch();
    printf(" %02X", ch);
  } while (ch != 0x1B && ch != -1);
}


Сейчас, правда, погонял ее — грехов не видно. А может я и попутал чего. :(

Дурной это тон, гонять scanf из файла. Проблем не оберешься.

 
 
 
 
Сообщение13.02.2007, 10:03 
незваный гость писал(а):
Нет. Еще и в Dos.

Ну, а та уж, вообще, хроника, а не клиника...

незваный гость писал(а):
Поэтому правильный способ отработки — распозновать строку по CR, и взводить флажок (чтобы, если последует LF, его пропустить молча).

А-ля telnet...

незваный гость писал(а):
Я встречал в некоторых файлах Adobe CR CR в качестве ограничителя строки. До сих пор гадаю, где такая конвенция...

Это уже мистика.
Может, всё таки, тут имеется в виду пустая строка, которая считается окончанием чего-нибудь.
В спецификации всяко должно быть что-то сказано.
Что-то я такое слышал... наверное, дежавю...

 
 
 
 
Сообщение14.02.2007, 00:38 
Требовалось написать прогу, которая ищет хотя бы одну папку на рабочем столе, нужно ее имя, но у меня почему то не ищет не одной! Хотя просто для диска С:\\ без подкаталогов все работает. Так же и имена файлов на рабочем столе выдавала по аналогичному коду, а вот папки не ищет. Почему так?
Код:
#include <windows.h> 
#include <stdio.h>

main()
{
  char FolderName[50]={'\0'};
  HANDLE hFind;
  BOOL bl=TRUE;
  WIN32_FIND_DATA ffd;
 
  hFind=FindFirstFile("C:\\Documents and Settings\\Слава\\Рабочий стол\\*.*",&ffd);
  while(bl)
  {
     if(ffd.dwFileAttributes&0x00000010)
     { strcpy(FolderName,ffd.cFileName);
     break;
     }
     bl=FindNextFile(hFind,&ffd);
  }   
  FindClose(hFind);
  printf("FolderName =  %s", FolderName);
 
  return 0;

 
 
 
 
Сообщение28.02.2007, 14:53 
В первом фрагменте надо заменить scanf("%с",&q) на scanf("%s",&q) патамучта scanf криво работает с символами

Во втором фрагменте надо внести printf в цикл:
{
if(ffd.dwFileAttributes&0x00000010)
{ strcpy(FolderName,ffd.cFileName);
printf("FolderName = %s \n", FolderName);
//break;
}
bl=FindNextFile(hFind,&ffd);
}

Первые найденные папки будет иметь имена "." и ".." - это выход на c:\ и на верхний уровень. Понятно, что в корне их нет :)

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group