首页 > 技术文章 > PTA自己做的一些题

songxi 2020-11-03 10:46 原文

做的一些C语言作业


微小的说明

想当年作业催得紧,编程又不会,幸好网上各路大佬积极分享他们的思想成果帮了我一把。我在此也记录两下我写过的题,在巩固自身的同时服务后人。

基本都是PTA上学校所布置的题目作业,挺简单的,有时间的还是自己想想自己写吧。

函数题

使用函数求奇数和

题干

本题要求实现一个函数,计算N个整数中所有奇数的和,同时实现一个判断奇偶性的函数。
函数接口定义:

int even( int n );
int OddSum( int List[], int N );

其中函数even将根据用户传入的参数n的奇偶性返回相应值:当n为偶数时返回1,否则返回0。函数OddSum负责计算并返回传入的N个整数List[]中所有奇数的和。
裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6
2 -3 7 88 0 15

输出样例:

Sum of ( -3 7 15 ) = 19

我的代码

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{    
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    
    printf(") = %d\n", OddSum(List, N));

    return 0;
}

/* 你的代码将被嵌在这里 */
int even(int n)
{
    if(n % 2 == 0) {
        return 1;
    } else {
        return 0;
    }
    
}

int OddSum(int list[], int N)
{
    int sum = 0;

    for(int i = 0; i < N; i++) {
        if(even(list[i]) == 0) {
            sum = sum + list[i];
        }
    }

    return sum;
}

解析

很简单。唯一需要注意的地方就是

int even( int n )

这个函数一般人都是简单粗暴的写成:

int even(int n)
{
    return (n + 1) % 2;
}

运行,没毛病。
但是本题这种情况中这个函数可能会返回-1。那为什么还可以运行呢?因为我下面的计算函数是当返回0时才开算,其他值效果一样,全是抛掉,所以我们这里“简单粗暴”不会出问题。
为了提醒我们有这回事,我们在这里把函数老老实实的写成:

int even(int n)
{
    if(n % 2 == 0) {
        return 1;
    } else {
        return 0;
    }
    
}

建议深入了解数学取模取余。
参考链接:
-实数范围内的求模(求余)运算:负数求余究竟怎么求

求单链表元素序号

题干

本题要求实现一个函数,求带头结点的单链表中元素序号。
函数接口定义:

int Locate ( LinkList L, ElemType e);

L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Create();/* 细节在此不表 */

int Locate ( LinkList L, ElemType e);

int main()
{
    ElemType e;
    LinkList L = Create();
    scanf("%d",&e);
    printf("%d\n", Locate(L,e));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 4 5 3 -1
5

输出样例:

4

我的代码

int Locate ( LinkList L, ElemType e)
{
    LNode *p;
    int i = 0;
    p = L;
    //从一号节点开始,如果有一号节点的话。
    while (p->next != NULL) {
        p = p->next;
        i++;
        if(p->data == e) {
        //找到了,回i
            return i;
        }

    }
    //如果找不到,那就回0
    return 0;
}

解析

很简单,看注释,不需要解析。

按序号查找单链表

题干

本题要求实现一个函数,Get_LinkList(LinkList L, int i)函数是在带头结点单链表中按序号查找第i个结点的节点,函数返回第i个结点的指针。

函数接口定义:

LNode *Get_LinkList(LinkList L, int i);

其中 L 和 i 都是用户传入的参数。 L是带头结点单链表的头指针; i 是结点的序号。函数须返回 第i个结点的指针。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#define FLAG  -1
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}LNode, *LinkList;

LinkList Creat_LinkList();/*这里忽略函数的实现*/


LNode *Get_LinkList(LinkList L, int i);

int main()
{
    LinkList L;
    int i;
    LNode *p;

    L = Creat_LinkList();
    if(L == NULL)
    { 
        printf("L=NULL,error!"); 
        return 0;  
    }

    scanf("%d",&i);
    if(p = Get_LinkList(L,i))  printf("%d",p->data);
    else printf("NOT");
    return 0;
}

/* 请在这里填写答案 */

输入样例:

11 22 33 44 55 -66 -77 -88 -99 -1
8

输出样例:

-88

我的代码

LNode *Get_LinkList(LinkList L, int i)
{
    int temp = 0;
    LNode *temp_p = L;
    //能找到的情况
    while(temp != i && temp_p->next != NULL) {
        temp_p = temp_p->next;
        temp++;
        if(temp == i) {
            return temp_p;
        }
    }
    //如果找不到,那么意味着temp == i && temp_p->next == NULL
    return NULL;
}

推荐阅读