C语言实验报告

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

实验题目:十一次 11-7  十二次12-8 十三次 13-5 十四次 14-3 十五次 15-7

设计思路:11-7:鞍点就是行最大列最小,分两点,一:只有一行一列则必然是鞍点,二:二维(行列大于1)。先从第一行开始找行最大,再在这个数字所对应的列中寻找列最小,若就是行最大,则输出该点的行列下标,不是则进入下一行继续寻找。

     12-8:计算字符长度,字符串排序,除去排好字符里的重复字符,并放入新的字符组里,然后输出

     13-5:计算字符串长度,i从0开始增,j从长度减一开始减,当i<j时,一直判断该两个位置的数是否相同,若有不同循环结束,输出不是回文,若一直循环到i>=j则输出是回文。

        14-3:值得注意的是要返回是的首地址,先找到s的首地址,然后t从首地址依次赋给s末地址及后面的地址。

                  15-7:根据规律,找到递归出口和递归调用函数。

二、源程序

11-7

#include <stdio.h>  
int main()  
{  
    int a[6][6];//定义二维数组  
    int n;  
    scanf("%d",&n);  
    int i,j;  
    for(i=0; i<n; i++)  
        for(j=0; j<n; j++)  
        {  
            scanf("%d",&a[i][j]);  
        }  
    int k=0,y=0,flag=1,p=0;  
    if(n==1)  
        printf("0 0");//只有一个点时,一定是鞍点  
    else  
    {  
        for(i=0; i<n; i++)  
        {  
            y=i;  
            for(p=0; p<n; p++) //找行最大值  
            {  
                if(a[i][k]<=a[i][p])//数组元素之间比较,若比a[i][k]大,则将数组列标赋给k  
                {  
                    k=p;  
                }  
            }  
            for(j=0; j<n; j++)//判断是否为列最小值  
            {  
                if(a[y][k]>a[j][k])//若此行最大值不是列所在最小值,把小的行标赋给y  
                {  
                    y=j;  
                    break;  
                }  
            }  
            if(i==y)//行最大且列最小,判断条件行标不改变  
            {  
                flag=0;  
                break;  
            }  
        }  
        if(flag==0)  
            printf("%d %d",i,k);  
        else printf("NONE");  
    }  
    return 0;  
  
}  

12-8:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int min,i,j,k=0;
    char str[80],str_pr[80],t;
    gets(str);
    int c;
    c=strlen(str);//strlen计算字符长度,头文件string.h
    for(j=0;j<c;j++){
        min=j;
        for(i=j+1;i<c;i++)
        if(str[min]>str[i])
        min=i;
        t=str[min];
        str[min]=str[j];
        str[j]=t;
    } //字符串排序
    for(i=0;i<c;i++){
        for(j=i;j<c;j++){
            if(((' '<=str[j]&&str[j]<='~'))&&(str[j]==str[i])){
                str_pr[k]=str[j];
                for(int x=0;x<c;x++){
                    if(str_pr[k]==str[x]){
                        str[x]=0;
                    }
                }
                k++;
            }
        }
    } //除去排好字符里的重复字符,并放入str_pr字符组里
    for(i=0;i<k;i++){
        printf("%c",str_pr[i]);
    } 
    return 0;
}

13-5:

bool palindrome( char *s )
{
    int len=strlen(s);
    int k=0,i=0,j=len-1;
    while(i<j){
        if(s[i]!=s[j])
        break;
        i++;
        j--;
    }

    if(i>=j)
    return true;
    else
    return false;
} 

14-3:

char *str_cat( char *s, char *t )
{
    while(*s!=0)
       s++;
    while(*t!=0){
        *s=*t;
        s++;
        t++;
    }
    *s='\0';
    return s;
} 

15--7:

int f( int n ){
  if(n==0) return 0;
  else if(n==1) return 1;
  else {
  
    return f(n-2)+f(n-1);
  }
}

 三、遇到的问题及解决方法、心得体会

11-7

遇到的问题:在寻找列最小时忽略了验证该数是否与行最大在同一行且为同一个

 解决方法:增加了验证了列最小的数所对应的行坐标是否等于行最大的行标

12-8

遇到的问题:删除重复字符并放入新的字符串中,在输出时,有出现乱码

 解决方法:问同学,重新整理思路,换了一种写法

14-3

遇到的问题:把简单的问题复杂化了

 解决方法:在同学的指点下成功完成了该代码

15-7

遇到的问题:初学还不是很懂递归的应用

解决方法:多看看书里的写法,多练习

心得体会:

1、下学期要多多敲代码,特别是课本上的例题,用的做法很经典,而自己一直用笨方法解题,费时费力;

2、多把时间放在PTA上,但也要经常复习课本的基础知识,温故而知新,基础知识就像我们搭建搭建房子的砖头一样,不起眼但缺一不可;

3、手写代码依然存在较大问题,以后要锻炼自己的手写能力;

4、不会就要多问问同学,如果遇到同学也不会的就问老师。

 

posted on 2018-01-28 09:52  pianzhi  阅读(226)  评论(0编辑  收藏  举报