Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Си]Функция с переменным числом параметров, Суммирование разнотипных переменных 
V
    Опции темы
maxnsk82
Дата 14.6.2010, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



Требуется написать функцию с переменным числом параметров: Первый параметр - форматная строка, в которой каждая цифра обозначает тип очередного параметра: 1-целое, 2-длинное целое, 3-вещественнное. Функция возвращает сумму значений параметров.

Помогите дописать. Оно компилится - ни предупреждений, не ошибок, но не работает:

Код

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

double Summa(char *s,...)
{
double sum;
va_list ap;
va_start(ap,*s);
while (*s != '\0')    // Просмотр форматной строки
{
    putchar(*s);    
    switch(*s++)// Извлечение параметра и переход к следующему
    { 
        case '1': 
        {
            sum += va_arg(ap,int);
            break;
        }
        case '2': 
        {
            sum += va_arg(ap,double);
            break;
        }
        case '3':
        {
            sum += va_arg(ap,long);
            break;
        }
    }
    va_end(ap);
}
return sum;
}   

void main(void)
{
    char fStr[] = "12231";
    clrscr();
    printf("%f \n", Summa(fStr,5,4.6,7.8,5000L,10));
    getch();
}

PM MAIL   Вверх
xvr
Дата 14.6.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

double sum=0.;
В остальном правильно (не считая того, что соотвествие чисел 1/2/3 и типов в вашей программе и в описании отличаются)

PM MAIL   Вверх
maxnsk82
Дата 15.6.2010, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



То что 1/2/3 немного отличается, то фиг с ним)..проинициализировал sum, ещё 
Код

putchar(*s);
 убрал - походу с прошлой версии остался, здесь незачем...но всё равно не работает - компилится так же, и даже запускается, но ничего не выводит( и не реагирует на нажатия клавишь
PM MAIL   Вверх
xvr
Дата 15.6.2010, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Должно работать, может как то не так компилируешь или запускаешь?

PM MAIL   Вверх
maxnsk82
Дата 15.6.2010, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



А у тебя работает этот код?...не знаю что может быть не правильно - как обычно запускаю, другие то программы работали
PM MAIL   Вверх
mes
Дата 15.6.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(maxnsk82 @  15.6.2010,  06:02 Найти цитируемый пост)
А у тебя работает этот код?.

http://codepad.org/0jafTz8l


--------------------
PM MAIL WWW   Вверх
maxnsk82
Дата 15.6.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



Странный там результат выдаёт: 122315029.581384.....у меня, если getchar(*s); оставлять, то выводит "122", и дальше не реагирует, попробовал убрать из строки "3", и из значений лонговое, но всё равно только первые три символа форматной строки и всё:(
PM MAIL   Вверх
mes
Дата 15.6.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(maxnsk82 @  15.6.2010,  07:50 Найти цитируемый пост)
Странный там результат выдаёт:

ну так код постил, тот что Ваш, а там нет 
Цитата(xvr @  14.6.2010,  09:58 Найти цитируемый пост)
double sum=0.;

smile

Цитата(maxnsk82 @  15.6.2010,  07:50 Найти цитируемый пост)
если getchar(*s); оставлять, 

putchar ?

Цитата(maxnsk82 @  15.6.2010,  07:50 Найти цитируемый пост)
то выводит "122",

а если закомментить весь свитч ?




--------------------
PM MAIL WWW   Вверх
maxnsk82
Дата 15.6.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



ну да, putchar:)...закомментил свич - работает ожидаемо: "122310.000000"

изменил форматную строку: "121321" и числа 5, 4.1, 7, 4L, 3.1, 2 - что-то считает но результат: 2.482393..длинная строка чиселв общем в конце много нулей.....0000+е214...т.е. и считает не правильно и если два double подряд то виснет...
PM MAIL   Вверх
maxnsk82
Дата 15.6.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



а если убрать первую двоечку, т.е. форматная строка "11321" то выводит только 1132, и всё...в чём тут может быть дело-то? так то с виду рабочий код...
PM MAIL   Вверх
bsa
Дата 15.6.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



maxnsk82, ты в код не забыл добавить зануление переменной sum о котором талдычит mes?
PM   Вверх
maxnsk82
Дата 15.6.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



не забыл. вот как есть:

Код

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

double Summa(char *s,...)
{
double sum=0.;
va_list ap;
va_start(ap,*s);
while (*s != '\0')    // Просмотр форматной строки
{
    putchar(*s);    
    switch(*s++)// Извлечение параметра и переход к следующему
    { 
        case '1': 
        {
            sum += va_arg(ap,int);
            break;
        }
        case '2': 
        {
            sum += va_arg(ap,double);
            break;
        }
        case '3':
        {
            sum += va_arg(ap,long);
            break;
        }
    }
    va_end(ap);
}
return sum;
} 


void main(void)
{
    char fStr[] = "11321";
    printf(" Summa:%f \n", Summa(fStr,5,7,4L,3.1,2));
    getch();
    
}


есть ещё схожий код, вот он рабочий, мой в общем по аналогии сделан:

Код

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

double varFormat(int type, ...)
{
va_list ap; // ap - argument pointer
double sum = 0;
if (type == 0) return sum;
va_start(ap, type);
do 
{
    switch (type) 
    {
        case 1:
        sum += va_arg(ap, int); // берём интовое значение для суммы
        break;
        case 2:
        sum += va_arg(ap, long); // берём лонг значение для суммы
        break;
        case 3:
        sum += va_arg(ap, double); // берём флоат значение для суммы
        break;
        default:
        printf("Ne pravilny format");
        return 0;
    }
    type = va_arg(ap, int);//opredelyaem tip sleduuzhey
}
while (type);
va_end(ap);
return sum;
}

void main(void)
{
    clrscr();
    printf("%f \n", varFormat(1, 5, 2, 12L, 1, 8, 3, 2.5));
    getch();
}    



Добавлено через 1 минуту и 57 секунд
может тут что-то не так?
Код

va_start(ap,*s);

PM MAIL   Вверх
bsa
Дата 15.6.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



maxnsk82, конечно. Звездочка не нужна. vs_start интересен именно первый параметр, а не первый символ строки.
PM   Вверх
maxnsk82
Дата 15.6.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



Ну вот, разобрались) Спасибо! вся проблема только в этой звёздочке и была
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.