2018计算机项目部第二次培训

计算机项目部第二次培训总结


此次部门培训是c语言的最后一讲,所以讲的内容会显得比复杂,所以下课之后一定要再经过自己的练习。首先先介绍了c语言中结构体这种特殊的聚合数据类型,然后给大家简单介绍了一下链表的定义和概念,并讲解了插入和删除的具体代码。最后给大家科普了一下工程文件的具体种类。临近下课的时候给大家做了几道简单的数组迭代题进行了一下练习。

1. 结构体

结构体本身是一种特殊的数据结构,和我们之前接触的int,char类型都有一些不同。在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。以下是三种不同的定义方式。

#include <stdio.h>
#include <stdlib.h>
main()
{
    //1.先定义结构,再说明结构变量
    struct stu
    {
        int num;
        char name[20];
        int age;
    };
    struct stu boy1,boy2;

//    例如:
    struct stu
    {
        int num;
        char name[20];
        int age;
    };
    STU boy1,boy2;
    //  2.在定义结构类型的同时说明结构变量。
    typedef struct stu
    {
        int num;
        char name[20];
        int age;
    } boy1,boy2;
    //3.直接说明结构变量
    struct
    {
        int num;
        char name[20];
        int age;
    } boy1,boy2;
}

接下来介绍的是结构体的嵌套,结构体中可以放置int, char类型的数据,自然也能房子结构体类型的数据。首先定义一个date,由month(月),day(日),year(年)三个成员组成。在定义并说明变量boy1和boy2时,其中的成员birthday被说明为date结构类型。成员名可以与其他的变量同名,互不干扰。就像图片中显示的一样:
在stu结构体中嵌套了birthday结构体


#include <stdio.h>
#include <stdlib.h>
main()
{
    Struct date
    {
        Int month;
        Int day;
        Int year;
    };
    Struct
    {
        Int num;
        Char name[20];
        Char sex;
        Struct date birthday;
        Float score;
    } boy1,boy2;
}

最后讲解了结构体的赋值,这里给大家介绍的是两种最常见的结构体的赋值方式,即结构变量的赋值就是给各个成员赋值,可以用输入语句或者赋值语句来完成。结构变量成员的一般形式:结构变量名.成员名 例如:boy1.num= 即第一个人的学号。如果成员变量本身就是一个结构,那么需要逐级找到最低级的成员才能使用。例如:boy1.birthday.month 即第一个人出生的月份。

这里我使用了一个小练习来作为示范,设计两个个名字叫做boy1和boy2的结构体,其中包含name,sex,num,score四个变量,尝试使用输入和赋值语句对boy1的四个变量赋值,并使得boy2等于boy1的基础上进行对name新的赋值,最后输出boy1和boy2的所有成员变量

//结构体赋值练习:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    struct stu
    {
        int num;
        char name[20] ="jsjxmb";
        char sex[100]="may be a girl";
        float score;
    } boy1,boy2;

    boy1.num = 102;
    printf("boy1: num\tname\t\tsex\tscore\n");
    printf("     num=%d\tname=%s\tsex=%s\tscore=%f\n",boy1.num,boy1.name,boy1.sex,boy1.score);
    printf("please input sex and score:\n");
    scanf("%s %f",boy1.sex,&boy1.score);

    boy2 = boy1;
    printf("num\tname\t\tsex\tscore\n");
    printf("num=%d\tname=%s\tsex=%s\tscore=%f\n",boy2.num,boy2.name,boy2.sex,boy2.score);
    return 0;
}

到此结构体的内容就结束了

2. 链表

链表是c语言课程中的一个难点,尤其是当小部员们还没能熟练掌握指针的时候,所以我在培训的时候尽量多的举了例子来帮助小部员们进行理解。首先先是链表的概念和我们为什么要使用它。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。它虽较于线性存储结构操作起来稍显复杂,但在插入和离散的存储结构中会更加方便操作。首先我简单介绍了链表作为一个结构体该如何定义

typedef struct _londe
{
  int data;
  struct _londe *next;
}Londe;

data部分的数据类型并不固定,放的是需要存储的数据,而定义的结构体指针*next是指向下一个节点的地址,通过这个指针把不同的结构体连接起来形成了链表。

接下来我为部员们介绍的主要是链表的增删改查的基本操作,应为大多数人是第一次接触这方面的知识,所以培训的时候主要以讲解原理为主

  1. 链表的插入
    在这里插入图片描述
