c结构体和结构体数组

练习题1


/*有个数组,找出第二大的数,并且打印出来(使用*操作数组元素个数,不要使用[])
int a[] = {5,100,32,45,21,67,32,68,41,99,13,71};*/

#include <stdio.h>

int main(){
    int a[] = {5,100,32,45,21,67,32,68,41,99,13,71};
    // 最大值, 老二  老三
    int *qian = a, *zhong = a, *hou = a;
    int len = sizeof(a)/sizeof(*a);

    while (len--){
//        printf("i = %d \n", i);
        if(*qian < *hou){
            qian = hou; //
        } else if (*zhong < *hou){
            zhong = hou;
        }
        hou++;
        printf("*qian = %d \n", *qian);
        printf("*zhong = %d \n", *zhong);
        printf("*hou = %d \n", *hou);
        printf("------------------ \n");
    }
    printf("老2 = %d \n", *zhong);
    return 0;
}








    /*
    for (i = 0; i < 13; ++i) {
        if (Max<=a[i])
            Max = a[i];
    }

    for (i = 0; i < 13; ++i) {
        if (SecMax<=a[i] & a[i] <Max)
            SecMax = a[i];
    }
    printf("SecMax = %d\n",SecMax);
    printf("Max = %d",Max);

    return 0;

*/

练习题2

//不使用库函数,实现字符串拷贝功能
//char src[100] = “hello”;
//char dst[100]; //把src的内容拷贝给dst

#include <stdio.h>

int main() {
    char src[100] = "hello";
    char dst[100]; //把src的内容拷贝给dst
    char *p1 =src;
    char *p2 =dst;
//    *p2=*p1;
//    *p2++=*p1++;
//    *p2++=*p1++;
//    *p2++=*p1++;
//    *p2++=*p1++;
//    *p2++=*p1++;
    while (*p2++=*p1++);
    printf("%s \n", dst);

    return 0;
}



前置自增和后置自增的区别

#include <stdio.h>

int main() {
    // 前置 ++ 是先自增 后参与运算
    // 后置 ++ 是先参与运算 后自增
    // 共同点就是 最终都会增加一次
    int a = -6;
    a++;
    printf("a = %d\n", a); // 101
    ++a;
    printf("a = %d\n", a);// 102
    int b = a++ + 10;
    printf("b = %d\n", b);// 112
    printf("a = %d\n", a);// 103

    int c = ++a * 10;
    printf("c = %d\n", c);// 1040
    printf("a = %d\n", a);// 104

    printf("a = %d\n", a++);// 104
    printf("a = %d\n", ++a);// 106

    return 0;
}

复合类型(自定义类型)

结构体

数组:描述一组具有相同类型数据的有序集合,用于处理大量相同类型的数据运算。

有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。

C语言中给出了另一种构造类型——结构体。
在这里插入图片描述
一个变量定义法

char s1[] = "110011 faye 18 1 london";
char s2[] = "110012 eric 18 0 china";

在这里插入图片描述

结构体变量的定义和初始化

定义结构体变量的方式:

  • 先声明结构体类型再定义变量名
  • 在声明类型的同时定义变量
  • 直接定义结构体类型变量(无类型名)
    在这里插入图片描述
    结构体类型和结构体变量关系:
  • 结构体类型:指定了一个结构体类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元。
  • 结构体变量:系统根据结构体类型(内部成员状况)为之分配空间
#include <stdio.h>

int main() {
    // 结构体的定义
    struct teacher{
        char name[50];
        int sal;
    };
    struct stu{
        char name[50];
        int age;
    };
    // 1 先声明结构体类型再定义变量名 并且进行初始化  常用
    struct stu s1 = {"faye", 18};
    struct stu s2 = {"eric", 20};
    // 2 在声明类型的同时定义变量
    struct stu2{
        char name[50];
        int age;
    } s3= {"Bob", 33};
    // 3 直接定义结构体类型变量(无类型名)
    struct {
        char name[50];
        int age;
    } s4 = {"Jordan", 17};

    // 使用
    // 如果是普通变量, 通过点 运算操作符操作结构体成员
    printf("s1.name = %s, s1.age = %d \n", s1.name, s1.age);
    printf("s2.name = %s, s2.age = %d \n", s2.name, s2.age);
    printf("s3.name = %s, s3.age = %d \n", s3.name, s3.age);
    printf("s4.name = %s, s4.age = %d \n", s4.name, s4.age);


    return 0;
}

