2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Вопрос по программированию
Сообщение06.02.2007, 22:48 


20/10/06
24
Требовалось написать программу, которая для 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 
Модератор
Аватара пользователя


11/01/06
5660
Gecr писал(а):
scanf("%с",&q);

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

 Профиль  
                  
 
 
Сообщение07.02.2007, 23:22 


20/10/06
24
заменил, но теперь после вопроса "Продолжить? " сразу пишет "Введите 3 числа", т.е. не дает ответить на вопрос :cry:

 Профиль  
                  
 
 
Сообщение07.02.2007, 23:47 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Такое часто бывает, и связано с тем, что в буффере клавиатуры остаются символы (после запуска программы). Поэтому, их надо считать (и выбросить) до того, как Вы начали вводить данные.

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

 Профиль  
                  
 
 
Сообщение08.02.2007, 22:36 


20/10/06
24
Еще просьба: подскажите системный вызов из windows.h или просто функцию, которая переименовывает файл и функцию, которая перемещает файл

 Профиль  
                  
 
 
Сообщение09.02.2007, 18:49 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Код:
#include <stdio.h>
int rename(const char *old, const char *new);

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

 Профиль  
                  
 
 
Сообщение12.02.2007, 11:06 
Заслуженный участник


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

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

 Профиль  
                  
 
 
Сообщение13.02.2007, 03:25 
Заслуженный участник
Аватара пользователя


17/10/05
3709
: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 
Заслуженный участник


14/12/06
881
незваный гость писал(а):
Нет. Еще и в Dos.

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

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

А-ля telnet...

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

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

 Профиль  
                  
 
 
Сообщение14.02.2007, 00:38 


20/10/06
24
Требовалось написать прогу, которая ищет хотя бы одну папку на рабочем столе, нужно ее имя, но у меня почему то не ищет не одной! Хотя просто для диска С:\\ без подкаталогов все работает. Так же и имена файлов на рабочем столе выдавала по аналогичному коду, а вот папки не ищет. Почему так?
Код:
#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 


28/02/07
1
В первом фрагменте надо заменить 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group