Программа для универа

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Meister, 23 Dec 2005.

  1. Meister

    Meister Elder - Старейшина

    Joined:
    13 Oct 2005
    Messages:
    185
    Likes Received:
    7
    Reputations:
    0
    Я прошу помочь решить одну проблему, но проблема не типа "Решите мне задачу", просто до меня не дойдет как сделать следующее:
    "Дан текстовый файл с неизвестным количеством вещественных чисел Написать функцию для определения есть ли среди них число у которого равны сумма цифр целой и дробной части"
    У меня получилось сделать так, чтобы прграмма отвечала на каждое число, равны ли его сумма дробной и целой части:

    #include <conio.h>
    #include <fstream.h>
    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>

    void main()
    {
    char fni[256];
    const N = 100;
    cout<<"enter filename of input file\n";
    cin>>fni;
    double* pn=new double[N];
    fstream fi;
    fstream fo;
    fi.open(fni,ios::in);
    for(int i=0;(!fi.eof())&&(i<N);i++)
    {
    fi>>pn;
    char a[20],b[20];
    sprintf(b,"%f",pn-((int)pn));
    char* tb=b;
    tb+=2;
    while(*tb=='0') tb++;
    sprintf(a,"%d",(int)pn);
    int ia=0,ib=0;
    char tmp[2];
    for(int j=0;j<20;j++)
    {
    tmp[0]=a[j]; tmp[1]='\0';
    ia+=atoi(tmp);
    }
    for(int j=0;tb[j]!='\0';j++)
    {
    tmp[0]=tb[j]; tmp[1]='\0';
    ib+=atoi(tmp);
    }
    if(ia==ib) fo<<printf("DA - EST");
    else printf("NET - NETU");
    }
    delete [] pn;
    fi.close();
    fo.close();
    getch();
    }

    Потом, я парился парился и допарился, что выводит ответ один, но лишь для первого числа в файле:

    #include <conio.h>
    #include <fstream.h>
    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>

    int main()
    {
    char fni[256];
    const N=100;
    cout<<"enter filename of input file\n";
    cin>>fni;
    double* pn=new double[N];
    fstream fi;
    fstream fo;
    fi.open(fni,ios::in);
    for(int i=0;(!fi.eof())&&(i<N);i++)
    {
    fi>>pn;
    char a[20],b[20];
    sprintf(b,"%f",pn-((int)pn));
    char* tb=b;
    tb+=2;
    while(*tb=='0') tb++;
    sprintf(a,"%d",(int)pn);
    int ia=0,ib=0;
    char tmp[2];
    for(int j=0;j<20;j++)
    {
    tmp[0]=a[j]; tmp[1]='\0';
    ia+=atoi(tmp);
    }
    for(int j=0;tb[j]!='\0';j++)
    {
    tmp[0]=tb[j]; tmp[1]='\0';
    ib+=atoi(tmp);
    }
    if(ia==ib) printf("DA - EST");
    else printf("NET - NETU");
    getch();
    return 0;
    }}

    А мне нужно, чтобы программа не по первому числу отвечала, а анализируя все. Никто не возьмется меня поправить?
     
  2. Mymik

    Mymik New Member

    Joined:
    9 Dec 2005
    Messages:
    13
    Likes Received:
    2
    Reputations:
    0
    Вобщем вот мой вариант :)... я потоки в сишниках не люблю... потому сделал немного по другому, только единственная проблема... у меня тут нет ни сишника, ни хелпа, вобщем нихера нет :) так что за работоспособность не отвечаю :) точнее я только сомневаюсь в условиях где я проверял на ansii-код сиволы... посмотри, если не будет работать :). Там надо сравнить какой код у считываемого символа. Если он входит в диапозон где хранятся цифры, то мы выполняем действи... а если нет, то пропускаем...
    Вобщем если будут вопросы пиши :) будем дальше программить без компилятора :-D
    #include <stdio.h>
    #include <conio.h>

    void main(void){
    FILE *f;
    char fileName[20]; // адрес к файлу
    printf("Введите имя файла -->");
    scanf("%s", fileName); // считываем пусть к нему
    f = fopen(name, "r"); // берем хандл на файл
    char number;
    int left = 0;
    int right = 0;
    int comma = -1;
    int floatIsHere = 0;
    while(!feof){ // цикл пока не конец файла

    fscanf(f, "%c", number);
    if(number == 32){ //32 это ansii-код пробела
    if(left == right)floatIsHere++; //если лева и правая часть равна, то прибавляем
    left = 0; // обнуляем сумму цифр левее запятой
    right = 0; // обнуляем сумму цифр правее запятой
    comma = -1; // готовимся к обработки следующего числа, т.е. к обработке цифры левее запятой
    continue;
    } // end if
    if(number == ','){
    comma = 1; // готовимся к обработке цифр правее запятой
    continue; // пропускаем все оставшиеся действие цикла и становимся на следующий шаг
    } // end if
    if((number => 49) && (number =< 59) && (comma == -1))//я точно не помню ansii-кода символом 1-0 посмотри их
    left += atoi(number);
    if((number => 49) && (number =< 59) && (comma == 1))
    right += atoi(number);
    } // ned while
    if(floatIsHere >= 1)printf("В файле есть бла-бла-бла и их количесво %d", floatIsHere);
    getch();
    } // programm end
     
    #2 Mymik, 23 Dec 2005
    Last edited: 23 Dec 2005
    1 person likes this.
  3. qBiN

    qBiN Вот такой вот я :(

    Joined:
    20 Jan 2005
    Messages:
    834
    Likes Received:
    73
    Reputations:
    33
    Code:
    printf("Введите имя файла -->");
    scanf("%s", fileName); // считываем пусть к нему
    f = fopen(name, "r"); // берем хандл на файл
    Чувак апкурился наверное записывает имя файла в fileName а использует переменную name которая даж не объявляется.
    Астальное лень смотреть.
     
  4. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    зря ты так отзываешься, без компилятора реально ещё не так напортачить, да и чел предупредил что никаких гарантий, полная импровизация, так что всё нормуль для кода написанного на лету :)

    Meister, жаль ты в Си делаешь, в паскале помог бы.
     
  5. Meister

    Meister Elder - Старейшина

    Joined:
    13 Oct 2005
    Messages:
    185
    Likes Received:
    7
    Reputations:
    0
    Да уж, вопросы есть, не знаю как идея, но в целом там много ошибок, которые не поддаются моему исправлению
    Именно об этом комилятор сообщает первым делом.
    Dronga, а ты аватару сменил?
     
  6. qBiN

    qBiN Вот такой вот я :(

    Joined:
    20 Jan 2005
    Messages:
    834
    Likes Received:
    73
    Reputations:
    33
    ну уж простите,но переменные которые используешь надо помнить...
    Не есть гуд. лучше просто брать символ (fputc) а то я не помню фсанф прокручивает файл или нет =) Да и вопще хорошо(и быстрее) будет работать с fputc, функции форматированного ввода медленее...
     
  7. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Ну про явные ошибки типа void main никто не сказал? =)
     
  8. Mymik

    Mymik New Member

    Joined:
    9 Dec 2005
    Messages:
    13
    Likes Received:
    2
    Reputations:
    0
    Господа :) а может все таки напишим челу программу... ну нашли ошибки, так исправте :) я ж сказал, что я писал без какого-либо компилятора и хелпа... все писалось из памяти :-(... и в блакноте :)

    А что за ошибка void main(void) ??? мне очень интересно... Чтобы на это матюкались слышу впервые... Расскажи, я реально не знаю
     
    1 person likes this.
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    main может быть только типа int
    Иначе не компилирует. (только древние компиляторы проглатывают войд)
     
  10. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Mymik этот вариант написанный в блокноте весьма неплохой )) (кстати от меня +) я его переделал в полне работоспособный:
    Code:
    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
    	FILE *f;
    	// нафига вводить имя файла? сразу открываем input.txt
    	if ((f = fopen("input.txt", "rt"))== NULL)
    	{
    		fprintf(stderr, "Cannot open input file.\n");
    		return 1;
    	}
    	
    	clrscr();	// очищаем экран
    	char ch;	// текущий считываемый символ
    	int left = 0;	// сумма цифр левее запятой
    	int right = 0;	// сумма цифр правее запятой
    	int comma = 0;
    
    	while (!feof(f))
    	{
    		fscanf(f, "%c", &ch); // будем читать посимвольно
    
    		if (ch=='.')
    		{
    			comma = 1; // готовимся к обработке цифр правее запятой
    			printf("%c", ch); // выводим текущий символ
    			continue; // пропускаем все оставшиеся действие цикла и становимся на следующий шаг
    		}
    
    		if ((ch>='0') && (ch<='9') && (comma == 0))
    			left += int (ch) - 48; // int (ch) - ASCII код символа, int('0')=48 ... int('9')=57
    		if ((ch>='0') && (ch<='9') && comma)
    			right += int (ch) - 48;
    
    		if (ch == '\n') // если текущий символ - конец строки
    		{
    			if (left==right) printf("\t\tYES\n");
    				else printf("\t\tNO\n");
    			left=right=comma=0;
    			continue; // пропускаем все оставшиеся действие цикла и становимся на следующий шаг
    		}
    		printf("%c", ch); // выводим текущий символ
    	}
    	fclose(f);
    	return 0;
    }
    Тестил, работает 100%
    Input.txt
    Result:
     
    #10 Deem3n®, 24 Dec 2005
    Last edited: 25 Dec 2005
    1 person likes this.
  11. Meister

    Meister Elder - Старейшина

    Joined:
    13 Oct 2005
    Messages:
    185
    Likes Received:
    7
    Reputations:
    0
    Господа, я наверно мало внимания уделил постановке задачи, когда писал пост, но нужно просто
    И я говорю именно, что у меня получилось только по каждому числу, а мне надо в общем, есль ли ли такое число в файле, или нет. И на экран вывести Да или Нет. Димеру и Мумику по плюсу за желание мне помочь.

    Да кстати, Димер, щас проверил твою прогу, просто черныый экран вылетает и сворачивается обратно, прога завершается. Мы делаем в такой среде: File >> New >> Other >> Console Wizard >> Галочки на C++ только оставить.
     
    #11 Meister, 25 Dec 2005
    Last edited: 25 Dec 2005
  12. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    ну переделать не проблема:
    Code:
    #include <stdio.h>
    #include <conio.h>
    
    // Функция возвращает:
    //  1 - если в файле есть число у которого равны сумма цифр целой и дробной части
    //  0 - если этого числа нет
    // -1 - ошибка I/O
    int exists(const char* file_name)
    {
    	FILE *f;
    	char ch;	// текущий считываемый символ
    	int left = 0;	// сумма цифр левее запятой
    	int right = 0;	// сумма цифр правее запятой
    	int comma = 0;
    
    	if ((f = fopen(file_name, "rt"))== NULL)
    	{
    		fprintf(stderr, "Cannot open input file.\n");
    		return -1;
    	}
    
    	while (!feof(f))
    	{
    		fscanf(f, "%c", &ch); // будем читать посимвольно
    
    		if (ch=='.')
    		{
    			comma = 1; // готовимся к обработке цифр правее запятой
    			continue; // пропускаем все оставшиеся действие цикла и становимся на следующий шаг
    		}
    
    		if ((ch>='0') && (ch<='9') && (comma == 0))
    			left += int (ch) - 48; // int (ch) - ASCII код символа, int('0')=48 ... int('9')=57
    		if ((ch>='0') && (ch<='9') && comma)
    			right += int (ch) - 48;
    
    		if (ch == '\n') // если текущий символ - конец строки
    		{
    			if (left==right) return 1;
    			left=right=comma=0;
    		}
    	}
    	fclose(f);
    	return 0;
    }
    
    
    int main()
    {
    	char file_name[255];
    	printf("Enter filename:");
    	scanf("%s", &file_name);
    	switch (exists(file_name))
    	{
    		case 1: printf("YES"); break;
    		case 0: printf("NO"); break;
    		default: printf("I/O Error"); break;
    	}
    	getch();
    	return 0;
    }
    компилится и работает без проблем в TC++ и Visual Studio
     
  13. Meister

    Meister Elder - Старейшина

    Joined:
    13 Oct 2005
    Messages:
    185
    Likes Received:
    7
    Reputations:
    0
    Как-то он по разному отвечает, например на числа
    11.12
    23.34
    12.12

    отвечает
    NO
    Это же не может быть связано с тем, что я использую C++ Builder 6?
     
  14. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    после последнего номера в файле надо нажать <Enter>
    [​IMG]
     
  15. Meister

    Meister Elder - Старейшина

    Joined:
    13 Oct 2005
    Messages:
    185
    Likes Received:
    7
    Reputations:
    0
    Deem3n® А почему так получается, что если ентер в конце есть, то всегда Yes?
     
Loading...
Similar Threads - Программа универа
  1. Peja
    Replies:
    0
    Views:
    2,622