IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Нужна помощь по C (https://www.imho.ws/showthread.php?t=36913)

Tulip 18.08.2003 16:26

Нужна помощь по C
 
Как сделать чтобы прога на C (не ++) в конце цикла выдавала запрос что-то вроде "повторить операцию? y/n". При y соответственно прога начинала выполняться заново, при n вырубалась. (закрывалась окно).

qwe123 18.08.2003 17:01

Что то типа этого :

char res;
while(res!='n')
{
//Чтото делаем
printf("%s","Продолжить y/n")
scanf("%c",&res);
}

SapeR 18.08.2003 17:07

пример:
Код:

void MyFunc()
{
  // your code here
}

void main()
{
    char ch=' '
    do
    {
        MyFunc();
        do
        {
            printf("повторить операцию? y/n :");
            scanf("%c",&ch);
        }
        while (ch!='y' && ch!='Y' && ch!='n' && ch!='N');
    }
    while (ch!='n' && ch!='N');
}


BigFoot 22.08.2003 14:37

Tulip
Кроме scanf можно использовать getchar...

Tulip 26.08.2003 23:17

1. Короче вот в чем проблема. Есть кусок кода. (ниже). Суть в том, что из 3 вариантов надо выбрать один нажатием соответственно 1,2 или 3. Если юзер нажимает символ, отличный от 1,2 или 3, то должно выскакивать сообщение, что "введите 1,2 или 3". Херня в том что сообщение вылазит два раза подряд (при вводе других символов). Как эту багу исправить?

*********************************************************
#include <stdio.h>
main()
{
char s;
printf("Please enter 1, 2 or 3" );
while(s!='1' && s!='2' && s!='3')
{
scanf("%c", &s);
if(s!='1' && s!='2' && s!='3')
printf("Please, enter the number 1, 2 or 3.\n\n");
}
}
*********************************************************


2. И еще. Короче такая фигня.

#include <stdio.h>
main()
{
int x=2,y=6;
int z;
z=x+y;
printf("%d",z);
}


Как мне результат (z) записать в файл? (например result.txt).

cd19 27.08.2003 00:11

fprintf позволяет писать в файл

sky7 27.08.2003 00:29

Так ФИ!!!
**************************************************
*******
#include <stdio.h>
main()
{
char s;
//printf("Please enter 1, 2 or 3" );
while(s!='1' && s!='2' && s!='3')
{
// вот будет один раз выскакивать!
printf("Please, enter the number 1, 2 or 3.\n\n");

scanf("%c", &s);
if(s!='1' && s!='2' && s!='3')
//printf("Please, enter the number 1, 2 or 3.\n\n");
}
}
**************************************************
А про файлы с С не знаю... про ++ могу сказать.
*******

ArchiMage 27.08.2003 00:49

chast' intera pri sleduyushem scanf zahodit v "s", mozhno reshit' tak (chut' podpraviv if) :

if(s!='1' && s!='2' && s!='3'&&s!=10)


sky7
v tvoem sluchae problema ostanetsa

Tulip 27.08.2003 15:15

Цитата:

Первоначальное сообщение от ArchiMage
chast' intera pri sleduyushem scanf zahodit v "s", mozhno reshit' tak (chut' podpraviv if) :

if(s!='1' && s!='2' && s!='3'&&s!=10)


sky7
v tvoem sluchae problema ostanetsa

Работает! А что означает это условие: s!=10? Ведь s в данном случае тип char. Каким образом можно ставить условие ей через число?

Borland 27.08.2003 16:01

Цитата:

Первоначальное сообщение от Tulip
...А что означает это условие: s!=10? Ведь s в данном случае тип char. Каким образом можно ставить условие ей через число? [/B]
Это одно из основополагающих свойств языка. Тип char может рассматриваться как int. Значение 10 - ASCII-код символа, только и всего... Насколько помню, это так называемый "управляющий символ", соответствует нажатию клавиши не помню какой, но вроде Esc...

SapeR 27.08.2003 17:16

10 - возврат каретки
13 - переход строки
27 - ескейп
вообсче все коды до 32 (пробел) можно игнорировать

в идеале условие выглядит
Код:

if(s<'1' || s>'3')

ArchiMage 27.08.2003 17:23

Tulip
dlya samogo yazyka ne vazhno chto ty podruzamevaesh pod char, dlya nego eto cifry ot 0 do 255... klavisha "ENTER" sostoit iz dvuh bukv : 10 i 13 po tablice ASCII , pri nazhatii etoj klavishy posle vvoda chast' ee zajdet v sleduyushem vvode

Добавлено через 2 минуты:
CапёР
"if(s<'1' || s>'3')" opyat' ta-zhe porblema s interom, on primet snachala bukvu a potom kogda zanovo zajdet v while primet 10 ot intera

SapeR 27.08.2003 17:27

Цитата:

ArchiMage
"if(s<'1' || s>'3')" opyat' ta-zhe porblema s interom, on primet snachala bukvu a potom kogda zanovo zajdet v while primet 10 ot intera
Цитата:

CапёР
вообсче все коды до 32 (пробел) можно игнорировать
Ok :
Код:

if(s<32)
{//ignore
}
else if(s<'1' || s>'3')
{
    printf("Enter number from 1 to 3\n");
}


ArchiMage 27.08.2003 17:29

тогда можно :)

TiamaT 28.08.2003 18:31

Цитата:

Тип char может рассматриваться как int
я бы сказал как byte ;-)

Borland 29.08.2003 09:17

TiamaT
Согласен:)

