--- /dev/null
+# Makefile de ejemplo para C++
+#
+# Creado: jue abr 15 15:34:19 ART 2004
+#
+# Copyleft 2004 - Leandro Lucarella, Bajo licencia GPL [http://www.gnu.org/]
+#
+
+# CONFIGURACION
+################
+
+# Nombre del ejecutable.
+target = charstat
+
+# Extensión de los archivos a compilar (c para C, cpp o cc o cxx para C++).
+extension = cpp
+
+# Archivos con el código fuente que componen el ejecutable. Si no se especifica,
+# toma todos los archivos con la extensión mencionada. Para especificar hay que
+# descomentar la línea (quitarle el '#' del principio).
+# NOTA: No poner cabeceras (.h).
+#fuentes = entrada.cpp
+
+# Si es un programa GTK+, descomentá (quitale el '#' a) la siguiente línea.
+#gtk = si
+
+
+# CONFIGURACION "AVANZADA"
+###########################
+
+# Opciones para el compilador C.
+#CFLAGS = -Wall -ggdb -ansi -pedantic -DDEBUG
+CFLAGS = -Wall -O3 -ansi -pedantic -DNDEBUG
+
+# Opciones para el compilador C++.
+#CXXFLAGS = $(CFLAGS) -fno-inline
+CXXFLAGS = $(CFLAGS)
+
+
+# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION
+####################################################
+
+# Agrego flags y libs de GTK+ de ser necesario.
+ifdef gtk
+CFLAGS += $(shell pkg-config --cflags gtk+-2.0)
+CXXFLAGS += $(shell pkg-config --cflags gtk+-2.0)
+LDFLAGS += $(shell pkg-config --libs gtk+-2.0)
+endif
+
+# Uso enlazador de c++ si es código no C.
+ifeq ($(extension), c)
+enlazador = $(CC)
+else
+enlazador = $(CXX)
+endif
+
+# Si no especifica archivos, tomo todos.
+fuentes ?= $(wildcard *.$(extension))
+
+
+# REGLAS
+#########
+
+.PHONY: all clean
+
+all: $(target)
+
+o_files = $(patsubst %.$(extension),%.o,$(fuentes))
+
+$(target): $(o_files)
+ $(enlazador) $(LDFLAGS) $(o_files) $(LOADLIBES) $(LDLIBS) -o $(target)
+
+clean:
+ @$(RM) -fv *.o $(target)
+
--- /dev/null
+#include <map>
+#include <iostream>
+#include <iomanip>
+#include <algorithm>
+#include <sstream>
+#include <cctype>
+#include <clocale>
+#include <cstdlib>
+
+typedef std::map< char, unsigned > freq_type;
+
+class print: public std::unary_function< freq_type::value_type, void >
+{
+ std::ostream& os;
+public:
+ unsigned total;
+ print(std::ostream& out, unsigned total) : os(out), total(total) {}
+ void operator() (const freq_type::value_type& p)
+ {
+ os.fill('0');
+ os.width(8);
+ os << p.second << ": ";
+ os.width(4);
+ os.fill(' ');
+ if (isgraph(p.first)) {
+ os << p.first;
+ } else {
+ std::ostringstream oss;
+ oss << "0x";
+ oss.width(2);
+ oss.fill('0');
+ oss.setf(std::ios::hex, std::ios::basefield);
+ oss << int(p.first);
+ os << oss.str();
+ }
+ os << " (" << double(p.second) / total * 100 << "%)\n";
+ }
+};
+
+int main(void)
+{
+ std::setlocale(LC_ALL, "es_AR");
+ char c = 0;
+ unsigned total = 0;
+ std::map< char, unsigned > freq;
+ while (std::cin.get(c)) {
+ ++freq[c];
+ ++total;
+ }
+ for_each(freq.begin(), freq.end(), print(std::cout, total));
+ return 0;
+}
+