2014-10-21 2 views
0
int val(){ 
    int value; 

    do{ 
     printf("Enter a value (between 1 & 5): "); 
     scanf("%d", &value); 
     if (value < 1 || value > 5){ 
     printf("*Error!!! Try again.\n"); 
     } 
     else{ 
     printf("Thank You!\n"); 
     } 
    } while (value < 1 || value > 5); 
    return value; 
} 

int main(){ 
    int ran, value1; 
    ran= (rand()% 50)+1; 
    value1=val(); 
    return 0; 
} 

Функция «val» используется для проверки ввода пользователя. Я хочу, чтобы создать еще одну функцию и вызвать его в основной():Как передать нулевые параметры функции

void displayNum(int n, int first, int second, int third, int fourth, int fifth) 

Если пользователь вводит 2, displayNum печатает «первый» и «второй». Если пользователь вводит 5, displayNum печатает «первый», «второй», «пятый».

Примечания: «первая», «вторая», «пятая» - это числа, генерируемые rand(). "Int N" это значение из функции "VAL"

ответ

2
void displayNum(int n, int first, int second, int third, int fourth, int fifth){ 
    switch(n){ 
     case 5:printf("%d", fifth); 
     case 4:printf("%d", fourth); 
     case 3:printf("%d", third); 
     case 2:printf("%d", second); 
     case 1: 
      printf("%d", first); 
      break; 
     default: printf("wrong n value\n"); 
    } 
} 
+0

Спасибо за ваш быстрый ответ. Но как вы можете передать значение1 в displayNum? – UserFriendly

+0

Вы можете вызвать функцию с помощью displayNum (значение1, firstValue, secondValue, thirdValue, 4thValue, пятое значение); 'inside' main() '. – Cantfindname

+0

Что делать, если пользователь хочет 3 ?. Я не думаю, что это все еще работает, если я так делаю: 'displayNum (value1, firstValue, secondValue, thirdvalue);' – UserFriendly

0
void displayNum(int n, int first, int second, int third, int fourth, int fifth){ 
    int temp=1; 
    while(n>=temp){ 
     if(temp==5) 
      printf("%d ", fifth); 

     elseif(temp==4) 
      printf("%d ", fourth); 

     elseif(temp==3) 
      printf("%d ", third); 

     else if(temp==2) 
      printf("%d ", second); 

     else if(temp==1) 
      printf("%d", first); 

      temp++; 

     } 

} 
+0

Благодарим вас за ответ. Я тоже попробую. – UserFriendly

1

Если вы хотите, чтобы исследовать различные авеню, вы могли бы использовать VARIADIC функцию:

#include <stdarg.h> 

void displayNum(int n, ...) 
{ 
    va_list ap; 
    va_start(ap, n); 
    for (int i = 0; i < n; i++) 
    { 
    int value = va_arg(ap, int); 
    printf("%20s: %d\n", label(i+1), value); 
    } 
    va_end(ap); 
    printf("\n"); 
} 

где label функция который распечатает соответствующую метку на основе значения i.

Таким образом, вам не нужно передавать фиксированное количество параметров; если вы хотите, чтобы отобразить одно значение, вы бы назвали это как

displayNum(1, first); 

Если вы хотите отобразить 3 значения, вы бы назвали это как

displayNum(3, first, second, third); 

Первый аргумент n является фиксированной и всегда должны присутствовать. Остальные аргументы считываются на основе значения первого аргумента. Если вы пройдете 1, displayNum будет читать и отображать первый дополнительный аргумент. Если вы пройдете 3, displayNum будет ожидать, что не менее три дополнительных целочисленных аргумента в стеке.

Предостережения: переменные функции не являются безопасными по типу, и компилятор не предупредит вас, когда вы передаете аргументы неправильного типа, и не будет предупреждать вас, если вы передаете слишком мало или слишком много дополнительных аргументов. Если вы называете это displayNum(1, "this is a test");, вы либо потерпите крах, либо получите искаженный результат.

Полный пример: выход

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

const char *label(int n) 
{ 
    const char *units[] = { "zeroth", "first", "second", "third", 
          "fourth", "fifth", "sixth", "seventh", 
          "eighth", "ninth" }; 
    const char *teens[] = { "tenth", "eleventh", "twelfth", "thirteenth", 
          "fourteenth", "fifteenth", "sixteenth", 
          "seventeenth", "eighteenth", "ninteenth" }; 
    const char *decades[] = { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" }; 

    static char buf[256] = {0}; 

    if (n < 10) 
    return units[n]; 
    else if (n < 20) 
    return teens[n-10]; 
    else 
    { 
    int t = n/10; 
    int u = n % 10; 
    sprintf(buf, "%s", decades[t]); 
    if (u > 0) 
    { 
     strcat(buf, "-"); 
     strcat(buf, units[u]); 
    } 
    else 
    { 
     buf[ strlen(buf) - 1 ] = 0; 
     strcat(buf, "ieth"); 
    } 
    return buf; 
    } 

    return ""; 
} 

void displayNum(int n, ...) 
{ 
    va_list ap; 
    va_start(ap, n); 
    for (int i = 0; i < n; i++) 
    { 
    int value = va_arg(ap, int); 
    printf("%20s: %d\n", label(i+1), value); 
    } 
    printf("\n"); 
    va_end(ap); 
} 

int main(void) 
{ 
    displayNum(1, 1); 
    displayNum(2, 1, 2); 
    displayNum(3, 1, 2, 3); 
    displayNum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
    displayNum(25, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
        21, 22, 23, 24, 25); 
    return 0; 
} 

Примера:

 
[[email protected]]~/prototypes/stdarg: ./mystdarg 
       first: 1 

       first: 1 
       second: 2 

       first: 1 
       second: 2 
       third: 3 

       first: 1 
       second: 2 
       third: 3 
       fourth: 4 
       fifth: 5 
       sixth: 6 
      seventh: 7 
       eighth: 8 
       ninth: 9 
       tenth: 10 

       first: 1 
       second: 2 
       third: 3 
       fourth: 4 
       fifth: 5 
       sixth: 6 
      seventh: 7 
       eighth: 8 
       ninth: 9 
       tenth: 10 
      eleventh: 11 
      twelfth: 12 
      thirteenth: 13 
      fourteenth: 14 
      fifteenth: 15 
      sixteenth: 16 
     seventeenth: 17 
      eighteenth: 18 
      ninteenth: 19 
      twentieth: 20 
     twenty-first: 21 
     twenty-second: 22 
     twenty-third: 23 
     twenty-fourth: 24 
     twenty-fifth: 25 

Как написано, функция label будет обрабатывать только входы до 99, после чего вы получите какой-нибудь веселый выход. Стандарт языка C гарантирует не менее 127 аргументов в одном вызове функции, но вы действительно не хотите этого делать.

EDIT

Или вы могли бы избежать весь этот бред и передать свои значения в массиве, который является лучшим подходом, если все значения одного и того же типа:

void displayNum(int n, const int *values) 
{ 
    for (int i = 0; i < n; i++) 
    printf("%20s: %d\n", label(i + 1), values[i]); 
} 
Смежные вопросы