Обсуждение Программирование на C/C++

Shell

Ословед
самый короткий вариант
Код:
#include <stdio.h>
int main()
{ int k=0,c=0,a=0;
  while(c!='\n')
  { c=getchar(); 
    if(c>='0' && c<='9') 
      k=k*10+c-'0';
    else 
    { if(a) do {
        putchar(a);
      } while(--k>0);
      a=c;
      k=0;
    }
  }
}
 

    blazer

    очки: 11
    :)

    Archy

    очки: 16
    :)

JC Denton

Ословед
на с++... надеюсь, не критично...
Можно так:
Код:
#include <iostream>
int main(int argc, char *argv[])
{
  int i, j;
  std::string inputString;
  const char *tempArray;
  std::cin >> inputString;
  try
  {
    tempArray = new char[inputString.length()+1];
  }
   catch (std::bad_alloc)
   {
      std::cout << "Could not allocate. Bye ...";
      exit(-1);
   }
  tempArray = inputString.c_str();
  for(i = 0; i < inputString.length(); i++)
  {
     if( (tempArray[i] > 64 && tempArray[i] < 91) || (tempArray[i] > 96 && tempArray[i] < 123) )
      {
        if( (((int)tempArray[i+1]-48) >= 0) && (((int)tempArray[i+1]-48) < 10))
        {
          for(j = 0; j < (tempArray[i+1] - 48); j++)
             std::cout << tempArray[i];
        }
        else 
        {
          std::cout << "\nIncorrect format of a line" << std::endl;
          break;
        }
      }
  }
  std::cout << std::endl;
  delete[] tempArray;
  std::cin.get();
  return 0;
}
Только здесь и строчные буквы прокатывают. Если не хочешь, чтобы они выводились - убери условие || (tempArray > 96 && tempArray < 123) .

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

    blazer

    очки: 11
    спасибо )) думала, что проблема в копировании, ток не знала почему :)
F

fominaes

А мне тоже нужна вот такая программа нужно написать одну программу на С которая будет "распаковывать" строку типа A4B3C7 в строку AAAABBBCCCCCCC. строка вводится с клавиатуры и выводится на экран

только у вас написано уж оченьсложно ,я не понимаю алгоритма что и от куда берется..пожалуйста напишите только а
самым элементарным способом))а то препод на меня смотрит как то не так))с этой прогой))
 

Sashka_74@

Ословед
самый короткий вариант
Код:
#include <stdio.h>
int main()
{ int k=0,c=0,a=0;
  while(c!='\n')
  { c=getchar(); 
    if(c>='0' && c<='9') 
      k=k*10+c-'0';
    else 
    { if(a) do {
        putchar(a);
      } while(--k>0);
      a=c;
      k=0;
    }
  }
}
а что значит это строка k=k*10+c-'0'; сначала мы присваеваем к=0 потом это строка а потом опять к=0
обьясните пожалуйста)
 
а что значит это строка k=k*10+c-'0'; сначала мы присваеваем к=0 потом это строка а потом опять к=0
обьясните пожалуйста)

Код:
Код:
#include <stdio.h>
int main()
{ int k=0,c=0,a=0;       //Инициализация нулями
  while(c!='\n')       //Переберать пока не нажали ENTER
  { c=getchar();        //Получить ascii-код с клавы
    if(c>='0' && c<='9') //Если получили число (смотри ASCII коды)
      k=k*10+c-'0';    //Если двойное число, пример:A13B156 (для того и *10)
    else               //Если нет
    { if(a) do {         //Выводить букву(старую) k раз
        putchar(a);
      } while(--k>0);
      a=c;            //Запомнить новую букву для послед. вывода
      k=0;            //Обнулить счётчик
    }
  }
}
 
Подскажите как убрать форму и спрятать прогу(с панели пуска)? C++Builder 6

Создаеш Application, в Object Inspectore жмеш Events и два раза на OnPaint, пишеш Form1->Hide(); Усе.

Или:

Создаеш Application, View->ProjectMeneger, Выделяеш Unit1.cpp жмеш клавишу DELETE.

Иль так:

Открываеш Notepad пишеш:

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
}

Ну иль так :) :
void main(void)
{
}

Сохраняеш куда нить с расширением ".cpp"
Запускаеш билдер, открываеш этот файл, он скажет создать проект, содаеш и вуаля.
 
В принципе, чтобы работать со строками string, достатчно этого?:
using namespace std;
#include <iostream>
Иногда происходит странная трансформация string в AnsiString(ошибка при компиляции, хотя я объявлял только string, как объявлять объект класса AnsiString не знаю), это баг билдера?

