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("\n");
}}
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]='\0';
    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\n");
    else
        printf("No\n");
    printf("%s\n", 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\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", 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]='\0';
 } 

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

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

函数接口定义:

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\n", 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;
    }
}

 

 

posted on 2018-01-26 10:09  开心仔  阅读(1965)  评论(0编辑  收藏  举报

导航