c语言程序的基本结构例题,c语言程序设计的基本结构

发布时间:2022-11-25

本文目录一览:

  1. c语言编程 数据结构题
  2. C语言结构体题
  3. 10道经典的C语言例题(含参考程序)

c语言编程 数据结构题

#include stdio.h
#include stdlib.h
#include conio.h
#define elemType int /* 单链表元素数据类型 */
#define LNODE_SIZE sizeof (struct lNode) /* 单链表结点空间大小 */
#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */
/* 单链表数据结构 */
typedef struct lNode {
    elemType data;
    struct lNode *next;
} lNode, *linkList;
/* 初始化 */
/* 操作结果:构造一个空的单链表L */
void initList (linkList *L) {
    *L = (linkList) malloc (LNODE_SIZE); /* 产生头结点,并使L指向此头结点 */
    if(!*L) /* 内存分配失败 */
        exit (OVERFLOW);
    (*L)->next = NULL; /* 指针域为空 */
}
/* 销毁 */
/* 初始条件:单链表L已存在。操作结果:销毁单链表L */
void destroyList (linkList L) {
    linkList p, q;
    p = L->next; /* p指向第一个结点 */
    while (p) { /* 没到表尾 */
        q = p->next;
        free (p);
        p = q;
    }
    free (L);
}
/* 判断单链表是否为空 */
/* 初始条件:单链表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
int listIsEmpty (linkList L) {
    return L->next == NULL;
}
/* 寻找指定特征(compare)元素的位序 */
/* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
/* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序 */
/* 若这样的数据元素不存在,则返回值为0 */
int locateElem (linkList L, elemType e, status(*compare)(elemType, elemType)) {
    int i = 0;
    linkList p = L->next;
    while (p) {
        i++;
        if (compare(p->data, e)) /* 找到这样的数据元素 */
            return i;
        p = p->next;
    }
    return 0;
}
/* 数据元素判定 */
/* 满足为1,否则为0 */
int compare (elemType des, elemType src) {
    return des == src;
}
/* 单链表指定位置插入新元素 */
/* 操作结果:在带头结点的单链表L中第i个位置之前插入元素e */
status listInsertNode (linkList L, int i, elemType e) {
    int j = 0;
    linkList p = L, s;
    while (p && j < i - 1) { /* 寻找第i-1个结点 */
        p = p->next;
        j++;
    }
    if (!p || j < i - 1) /* 插入位置不合理:i小于1或者大于表长 */
        return ERROR;
    /* 生成新结点,并插入L中 */
    s = (linkList) malloc (LNODE_SIZE);
    if(!s) /* 内存分配失败 */
        exit (OVERFLOW);
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}
/* 删除单链表指定位置元素 */
/* 操作结果:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
status listDeleteNode (linkList L, int i, elemType *e) {
    int j = 0;
    linkList p = L, q;
    while (p->next && j < i - 1) { /* 寻找第i个结点,并令p指向其前驱结点 */
        p = p->next;
        j++;
    }
    if (!p->next || j < i - 1) /* 删除位置不合理:i小于1或者大于表长 */
        return ERROR;
    /* 删除并释放结点 */
    q = p->next;
    p->next = q->next;
    *e = q->data;
    free (q);
    return OK;
}
/* 打印链表内容 */
/* 初始条件:单链表L已存在。操作结果:当链表不为空时,打印链表内容并返回OK,否则返回ERROR */
status printList (linkList L) {
    linkList p = L->next; /* p指向第一个结点 */
    if (listIsEmpty (L)) {
        puts ("The link list is empty! ");
        return ERROR;
    }
    while (p) {
        printf ("%d\t", p->data);
        p = p->next;
    }
    putchar ('\n');
    return OK;
}
int main (void) {
    linkList L;
    elemType e;
    int index;
    /* 初始化链表 */
    initList (L);
    /* 插入若干元素 */
    listInsertNode (L, 1, 1);
    listInsertNode (L, 2, 4);
    listInsertNode (L, 3, 6);
    listInsertNode (L, 4, 7);
    listInsertNode (L, 5, 10);
    printf ("初始链表内容:\n");
    printList (L);
    putchar ('\n');
    /* 寻找数据为6的结点位置 */
    index = locateElem (L, 6, compare);
    printf ("数据为6的结点位置:\n%d\n", index);
    putchar ('\n');
    /* 在数据为6的结点之前插入数据为5的结点 */
    listInsertNode (L, index, 5);
    printf ("当前链表内容:\n");
    printList (L);
    destroyList (L);
    getch (); /* 屏幕暂留 */
    return 0;
}

C语言结构体题

#include stdio.h
#define N 5
void input_stu(struct Stu *stu);
void output_avg(struct Stu *stu);
struct Stu {
    int id;
    char name[10];
    int sex;
    float math;
    float eng;
    float c;
};
int main() {
    struct Stu stu[N];
    input_stu(stu);
    output_avg(stu);
    return 0;
}
void input_stu(struct Stu *stu) {
    int i = 1;
    do {
        printf("请输入第%d个学生的姓名 学号 性别 数学成绩 英语成绩 C语言成绩:", i);
        struct Stu *s = stu + i - 1;
        scanf("%s %d %d %f %f %f", s->name, &s->id, &s->sex, &s->math, &s->eng, &s->c);
        i++;
    } while (i <= N);
}
void output_avg(struct Stu *stu) {
    int i = 1;
    printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s","学 号", "姓 名", "性 别", "高 数", "英 语", "C", "平均分");
    struct Stu *s = stu + i - 1;
    float math_avg = stu->math, eng_avg = stu->eng, c_avg = stu->c;
    putchar(10);
    do {
        struct Stu *s = stu + i - 1;
        math_avg = ((i - 1)*math_avg + s->math) / i;
        eng_avg = ((i - 1) * eng_avg + s->eng) / i;
        c_avg = ((i - 1)*c_avg + s->c) / i;
        printf("%-8d%-8s%-8s%-8.1f%-8.1f%-8.1f%-8.1f",
               s->id, s->name, s->sex == 1 ? "男" : "女", s->math, s->eng, s->c, (s->math + s->eng + s->c) / 3);
        putchar(10);
        i++;
    } while (i <= N);
    printf("%-12s%-12s%-12s%", "数学平均分", "英语平均分", "C平均分");
    putchar(10);
    printf("%-12.1f%-12.1f%-12.1f", math_avg, eng_avg, c_avg);
}

