当前位置: 首页 > news >正文

C语言第二次实验报告

一.实验题目,设计思路与实现方法


题目一

11-6 方阵循环右移(20 分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

实现方法:

利用数组矩阵,采用m余数的方法,b[i][(j+m)%n]=a[i][j],来实现移动。

题目二

12-8 删除重复字符(20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。

输出格式:

输出去重排序后的结果字符串。

实现方法:

利用for循环,直到找到对应的非空字符串,从这个非空字符串开始,每位从前移动一位,即可实现。

题目三
13-4 使用函数的选择法排序(25 分)

本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:
'''void sort( int a[], int n );

其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

实现方法:

选择排序法是课本要求的需要掌握的一种排序方法,利用两个嵌套循环实现排序。

题目四

14-5 指定位置输出字符串(20 分)
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。

函数接口定义:

‘’‘’char match( char s, char ch1, char ch2 );

函数match应打印s中从'ch1'到'ch2'之间的所有字符,并且返回'ch1'的地址。

实现方法:

利用指针,利用for循环先查找ch1,若找ch1,则指针指向ch1的地址后,继续查找ch2,最后返回ch1的首地址。

题目五
15-5 建立学生信息链表(20 分)

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:

```void input();

该函数利用'scanf'从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
    int              num;     
    char             name[20]; 
    int              score;    
    struct stud_node *next;  
};

单向链表的头尾指针保存在全局变量'head'和'tail'中,输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

部分源代码

11-6 方阵循环右移

int m,n,i,j;
    scanf("%d %d",&m,&n);
    int a[n][n],b[n][n];
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            b[i][(j+m)%n]=a[i][j];
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",b[i][j]);
            if(j==n-1)
            printf("\n");
        }
        }

12-8 删除重复字符

char s[80],b[80];
    int i,j,len,t;
    gets(s);
    len=strlen(s);
    for(i=0;i<len;i++)
    for(j=i+1;j<len;j++)
        if(s[i]>s[j]){
            t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
        b[0]=s[0];
        j=0;
        for(i=1;i<len;i++){
            if(b[j]==s[i])
            continue;
            else {
                j++;
                b[j]=s[i];
            }
        }
    j++;
    b[j]='\0';  
    puts(b);

13-4 使用函数的选择法排序
裁判测试程序样例:

void sort( int a[], int n );
int main()
{
    int i, n;
    int a[MAXN];

    scanf("%d", &n);
    for( i=0; i<n; i++ )
        scanf("%d", &a[i]);

    sort(a, n);

    printf("After sorted the array is:");
    for( i = 0; i < n; i++ )
        printf(" %d", a[i]);
    printf("\n");

    return 0;
}

代码如下:

void sort( int a[], int n ){
    int index,k,i,t;
    for(k=0;k<n-1;k++){
        index=k;
        for(i=k+1;i<n;i++)
        if(a[i]<a[index]) index=i;
        t=a[index];
        a[index]=a[k];
        a[k]=t;
    }
}

14-5 指定位置输出字符串
裁判测试程序样例:

#include <stdio.h>
#define MAXS 10
char *match( char *s, char ch1, char ch2 );
int main()
{
    char str[MAXS], ch_start, ch_end, *p;
    scanf("%s\n", str);
    scanf("%c %c", &ch_start, &ch_end);
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);

    return 0;
}

代码如下:

char *match( char *s, char ch1, char ch2 ){
    char str[MAXS]; 
    char *p,*q, *t;
    int i;
    p = s;
    while(*p!=ch1&&*p!='\0'){//
        p++;
    }
    q = p;
    for(i=0;i<MAXS && *p !='\0' && *p != ch2;i++,p++){
        str[i] = *p;    
    }
    if(*p != '\0'){
        str[i] = ch2;
        str[++i] = '\0';
    }
    str[i] = '\0';  
    printf("%s\n",str);
    
    return q;
}

15-5建立学生信息链表
裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
    struct stud_node *p;
    head = tail = NULL;
    input();
    for ( p = head; p != NULL; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);
    return 0;
}

代码如下:

void input(){
    struct stud_node *p;
    head = (struct stud_node*)malloc(sizeof(struct stud_node));
    head->next = NULL;
    p = head;
    while(1)
    {
        tail = (struct stud_node*)malloc(sizeof(struct stud_node));
        scanf("%d", &tail->num);
        if (!tail->num) break;
        scanf("%s%d", tail->name, &tail->score);
        p->next = tail;
        p=tail;
    }
    head = head->next;
}

遇到的问题,解决方法和心得体会

指针的难度让我明显感受到这五次作业的难度,对指针还是要多加练习,要学会灵活运用getchar()解除缓冲区,利用gets(),puts()输入输出函数。

转载于:https://www.cnblogs.com/tanghuan/p/8358257.html

相关文章:

  • 数据类型、运算符
  • QSizeGrip 小记
  • Oracle创建表空间,添加用户及授权
  • sqlserver字符串拆分(split)方法汇总
  • Pycharm配置autopep8让Python代码更符合pep8规范
  • Union和Union All到底有什么区别
  • SQL——多行并成一行显示, 以字符串分隔(相当于C#中的join)
  • angular1.5 与 angular5 组件的对比
  • maven搭建ssm框架是使用最新mysql 6.0jar遇到的问题
  • 新旧数据ICD的整合
  • linux-ftp install
  • 总结2011,展望2012
  • [ZJOI 2014]力
  • 不辜负每一个日出——Leo2012寄语
  • 微信小程序笔记
  • [nginx文档翻译系列] 控制nginx
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Git学习与使用心得(1)—— 初始化
  • js作用域和this的理解
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Octave 入门
  • PHP面试之三:MySQL数据库
  • Python打包系统简单入门
  • SpriteKit 技巧之添加背景图片
  • Twitter赢在开放,三年创造奇迹
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于webpack 的 vue 多页架构
  • 老板让我十分钟上手nx-admin
  • 聊一聊前端的监控
  • 排序算法学习笔记
  • 如何选择开源的机器学习框架?
  • 通过git安装npm私有模块
  • 微信小程序填坑清单
  • 我从编程教室毕业
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 《天龙八部3D》Unity技术方案揭秘
  • MyCAT水平分库
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (黑马C++)L06 重载与继承
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四) Graphivz 颜色选择
  • . NET自动找可写目录
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET BackgroundWorker
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • /var/spool/postfix/maildrop 下有大量文件
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [@Controller]4 详解@ModelAttribute
  • [] 与 [[]], -gt 与 > 的比较
  • [ActionScript][AS3]小小笔记