C语言第二次实验报告

PTA实验作业

题目一:11-7 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。

1、设计思路

  • 第一步:定义二维数组
  • 第二步:判断用户给定矩阵大小
  • 第三步:找行最大值
  • 第四步:判断行最大值是否为列最小值
  • 第五步:输出结果

实验代码

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=j;  
                    break;  
                }  
            }  
            if(i==y)
            {  
                flag=0;  
                break;  
            }  
        }  
        if(flag==0)  
            printf("%d %d",i,k);  
        else printf("NONE");  
    } 

3·遇到的问题及解决方法:

  • 答案错误:当最后一个点为鞍点时,测试不通过
    解决方法:定义y变量观察行最大值是否为列最小值
  • 答案错误:没有考虑到仅有一个点时,该点即为鞍点
    解决方法:if(n==1) printf("0 0");

题目二:12-6 字符串转换成十进制整数

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

1、设计思路

  • 第一步:定义字符数组并读入
  • 第二步:判断各字符是否为16进制
  • 第三步:进行16进制数的计算
  • 第四步:判断有无负号
  • 第五步:输出答案

2、实验代码:

int a[80]={0};  
    char c[80];   
    gets(c);  
    int m,i,j;  
    int n=1, k;  
    long int sum;
    m=strlen(c);  
    j=0;  
    for(i=0;i<m;i++)  
    {  
        if(c[i]>='0'&&c[i]<='9')  
        {  
            a[j]=c[i]-48;  
            j++;  
        }  
        if((c[i]>='a'&&c[i]<='f')||(c[i]>='A'&&c[i]<='F'))  
        {         
            if(c[i]=='a'||c[i]=='A')  
                a[j]=10;  
            else if(c[i]=='b'||c[i]=='B')  
                a[j]=11;  
            else if(c[i]=='c'||c[i]=='C')  
                a[j]=12;  
            else if(c[i]=='d'||c[i]=='D')  
                a[j]=13;  
            else if(c[i]=='e'||c[i]=='E')  
                a[j]=14;  
            else   
                a[j]=15;  
            j++;  
        }  
        if(c[i]=='-'&&j==0)  
            n=0;  
    }    
    sum=k=0;  
    for(i=j-1;i>=0;i--)  
    {  
        sum=sum+a[i]*(long int)pow(16,k);  
        k++;  
    }  
    if(sum==0)  
        printf("0\n");  
    else  
    {  
    if(n==0)  
        printf("-%ld\n",sum);  
    else  
        printf("%ld\n",sum);  
    }  

3、遇到的问题及解决方法:

  • 编译错误:long 的输出格式错误
    解决方法:printf("%ld\n",sum);
  • 部分正确:-0时仍输出负号
    解决方法:if(sum==0) printf("0\n");

题目三:14-5 指定位置输出字符串(函数题)

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

1、设计思路

  • 第一步:找到第一个目标字符,并记录地址
  • 第二步:逐个输出两个字符间的字符
  • 第三步:找到第二个字符输出并跳出字符串

2、实验代码

char *match( char *s, char ch1, char ch2 ){
	int i=0,j=0,k;
	char *p=NULL,*q=s;
	  while(q[i++])
  	;
  	i--;
  	for(j=0;j<i;j++){
  		if(s[j]==ch1){
  			p=&s[j];
  			for(k=j;k<i;k++){
  				if(s[k]!=ch2){  
                    printf("%c", s[k]);  
                }
  				if(s[k]==ch2){
  					printf("%c\n", s[k]); 
  					return p;	
				  }
			  }
			  printf("\n");
			  return p;
		  }
	  }
	  printf("\n");
	  return q+i;
} 

3、遇到的问题及解决方法:

  • 段错误:数组越界
    解决方法:定义数组指针,指向字符串s
  • 答案错误:ch1找不到, ch2找到 时无法通过
    解决方法:定义*q指向s ,最后返回 q+s

题目四、通讯录的录入与显示

通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

1、设计思路

  • 第一步:定义结构变量
  • 第二步:用户输入通讯录信息
  • 第三步:读入查询个数和编号
  • 第四步:输出查询结果

2、实验代码

struct list{
	char numbe[20];
	char phone[25];
	char name[15];
	char sex[2];
	char bri[15];
}f[10];
int main(){
	int i,j,k,n,number;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s %s %c %s %s\n",&f[i].name,&f[i].bri,&f[i].sex,&f[i].numbe,&f[i].phone);
	}
	scanf("%d",&k);
	for(i=0;i<k;i++){
		scanf("%d",&number);
		if(number>=0&&number<n){
			printf("%s %s %s %s %s\n",f[number].name,f[number].numbe,f[number].phone,f[number].sex,f[number].bri);
		}else{
			printf("Not Found\n");
		}
	}

3、遇到的问题及解决方法

  • 段错误:电话号码输出越界
    解决方法:将电话号码改为字符数组
  • 答案错误:将结构变量名定义为 friend(友元函数)
    解决方案:更改变量名为 list

题目五:15-8 十进制转换二进制(函数题)

本题要求实现一个函数,将正整数n转换为二进制后输出。

1、设计思路

  • 第一步:定义变量判断实参是否为0
  • 第二步:判断形参不等0时调用自身
  • 第三步:循环调用本函数
  • 第四步:当n为0时开逐级返回函数

2、实验代码

void dectobin( int n ){
  int a=n/2;
  static int count=0;
  int out=n%2;
  if(!n&&!count){
    printf("0");
    return ;
  }else{
    if(!n){
      return ;
    }
    count++;
    dectobin(a);
    printf("%d",out);
  }
}

3、遇到的问题及解决方法

  • 答案错误:没有判断是否一开始的形参为0
    解决方法:设置观察量count

心得体会

  • 使用数组时应注意数组范围
  • 定义变量时应考虑其本身是否为C语言的关键字
  • 不懂就问,独学而无友,则孤陋而寡闻
posted @ 2018-01-24 14:11  LCLkris  阅读(690)  评论(0编辑  收藏  举报