Язык Си в примерах/XCC C
Внешний вид
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
- XCC C
XCC C — это диалект языка Си.[1] У него есть свои преимущества и недостатки:
- вариативные функции, union, double и float, не поддерживаются; никогда не инициализируйте двумерные массивы
- printf() и pow() — встроенные функции
- возможность написания программ на Си под iiixmish2
- простая реализация многопоточности
- вместо Стандартной библиотеки Си предлагается библиотека XmConC плюс useful.h, assert.h и др.
- глобальные переменные автоматически не инициализируются
Примеры программ
[править]fib.c
[править]int fib(int n) {
if(n < 2)
return n;
else
return fib(n - 1) + fib(n - 2);
}
int main() {
for(int i = 0; i < 21; i++)
printf("%d\n", fib(i));
}
gam.c
[править]#include <useful.h>
char block = '@';
char map[1024];
#define WIDTH 41
int p = 0;
void move(int n, int c) {
if(map[p + n] == '.') {
map[p + n] = '+';
map[p] = c;
p += n;
}
}
void boom() {
if(map[p + WIDTH] == block) map[p + WIDTH] = '.';
if(map[p - WIDTH] == block) map[p - WIDTH] = '.';
if(map[p + 1] == block) map[p + 1] = '.';
if(map[p - 1] == block) map[p - 1] = '.';
}
int main() {
char *new_map = "\
+....................................... \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................";
memcpy(map, new_map, strlen(new_map) + 1);
int map_length = strlen(map);
while(true) {
/* вывод карты */
clear_output();
for(int i = 0; i < map_length; i++) {
if(map[i] == ' ')
printf("\n");
else
putchar(map[i]);
}
/***************/
int c = getchar();
switch(c) {
case 'w': move(-WIDTH, '.'); break;
case 's': move(WIDTH, '.'); break;
case 'a': move(-1, '.'); break;
case 'd': move(1, '.'); break;
case 'W': move(-WIDTH, block); break;
case 'S': move(WIDTH, block); break;
case 'A': move(-1, block); break;
case 'D': move(1, block); break;
case ' ': boom(); break;
case 033: exit(EXIT_SUCCESS); break;
default: if(c < 127) block = c;
}
}
}
stack_machine.c
[править]#include <useful.h>
#include <gets.h>
int stack[100];
int stackptr = 0;
void execute(char *command) {
char buf[64];
memset(buf, '\0', sizeof(buf));
if(stackptr < 0 || stackptr >= 100)
exit(1);
memcpy(buf, command, strlen(command) + 1);
// clear stackptr
if(strlen(buf) == 0)
stackptr = 0;
// character
else if(buf[0] == '\'')
stack[stackptr++] = buf[1];
// number
else if((buf[0] >= (int)'0' && buf[0] <= (int)'9') || (buf[1] >= (int)'0' && buf[1] <= (int)'9'))
stack[stackptr++] = atoi(buf);
// print number
else if(strcmp(buf, ".")) {
printf("%d\n", stack[--stackptr]);
//getchar();
}
// print character
else if(strcmp(buf, "emit")) {
printf("%c\n", stack[--stackptr]);
//getchar();
}
// addition...
else if(strcmp(buf, "+")) {
stackptr -= 2;
stack[stackptr] = stack[stackptr] + stack[stackptr + 1];
stackptr++;
}
else if(strcmp(buf, "-")) {
stackptr -= 2;
stack[stackptr] = stack[stackptr] - stack[stackptr + 1];
stackptr++;
}
else if(strcmp(buf, "*")) {
stackptr -= 2;
stack[stackptr] = stack[stackptr] * stack[stackptr + 1];
stackptr++;
}
else if(strcmp(buf, "/")) {
stackptr -= 2;
stack[stackptr] = stack[stackptr] / stack[stackptr + 1];
stackptr++;
}
else if(strcmp(buf, "mod")) {
stackptr -= 2;
stack[stackptr] = stack[stackptr] % stack[stackptr + 1];
stackptr++;
}
/* quit */
else if(strcmp(buf, "bye"))
exit(0);
/* unknown command */
else {
printf("?\n");
//sleep(1);
}
}
int main(int argc, char *argv[]) {
memset(stack, '\0', sizeof(stack));
for(int i = 1; i < argc; i++)
execute(argv[i]);
}
mt.c
[править]#include <misc.h>
int counter_active;
__thread1_t counter() {
/* 1) в новом потоке нельзя вызывать
пользовательские функции
2) все переменные здесь должны быть статическими */
counter_active = 1;
thrd1_int i;
for(i = 0; counter_active; i++) {
printf("\r%d", i);
sleep(1);
}
halt();
}
int main() {
counter();
getc();
counter_active = 0;
sleep(1);
exit(0);
}
thm.c (для Xmtwolime, нужен root)
[править]#include <xmtwolime.h>
#include <useful.h>
main(int argc, char *argv[])
{
if (argc < 3) {
puts ("usage: thm BGCOLOR TEXTCOLOR");
exit (EXIT_FAILURE);
}
mem[__extern_label("_main_bgColor")] = atoi (argv[1]);
mem[__extern_label("_main_otherColor")] = atoi (argv[2]);
exit (EXIT_SUCCESS);
}