zoukankan      html  css  js  c++  java
  • C语言第二次实验报告

    一 . 实验题目

    二 . 实现方法

    三 . 心得体会

    题目一     11-6方阵循环右移

     11-6 方阵循环右移(20 分)

    本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n1列变换为第nm、nm+1、⋯、n1、0、1、⋯、nm1列。

    输入格式:

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

    输出格式:

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

    输入样例:

    2 3
    1 2 3
    4 5 6
    7 8 9

    输出样例:

    2 3 1 
    5 6 4 
    8 9 7

    问题:把循环右移想得过于复杂。

    方法:采用  b[i][(j+m)%n]=a[i][j];的方法,通过寻找规律,巧妙解决问题

    心得:写程序有时要结合数学规律。换种思路很重要。

    源程序

    #include<stdio.h>
    int  main()
    {
        int m,n;
        int 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("
    ");
    }}
    return 0;}

    题目二   12-8 删除重复字符(20 分)

    本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

    输入格式:

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

    输出格式:

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

    输入样例:

    ad2f3adjfeainzzzv
    

    输出样例:

    23adefijnvz
    问题:找到重复的之后不知道怎么把它删除。
    解决方法:先把原数组进行排序,再定义一个新数组存放没有重复的字符。

    源程序

    char a[1000];
        char b[1000];
        int j,i,len;
        char temp;
        gets(a);
        len=strlen(a);
        for(i=0;i<len;i++)//排序 
        for(j=i+1;j<len;j++)
        if(a[i]>a[j]) 
        {
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;    
        }
        b[0]=a[0];j=0;//滤去重复的,赋值给新数组 
        for(i=1;i<len;i++)
        {
            if(b[j]==a[i]) continue;
            else
            j++;b[j]=a[i];
        }
    
        b[j+1]='';
        puts(b);

    题目三  13-5 判断回文字符串(20 分)

    本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

    函数接口定义:

    bool palindrome( char *s );
    

    函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false

    裁判测试程序样例:

    #include <stdio.h>
    #include <string.h>
    
    #define MAXN 20
    typedef enum {false, true} bool;
    
    bool palindrome( char *s );
    
    int main()
    {
        char s[MAXN];
    
        scanf("%s", s);
        if ( palindrome(s)==true )
            printf("Yes
    ");
        else
            printf("No
    ");
        printf("%s
    ", s);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例1:

    thisistrueurtsisiht
    

    输出样例1:

    Yes
    thisistrueurtsisiht
    

    输入样例2:

    thisisnottrue
    

    输出样例2:

    No
    thisisnottrue

     

    实现方法:将循环从头,从尾开始进行比较
    bool palindrome( char *s )
    {
        int i=0,k=strlen(s)-1;
        
        while(i<k){
            if(s[i]!=s[k])
            break;
            i++;
            k--;
        }
        if(i>=k){
                return true;
        }
    else {
            return false;
        }
        }

    题目四   14-2 删除字符

    本题要求实现一个删除字符串中的指定字符的简单函数。

    函数接口定义:

    void delchar( char *str, char c );
    

    其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

    裁判测试程序样例:

    #include <stdio.h>
    #define MAXN 20
    
    void delchar( char *str, char c );
    void ReadString( char s[] ); /* 由裁判实现,略去不表 */
    
    int main()
    {
        char str[MAXN], c;
    
        scanf("%c
    ", &c);
        ReadString(str);
        delchar(str, c);
        printf("%s
    ", str);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例:

    a

    happy new year

    输出样例:

    hppy new yer

    问题:不知如何删除字符

    实现方法:采用与滤去重复字符的方式相同,建立一个新数组存放

    源程序:

    void delchar( char *str, char c )
    {
        int i,k=0;
        for(i=0;str[i];i++)
        if(str[i]!=c)
        str[k++]=str[i];
        str[k]='';
     } 

    题目五:利用函数字符串实现字符串逆序

    本题要求实现一个字符串逆序的简单函数。

    函数接口定义:

    void f( char *p );
    

    函数fp指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

    裁判测试程序样例:

    #include <stdio.h>
    #define MAXS 20
    
    void f( char *p );
    void ReadString( char *s ); /* 由裁判实现,略去不表 */
    
    int main()
    {
        char s[MAXS];
    
        ReadString(s);
        f(s);
        printf("%s
    ", s);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例:

    Hello World!
    

    输出样例:

    !dlroW olleH
    实现方法:通过指针返回多个结果,并从头,从尾开始交换信息
    心得:指针是很巧妙的工具

    源程序
    #include <string.h>
    void f( char *p )
    {
        int i;
        char *temp;
        int len=strlen(p);
        for(i=0;i<len/2;i++)
        {
            temp=*(p+i);
            *(p+i)=*(p+len-1-i);
            *(p+len-i-1)=temp;
        }
    }
     
  • 相关阅读:
    Codeforces Round #366 (Div. 2)
    Codeforces Round #367 (Div. 2)
    带权并查集小练
    Codeforces Round #368 (Div. 2)
    Codeforces Round #396 (Div. 2)
    Codeforces Round #376 (Div. 2)
    工作流
    程序员之江湖感想
    工作流设计简介
    程序员常去的103个网站
  • 原文地址:https://www.cnblogs.com/huangqingqing/p/8358258.html
Copyright © 2011-2022 走看看