10道经典的C语言例题(含参考程序)

  1. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一个“水仙花数”,因为153=1^3+5^3+3^3。
#include stdio.h
#include math.h
int main() {
    int bai_wei, shi_wei, ge_wei, i, sum = 0;
    for(i = 100; i < 1000; i++) {
        bai_wei = i / 100;
        shi_wei = (i % 100) / 10;
        ge_wei = i % 10;
        if(i == pow(bai_wei, 3) + pow(shi_wei, 3) + pow(ge_wei, 3)) {
            printf("%d ", i);
            sum++;
            if(sum % 5 == 0)
                printf(" ");
        }
    }
    printf(" ");
    return 0;
}
  1. 请输入任意两个整数x和y,求其最大公约数和最小公倍数。
#include stdio.h
int main() {
    int x, y, min, max, i;
    printf("请输入任意两个整数:");
    scanf("%d%d", &x, &y);
    min = x < y ? y : x;
    max = x > y ? x : y;
    for(i = min; i > 0; i--)
        if(x % i == 0 && y % i == 0) {
            printf("这两个整数的最大公约数为:%d ", i);
            break;
        }
    for(i = max; i <= x * y; i++)
        if(i % x == 0 && i % y == 0) {
            printf("这两个整数的最小公倍数为:%d ", i);
            break;
        }
    return 0;
}
  1. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include stdio.h
#include string.h
#include math.h
#define N 50
int main() {
    int sum1 = 0, sum2 = 0, sum3 = 0, sum4, i = 0;
    char str[N];
    printf("请输入一串字符串:");
    scanf("%s", str);
    for(i = 0; i < strlen(str); i++) {
        if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
            sum1++;
        if(str[i] == ' ')
            sum2++;
        if(str[i] >= '0' && str[i] <= '9')
            sum3++;
    }
    sum4 = strlen(str) - sum1 - sum2 - sum3;
    printf("英文字母的个数:%d ", sum1);
    printf("空格的个数:%d ", sum2);
    printf("数字的个数:%d ", sum3);
    printf("其他符号的个数:%d ", sum4);
    return 0;
}
  1. 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
#include stdio.h
#include math.h
int main() {
    int a, n, s = 0, i, x = 0, y = 0;
    printf("请输入整数a的值:");
    scanf("%d", &a);
    printf("请输入相加的个数n:");
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        x = y + 2 * pow(10, i);
        y = x;
        s = s + x;
    }
    printf("s=%d ", s);
    return 0;
}
  1. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。
#include stdio.h
int main() {
    int sum = 0, i, j;
    printf("在1000以内的完数有:");
    for(i = 2; i <= 1000; i++) {
        for(j = 1; j < i; j++)
            if(i % j == 0)
                sum = sum + j;
        if(sum == i)
            printf("%d ", i);
        sum = 0;
    }
    printf(" ");
    return 0;
}
  1. 输入一个不多于5位的正整数,要求:1、求它是几位数;2、逆序打印出个位数字。
#include stdio.h
int pows(int a, int n) {
    int sum = 1, i;
    for(i = 0; i < n; i++)
        sum = sum * a;
    return sum;
}
int main() {
    int n, i, k, x;
    printf("n=");
    scanf("%d", &n);
    for(i = 1; i < 6; i++)
        if(n / pows(10, i) == 0) {
            printf("%d ", i);
            k = i;
            break;
        }
    for(i = 0; i < k; i++) {
        x = n / pows(10, i) % 10;
        printf("%d", x);
    }
    printf(" ");
    return 0;
}
  1. 输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#include stdio.h
int main() {
    int n, a[5], i = 0;
    printf("请输入一个5位数:");
    scanf("%d", &n);
    while(n != 0) {
        a[i] = n % 10;
        n = n / 10;
        i++;
    }
    if(a[0] == a[4] && a[1] == a[3])
        printf("这个数是回文数 ");
    else
        printf("这个数不是回文数 ");
    return 0;
}
  1. 利用递归算法,将所输入的5个字符,以相反顺序打印出来。
#include stdio.h
void digui(char a[], int n) {
    if(n == 1)
        printf("%c", a[0]);
    else {
        printf("%c", a[n - 1]);
        digui(a, n - 1);
    }
}
int main() {
    char str[5];
    printf("请输入5个字符:");
    scanf("%s", str);
    digui(str, 5);
    printf(" ");
    return 0;
}
  1. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个序列的前20项之和。
#include stdio.h
int main() {
    int i, a = 1, b = 1;
    float sum = 0.0;
    for(i = 1; i <= 20; i++) {
        sum = sum + (float)(a + i) / b;
        b = a + i;
        a = i;
    }
    printf("sum=%f ", sum);
    return 0;
}
  1. 利用递归算法求5!。
#include stdio.h
int digui(int n) {
    if(n == 1)
        return 1;
    else
        return n * digui(n - 1);
}
int main() {
    int n, sum;
    printf("n:");
    scanf("%d", &n);
    sum = digui(n);
    printf("sum=%d ", sum);
    return 0;
}
推荐文章