SCAUoj教材习题第八章_第九章

hh

文章目录

  • 一、第八章
    • [8058 一年的第几天](#8058 一年的第几天)
    • [18059 学生成绩表](#18059 学生成绩表)
  • 二、第九章
    • [18060 删除空格](#18060 删除空格)
    • [18061 数的交换](#18061 数的交换)
    • [18062 二维数组每行中的最大值](#18062 二维数组每行中的最大值)
    • [18063 圈中的游戏](#18063 圈中的游戏)
    • [18064 链表的有序合并](#18064 链表的有序合并)
  • 总结

一、第八章

8058 一年的第几天

Description

定义一个结构体类型表示日期类型(包括年、月、日)。程序中定义一个日期类型的变量,输入该日期的年、月、日,

计算并输出该日期是一年的第几天。

c 复制代码
#include <stdio.h>

struct DATE
{
_______________________
};

int days(struct DATE date)
{
_______________________
}

int main()
{
    struct DATE d;
    scanf("%d-%d-%d", &d.year, &d.month, &d.day);
    printf("%d", days(d));
}

输入格式

年月日,格式如样例

输出格式

该年的第几天

输入样例

2015-1-1

输出样例

1

c 复制代码
#include <stdio.h>
struct DATE
{
    int year;
    int month;
    int day;
};
int days(struct DATE date)
{
    int m[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int i = 0,sum = 0;
    if(date.year%4 == 0&&date.year%100!=0||date.year%400 == 0)
        m[2] = 29;
    for(i = 1; i<date.month; i++)
    {
        sum += m[i];
    }
    sum += date.day;
    return sum;
}
int main()
{
    struct DATE d;
    scanf("%d-%d-%d", &d.year, &d.month, &d.day);
    printf("%d", days(d));
}

18059 学生成绩表

Description

输入10个学生,每个学生的数据包括学号、姓名、3门课的成绩。定义结构体类型表示学生类型,输入10个学生的数据,

计算每个学生的平均成绩。按平均成绩由高到低输出所有学生信息,成绩相同时按学号从小到大输出。

c 复制代码
#include <stdio.h>

struct data
{
_______________________
};

int main()
{
    int i,j;
    struct data stu[10],tmp;
    for(i=0; i<10; i++)
    {
_______________________
    }
    for(i=0; i<9; i++)
        for(j=0; j<9-i; j++)
        {
_______________________
        }
    for(i=0; i<10; i++)
    {
        printf("%d %s %.0lf %.0lf %.0lf\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    }
    return 0;
}

输入格式

10个学生信息,每行一个学生

输出格式

如题

输入样例

1 aaa 50 60 70

2 bbb 50 50 50

3 ccc 60 70 80

4 ddd 40 40 40

5 eee 70 80 90

6 fff 30 30 30

7 ggg 80 90 100

8 hhh 20 20 20

9 iii 100 100 100

10 jjj 10 10 10

输出样例

9 iii 100 100 100

7 ggg 80 90 100

5 eee 70 80 90

3 ccc 60 70 80

1 aaa 50 60 70

2 bbb 50 50 50

4 ddd 40 40 40

6 fff 30 30 30

8 hhh 20 20 20

10 jjj 10 10 10

代码如下:

c 复制代码
#include <stdio.h>
struct data
{
     int num;
     char name[20];
     double score[3];
};
int main()
{
    int i,j;
    struct data stu[10],tmp;
    for(i=0; i<10; i++)
    {
        scanf("%d%s%lf%lf%lf",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);//注意那些不用加&
    }
    for(i=0; i<9; i++)
        for(j=0; j<9-i; j++)
        {//注意接下来用的是j不是i
            double sc1 = (stu[j].score[0]+stu[j].score[1]+stu[j].score[2])/3.0;
            double sc2 = (stu[j+1].score[0]+stu[j+1].score[1]+stu[j+1].score[2])/3.0;
            if(sc1<sc2)
            {
                tmp = stu[j];
                stu[j] = stu[j+1];
                stu[j+1] = tmp;
            }
        }
    for(i=0; i<10; i++)
    {
        printf("%d %s %.0lf %.0lf %.0lf\n", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    }
    return 0;
}

二、第九章

18060 删除空格

Description

用指针方法解决,输入一个字符串,删除字符串中所有空格后,输出字符串

c 复制代码
#include <stdio.h>

void removeSpace(char *s)
{
_______________________
}

int main()
{
    char s[81];
    gets(s);
    removeSpace(s);
    printf("%s", s);
    return 0;
}

输入格式

一行字符,以换行回车结束,最多不超过80个字符

输出格式

删除所有空格后输出

输入样例

abc 456

输出样例

abc456

代码如下:

c 复制代码
//$block1$
    int i=0,j=0;
    while(s[j]!='\0')
    {
        if(s[j]==' ')
           j++;
        else
           s[i++]=s[j++];
    }
    s[i]='\0';
//$end1$

18061 数的交换

Description

输入10个整数,把其中最小的数与第一个数交换,最大的数与最后一个数交换。使用3个函数解决问题:

(1) 输入10个整数的函数

(2) 进行交换处理的函数

(3) 输出10个数的函数

c 复制代码
#include <stdio.h>

void input(int a[])
{
    _______________________
}

void swap(int a[])
{
    _______________________
}

void display(int a[])
{
    int i;
    for(i=0; i<10; i++)
        printf("%d\n", a[i]);
}

int main()
{
    int a[10];
    input(a);
    printf("input done\n");
    swap(a);
    printf("swap done\n");
    display(a);
    printf("display done\n");
    return 0;
}

输入格式

输入10个整数

输出格式

输出结果,一行一个数字

输入样例

2 1 3 4 5 6 7 8 9 0

输出样例

input done

swap done

0

1

3

4

5

6

7

8

2

9

display done

代码如下:

c 复制代码
#include <stdio.h>
void input(int a[])
{
    int i;
    for(i=0; i<10; i++)
        scanf("%d", &a[i]);
}
void swap(int a[])
{
    int i = 0,temp = 0,t = 0,y = 0;
    int min = a[0];
    int max = a[0];
    for(i=1;i<10;i++)
    {
        if(min>a[i])
        {
            min = a[i];
            t = i;
        }
    }
        temp = a[0];
        a[0] = a[t];
        a[t] = temp;
    for(i=1;i<10;i++)
    {
        if(max<a[i])
        {
            max = a[i];
            y = i;
        }
    }
        temp = a[9];
        a[9] = a[y];
        a[y] = temp;
}
void display(int a[])
{
    int i;
    for(i=0; i<10; i++)
        printf("%d\n", a[i]);
}
int main()
{
    int a[10];
    input(a);
    printf("input done\n");
    swap(a);
    printf("swap done\n");
    display(a);
    printf("display done\n");
    return 0;
}

18062 二维数组每行中的最大值

Description

输入一个4*4的二维整型数组,使用指针变量查找并输出二维整型数组中每一行的最大值。

c 复制代码
#include <stdio.h>

void find(int a[][4])
{
    int (*p)[4], *q, *max;
    for(_______________________)
    {
        max=*p;
        for(_______________________)
        {
_______________________
        }
        printf("%d\n", *max);
    }
}

int main()
{
    int a[4][4],i,j;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            scanf("%d", &a[i][j]);
    find(a);
    return 0;
}

输入格式

4*4的整数矩阵

输出格式

每行最大值,一行一个

输入样例

1 2 3 4

8 7 6 5

1 1 1 1

2 2 2 2

输出样例

4

8

1

2

代码如下:

c 复制代码
#include <stdio.h>
void find(int a[][4])
{
    int (*p)[4], *q, *max;
    for(p = a;p<a+4;p++)//注意p加1是跳4个字节
    {
        max=*p;
        for(q = *p + 1;q < *p + 4;q++)
        {
            if(*max < *q)
            {
                *max = *q;
            }
        }
        printf("%d\n", *max);
    }
}
int main()
{
    int a[4][4],i,j;
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            scanf("%d", &a[i][j]);
    find(a);
    return 0;
}

18063 圈中的游戏

Description

有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。

输入格式

输入一个数n,1000000>=n>0

输出格式

输出最后留下的人的编号

输入样例

3

输出样例

2

标程如下(它并没有使用链表):

c 复制代码
#include <stdio.h>
int c[1000000];
int main()
{
    int i, j, n, pre, cur;
    scanf("%d", &n);
    if(n==1) printf("1\n");
    else
    {
        for(i=0; i<n-1; i++)
            c[i]=i+1;//所以i<n-1,先把数组c的元素全部赋值为1,2,3的循环
        c[n-1]=0;//最后1个元素为0
        cur=n-1;
        for(i=0; i<n-1; i++)
        {
            for(j=0; j<3; j++)
            {
                pre = cur;//第一次把n-1赋给pre
                cur=c[cur];//第一次cur=c[n-1]
            }
            c[pre]=c[cur];
        }
        printf("%d", pre+1);
    }
    return 0;
}

18064 链表的有序合并

Description

已知有两个链表a和b,结点类型相同,均包括一个int类型的数据。编程把两个链表合并成一个,结点按升序排列。

c 复制代码
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)

struct DATA
{
     long num;
     struct DATA *next;
};

struct DATA *create(int n)
{
     struct DATA *head=NULL,*p1=NULL,*p2=NULL;
     int i;
     for(i=1;i<=n;i++)
     {  p1=(struct DATA *)malloc(LEN);
        scanf("%ld",&p1->num);
        p1->next=NULL;
        if(i==1) head=p1;
        else p2->next=p1;
        p2=p1;
      }
      return(head);
}

struct DATA *merge(struct DATA *head, struct DATA *head2)
{
    _______________________
    return head;
}

struct DATA *insert(struct DATA *head, struct DATA *d)
{
    _______________________
    return head;
}

struct DATA *sort(struct DATA *head) 
{ 
    _______________________
    return head;
} 

void print(struct DATA *head)
{
    struct DATA *p;
    p=head;
    while(p!=NULL)
    {
        printf("%ld",p->num);
        p=p->next;
        printf("\n");
    }
}

main()
{
    struct DATA *head, *head2;
    int n;
    long del_num;
    scanf("%d",&n);
    head=create(n);
    scanf("%d",&n);
    head2=create(n);
    head = merge(head, head2);
    head = sort(head);
    print(head);
}

输入格式

第一行一个数n,表示第一个列表的数据个数

每二行为n个数

第三行为一个数m

第四行为m个数

输出格式

输出合并后的有序的数据,一行一个数

输入样例

2

4 8

3

9 1 5

输出样例

1

4

5

8

9

代码如下:

c 复制代码
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)
struct DATA
{
     long num;
     struct DATA *next;
};
struct DATA *create(int n)
{
     struct DATA *head=NULL,*p1=NULL,*p2=NULL;
     int i;
     for(i=1;i<=n;i++)
     {  p1=(struct DATA *)malloc(LEN);
        scanf("%ld",&p1->num);
        p1->next=NULL;
        if(i==1) head=p1;
        else p2->next=p1;
        p2=p1;
      }
      return(head);
}
struct DATA *merge(struct DATA *head, struct DATA *head2)
{
    struct DATA *p1,*p2;
    p1 = head;
    while(p1->next != NULL)
    {
        p1 = p1->next;
    }
    p1->next = head2;
    return head;
}
struct DATA *insert(struct DATA *head, struct DATA *d)
{
    struct DATA *p0,*p1,*p2;
    p1=head;
    p0=d;
    if(head==NULL)
    {
        head=p0;
    }
    else
    {
        while( (p0->num > p1->num) && (p1->next!=NULL) )
        {
            p2=p1;
            p1=p1->next;
        }
        if( p0->num <= p1->num )
        {
            if( head==p1 ) head=p0;
            else p2->next=p0;
            p0->next=p1;
        }
        else
        {
            p1->next=p0;
        }
    }
    return head;
}
struct DATA *sort(struct DATA *head)
{
    struct DATA* p1,*p2;
    p1 = head -> next;
    head -> next = NULL;
    while(p1 != NULL)
    {
        p2 = p1;
        p1 = p1 -> next;
        p2 -> next = NULL;
        head = insert(head,p2);
    }
    return head;
}
void print(struct DATA *head)
{
    struct DATA *p;
    p=head;
    while(p!=NULL)
    {
        printf("%ld",p->num);
        p=p->next;
        printf("\n");
    }
}
main()
{
    struct DATA *head, *head2;
    int n;
    long del_num;
    scanf("%d",&n);
    head=create(n);

    scanf("%d",&n);
    head2=create(n);

    head = merge(head, head2);
    head = sort(head);
    print(head);
}

总结

还有一个综合性实验(哭)~~

相关推荐
李白同学10 分钟前
【C语言】结构体内存对齐问题
c语言·开发语言
楼台的春风1 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
大数据追光猿2 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!2 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉2 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生2 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴2 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing2 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财2 小时前
加油站(力扣134)
算法·leetcode·职场和发展
王老师青少年编程2 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