//查找链表
Londe *insert(Londe *head,int i)
{
    Londe *s,*q,*first;
    first=head;
    s=(Londe *)malloc(sizeof(Londe));
    s->next=0;
    s->data=i;
    while(head!=NULL)
    {
        if(head->data>=i)
        {
            q=head;
        }
        head=head->next;
    }
    head=first;
    while (head->next!=q)
    {
        head=head->next;
    }
    head->next=s;
    s->next=q;
    head=first;
    while(first!=0)
    {
        printf("%d ",first->data);
        first=first->next;
    }
    return head;
}

  1. 链表的删除
    在这里插入图片描述
//删除链表
Londe *_delete(Londe *head,int m)
{
    Londe *s,*q,*first;
    first=head;
    s=(Londe *)malloc(sizeof(Londe));
    s->next=0;
    s->data=m;
    while(head!=NULL)
    {
        if(head->data==m)
        {
            q=head;
            break;
        }
        head=head->next;
    }
    head=first;
    if(q==first)
    {
        first=first->next;
    }
    else
    {
        while(head->next!=q)
        {
            head=head->next;
        }
        head->next=q->next;
    }
    head=first;
    while(first!=0)
    {
        printf("%d ",first->data);
        first=first->next;
    }
    return head;
}

链表的插入和删除的原理基本一致,其核心目的都是找到目标的前一个节点和后一个节点的位置,这其中就用到了查方面的知识。在确定好位置之后要通过对next指针的值的改变来实现对原本队列顺序的改变,其难点在于对结构体指针的理解和运用。

3. IO流

考虑到小部员们对文件和对其的管理方面的知识和运用的缺乏,所以在培训的时候是以科普为主,首先是告诉了大家如何找到自己的工程目录,在codeblocks里点击红圈所在的位置就能查看到自己的工程路径
在这里插入图片描述
其次给部员们介绍了打开关闭文件的基本代码和原理,并为他们分析了不同的文件读取和写入的方式
在这里插入图片描述
然后重点为他们分析了绝对路径和相对路径之间的区别,并通过代码对他们进行了展示,最后在IO流方面以一道小练习题收尾:尝试在工程下面建立一个test.txt文件,然后往里面写入“jsjxmb”这行字符,并再次读取出来

//文件读取
#include <stdio.h>
#include <stdlib.h>
main()
{
    FILE *fp;
    char s[80];
    fp=fopen("test1.txt","rt");
    if (fp==NULL)
    {
        printf("Can not open this file\n");
        exit(0);
    }
    fgets(s,80,fp);
    puts(s);
    fclose(fp);
}

//文件写入
main()
{
    FILE *fp;
    char s[80];
    fp=fopen("test1.txt","wt");
    if (fp==NULL)
    {
        printf("Can not open this file\n");
        exit(0);
    }
    gets(s);
    fputs(s,fp);
    fclose(fp);
}

4. 数组与迭代小练习

在课上的最后二十分钟,我给大家布置了两道书上的练习题,一道是输入两个数组,要求输出它们的交集,另外一道是一个简单的约瑟夫环问题。第一道题的核心思想在于节省算力,最好的解决思想在于让两个数组同时移动,即同时取出数组中的数进行比较,代码解释如下:

//求交集
#include<stdio.h>
int jiaoji(int a[],int b[],int c[],int m,int n)
{
    int k,i=0,p=0,q=0;
    while (p<m&&q<n)
    {
        if(a[p]==b[q])
        {
            c[i]=a[p];
            p++;
            i++;
            q++;
        }

        else if(a[p]<b[q])
        {
            p++;
        }
        else
        {
            q++;
        }
    }
    return i;
}

int main()
{
    int m=7,n=6;
    int i,h,a[100],b[100],c[100];
    printf("給a賦值:");
    for (i=0; i<m; i++)
    {
        scanf("%d",&a[i]);
    }
    printf("\n");
    printf("給b賦值:");
    for (i=0; i<n; i++)
    {
        scanf("%d",&b[i]);
    }
    i=jiaoji(a,b,c,m,n);
    for (h=0; h<i; h++)
    {
        printf(" %d ",c[h]);
    }
}

约瑟夫环是一道经典的数组迭代问题,其核心思想在于当循环完一遍之后如何保证计算的自杀人数不发生改变而又从环的开头开始从新计算,而课本上已有对这部分内容的详细解释和代码,大家可以在课余时间内尝试用while循环来完成这段迭代。

猜你喜欢

转载自blog.csdn.net/NOTFOUND_Liu/article/details/84203023