//如果是指针变量,通过->操作结构体成员

#include <stdio.h>
#include <string.h>

int main() {
    struct stu{
        char name[50];
        int age;
    };
    struct stu s1 ;
    struct stu s2;
    struct stu *p1 = &s1;
    strcpy(p1->name, "eric");
    p1->age = 46;
    strcpy((&s2)->name, "faye");
    (&s2)->age = 16;
    printf("s1.name = %s, s1.age = %d \n", p1->name,  p1->age);
    printf("(&s2)->name = %s, (&s2)->age = %d \n", (&s2)->name, (&s2)->age);
    return 0;
}

结构体数组

#include <stdio.h>
// 统计全班成绩  avg
struct stu{
    int num;
    char name[50];
    char sex;
    float score;
};

int main() {
    int a = 7, b = 8, c= 9;
    struct stu s1 = {111, "Bob", 'M', 100.0};
    struct stu s2 = {112, "Eric", 'F', 100};
    struct stu s3 = {113, "Jordan", 'M', 100.0};
    struct stu s4 = {114, "Smith", 'F', 50.0};
    struct stu s5 = {115, "Hanmeimei", 'M', 50.0};
    // 普通数组
    int arr[3] = {a, b, c};
    // 结构体数组 myclass
    struct stu myClass[5] = {s1, s2, s3, s4, s5};
    float total = 0;
    for (int i = 0; i < 5; i++) {
        total += myClass[i].score;
    }
    printf("total = %f\n", total);
    printf("avg = %f\n", total/5);


    return 0;
}
C语言,可以通过结构体数组循环右移来实现将结果保存到新的结构体数组,同时保持原来的结构体数组不变。下面是一个示例代码: ```c #include <stdio.h> #define SIZE 5 // 定义结构体 typedef struct { int id; char name[20]; } Student; // 结构体数组循环右移函数 void rotateRight(Student* src, Student* dest, int size, int shift) { for (int i = 0; i < size; i++) { int newIndex = (i + shift) % size; dest[newIndex] = src[i]; } } int main() { // 原始结构体数组 Student students[SIZE] = { {1, "Alice"}, {2, "Bob"}, {3, "Charlie"}, {4, "David"}, {5, "Eve"} }; // 新的结构体数组 Student rotatedStudents[SIZE]; // 循环右移并保存结果到新的结构体数组 rotateRight(students, rotatedStudents, SIZE, 2); // 打印原始结构体数组 printf("原始结构体数组:\n"); for (int i = 0; i < SIZE; i++) { printf("id: %d, name: %s\n", students[i].id, students[i].name); } // 打印循环右移后的新结构体数组 printf("循环右移后的新结构体数组:\n"); for (int i = 0; i < SIZE; i++) { printf("id: %d, name: %s\n", rotatedStudents[i].id, rotatedStudents[i].name); } return 0; } ``` 运行以上代码,将会得到以下输出: ``` 原始结构体数组: id: 1, name: Alice id: 2, name: Bob id: 3, name: Charlie id: 4, name: David id: 5, name: Eve 循环右移后的新结构体数组: id: 4, name: David id: 5, name: Eve id: 1, name: Alice id: 2, name: Bob id: 3, name: Charlie ``` 以上代码,`rotateRight`函数实现了结构体数组的循环右移操作,将结果保存到新的结构体数组`dest`。在`main`函数,我们定义了一个原始的结构体数组`students`,并调用`rotateRight`函数将结果保存到新的结构体数组`rotatedStudents`。最后,我们分别打印了原始结构体数组和循环右移后的新结构体数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值