AvaLANche 30.08.2003 11:54

где взять компилятор с++?
например "gnu c++"

cd19 30.08.2003 13:56

http://gcc.gnu.org

Tulip 01.09.2003 15:58

А вот, еще такой вопрос:

В качестве примера приведу простенький код:

*******************
#include <stdio.h>
main()
{
int x;
printf("Enter x: ");
scanf("%d",&x);
}
*******************

Как в данной ситуации сделать ограничение на ввод? Имеется ввиду например если с клавы буден введен скажем символ, а не число. То есть как сделать чтоб вводить разрешалось только числовые данные, а ввод символов игнорировался.

SapeR 01.09.2003 17:14

вот например:
Код:

#include <stdio.h>
#include <conio.h>

#define SIZE 20
void main(void)
{
    int x;
    char buffer[SIZE], ch;
    int  i;
    printf("Enter x: ");

    ch  = 0;
    i  = 0;
    while (i<SIZE-2)
    {
                ch = getch();
                if (ch=='-' && i==0)
                {
                        buffer[i] = ch;                                // '-' on 1st place = NEGATIVE NUMBER
                        putch(ch);
                        i++;
                }
                else if (ch>='0' && ch <='9')
                {
                        buffer[i] = ch;                                // add to buffer
                        putch(ch);
                        i++;
                }
                else if (ch==10 || ch==13)
                {
                        break;                                                // user press enter
                }
                else
                {
                        putch(7);                                        // wrong key = BEEP
                }
    }
    buffer[i] = '\0';        // end of string
    printf("\n");

        sscanf(buffer,"%d",&x);
    printf("%d",x);
}

если что непонятно - спрашивай

TiamaT 01.09.2003 19:06

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char** argv)
{
char buf[32], *check;
long num;

printf("Enter x: ");

fgets(buf, sizeof(buf), stdin);
num = strtol(buf, &check, 10);
if (strncmp(buf, check, sizeof(buf)) != 0)
printf("You entered: %ld\n", num);

return 0;
}

SapeR 01.09.2003 19:10

тоже хорошо, сам такое пользую.
НО - ПОЗВОЛЯЕТ вводить не-числа (не соотв. условию)

TiamaT 01.09.2003 19:14

Набирать на клавиатуре позволяет, но если не числа то игнорирует.

SapeR 01.09.2003 19:16

2TiamaT - введи "0" (без кавычек) ;)

TiamaT 01.09.2003 19:49

поправил, тестируй :)

Tulip 01.09.2003 23:09

TiamaT, че-то я не совсем понял как работает эта схема. Там вроде буквы вводить можно. CапёР, а если я хочу ввести скажем дробное число?

SapeR 02.09.2003 02:36