и как можно в консольной программе воспользоваться ф-ми IntToStr и StrToInt? компилятор пишет, что ф-ии не определены, подключал
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <alloc.h>
#include <string>
#include <iostream>
using namespace std;
 
2agent
насколько мне известно Iostream не наследует класс string так что подключать его нужно отдельно ;)
по поводу функций преобразований типов
Utility Functions: <stdlib.h>

double atof(const char *s)
int atoi(const char *s
long atol(const char *s)
ну и соответственно есть аналогичные функции наооборот тобиш
itoa итд но тут происходит преобразование типа char* наверняка со стрингом тоже чет должно быть:)

ЗЫ я бы написал свою функцию преобразования типа дело 5 минут
 
Код:
//a.h
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)

//a.cpp
#include <string.h>
#include <conio.h>
#include <stdio.h>
long makeTable(void);
char abc [64];
//(описание ф-ий)

//unit1.cpp
#include "a.h"
//....
makeTable();

Компилятор говорит, что в a.h ошибки декларации(определения). сам не могу разобраться:idontno:, подскажите
 

JC Denton

Ословед
2agent
насколько мне известно Iostream не наследует класс string
При чем здесь наследование вообще? модуль "наследует" класс?
Чтобы использовать string как с-строку, нужно вызвать ее метод c_str(), например:
Код:
    std::string s = "12";
    int t = atoi(s.c_str());
 
//a.h
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)

//a.cpp
#include <string.h>
#include <conio.h>
#include <stdio.h>
long makeTable(void);
char abc [64];
//(описание ф-ий)

//unit1.cpp
#include "a.h"
//....
makeTable();
возможно дело в забытом вложении a.h в a.cpp?
кстати по правилам все инклуды ну жно объявлять в заголовках. те нужно перенести все #include <...> из a.cpp в a.h, добавив ссылу на заголовок в реализацию:
Код:
//a.h
[U]#include <string.h>
#include <conio.h>
#include <stdio.h>[/U]
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)

//a.cpp
[B]#include "a.h"[/B]
long makeTable(void);
char abc [64];
//(описание ф-ий)
 
Код:
//a.h
[U]#include <string.h>
#include <conio.h>
#include <stdio.h>[/U]
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)

//a.cpp
[B]#include "a.h"[/B]
long makeTable(void);
char abc [64];
//(описание ф-ий)

но тогда получится(так нельзя же делать):
Код:
//а.срр
#include <string.h>
#include <conio.h>
#include <stdio.h>
[COLOR="#ff0000"]extern char abc [64];[/COLOR]
long makeTable(void);
long makeTable(void);
[COLOR="Red"]char abc [64];[/COLOR]
опять-таки выдает ошибку, причем в файле a.h, хотя в нем нет инклюдов на другие нестандартные файлы
 
2agent
получиться то что и должно получиться
abc описана в цпп файле (реализации), а extern в заголовке (так и надо).
Идеологии РЕАЛЬНЫХ вложений файлов друг в друга на самом деле нету.
Цпп служат для описания "мозгов" модуля, а взаголовке (.h) указывается что для этого нужно, и что можно видеть другим модулям (в случае с extern, то ещё и как можно видеть). %)
 
вобщем делал так, как вы и говорите, но ошиьки остались:
[C++ Error] func.cpp(3): E2141 Declaration syntax error
[C++ Error] func.cpp(4): E2238 Multiple declaration for 'string'
[C++ Error] func.cpp(3): E2344 Earlier declaration of 'string'

string abc(string);
string f(string);

и дальше аналогичные ошибки по каждой из ф-ий
 
Код:
//a.h
[B]#ifndef A_H
#define A_H[/B]

[U]#include <string.h>
#include <conio.h>
#include <stdio.h>[/U]
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)
[B]#endif[/B]

//a.cpp
[B]#include "a.h"[/B]
long makeTable(void);
char abc [64];
//(описание ф-ий)

#include "a.h" - это же засунь в юнит1 не забудь создать целостный прожект и закинуть туда все файлы, далее если уж так горит обзывать переменные одним именем засунь их в различные пространства имен.
Думаю счас должно заработать
 
//a.h
extern char abc [64];
long makeTable(void);
//(без тел ф-ий)

//a.cpp
#include "a.h"//это тож нужно
#include <string.h>
#include <conio.h>
#include <stdio.h>
long makeTable(void){return 0;}//Тело ф-ции то тож надо описать.
char abc [64];

//unit1.cpp
#include "a.h"
//....
makeTable();

WORMIX
"все инклуды нужно объявлять в заголовках" - это где такое сказано? Дай ссылочку на текст этого правила.
 
Сверху