Дробное - то есть с точкой ?
Вариант : разрешим юзеру ОДИН раз ввести точку.
вместо int x будет float x , соответственно scanf(... %f ) а не %d ,
добавляем флажок int flag_point = 1 и ещё один ELSE IF:
Код:

...
else if ( i!=0 && flag_point==1 && buffer[i-1]!='-' )
{
    flag_point = 0;
    buffer[i] = ch;
    putch(ch);
    i++;
}
else ...

И хорошо бы всё это из мэйна в функцию упаковать

TiamaT 02.09.2003 12:05

Tulip
если нужно вводить дробные, то используй strtod(buf, &check) вместо strtol.
если хочешь вводить шестнадцатиричные (типа 0x234h) то используй strtol(buf, &check, 16).
Ну и в printfе надо будет поменять конечно.

Tulip 03.09.2003 19:13

Есть одна проблема. Ниже я написал часть кода. Суть его в том, что нужно ввести два раза числа. (в первом случае 1,2,3 или 4. Во-втором 1 или 2). Проблема в том, что после ввода в первый раз, нельзя ввести во второй раз. То есть программа как бы перепрыгивает через второй scanf (не дает ввести значение) и завершается. Как можно это исправить? :(


#include <stdio.h>
main()
{
char i;
printf("Enter number 1,2,3 or 4: ");
do
{
scanf("%c",&i);
}
while(i!='1' && i!='2' && i!='3' && i!='4');

i=10;
do
{
printf("Enter number 1 or 2: ");
scanf("%c",&i);
}
while(i!='1' && i!='2' && i!=10);
}

TiamaT 03.09.2003 19:26

хехе, а зачем тебе присваивать i=10, если при первом же обороте цикла ты затираешь свою 10 в i новым значением которое у тебя scanf прочитал с консоли?

SapeR 03.09.2003 20:03

Код:

#include <stdio.h>
main()
{
int i1,i2;
printf("Enter number 1,2,3 or 4: ");
do
{
scanf("%d",&i1);
}
while(i1<1 || i1>4);

printf("Enter number 1 or 2: ");
do
{
scanf("%d",&i2);
}
while(i2<1 || i2>2);
// ...
}


TiamaT 04.09.2003 12:47

SapeR
Еще хорошо бы scanf на getch заменить

Tulip 04.09.2003 13:50

Цитата:

Первоначальное сообщение от SapeR
Код:

#include <stdio.h>
main()
{
int i1,i2;
printf("Enter number 1,2,3 or 4: ");
do
{
scanf("%d",&i1);
}
while(i1<1 || i1>4);

printf("Enter number 1 or 2: ");
do
{
scanf("%d",&i2);
}
while(i2<1 || i2>2);
// ...
}


А нельзя ли чтоб через char (i)? И все-таки, в чем была проблема в моем случае?

SapeR 04.09.2003 13:59

Проблемма в твоём случае была в "букве" ENTER - нажатие на неё генерирует не один символ а два - 13 и 10.
13 закрывает первый скан, а 10 попадает во второй.

Примитивное решение - команда getch() сразу после scanf(%c)
Или вместо scanf("%c",&i) используй i=getche()

TiamaT 04.09.2003 14:12

Tulip
Это тебе в школе такую задачку задали? Помню что-то типа такого в 8 классе в школе писали.

Tulip 04.09.2003 16:00

Да нет. Просто я с Си знаком недели две-три, поэтому еще мало в нем разбираюсь.

SapeR 04.09.2003 16:03

Удачи в изучении !
А с каких языков начинал ?

Tulip 04.09.2003 23:55

Да так, паскаль частично знаю. И еще раньше ява скриптами увлекался.

TiamaT 05.09.2003 11:24

Да блин, теперь народ изучает все не в том порядке как надо, я вот изучал в таком порядке:
ассемблер, С, SH, REGEXP, AWK, SED, PERL.

Tulip 06.09.2003 14:53

А как сделать, чтоб можно было выводить текст на экран в каком-нибудь другом цвете, отличном от стандартного?

И еще. Какой щас самый нормальный компилятор? А то я пользуюсь старьем - TurboC 2.0 под дос.


Часовой пояс GMT +4, время: 00:17.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.