C语言第二次实验报告
一.实验题目,设计思路,实现方法。
题目一:11-7 找鞍点 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式:输入第一行给出一个正整数n(1)。随后n行,每行给出n个整数,其间以空格分隔。 输出格式:输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
|
设计思路:1.先定义一个二维数组将数据读入。
2.用双重for循环对矩阵中的每个整数进行判断。
3.再用if语句判断该整数是否是行最大,列最小,并记录判断结果。
4.若判断结果都符合,跳出循环并返回下标。
题目二:12-6 字符串转换成十进制整数 输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。 输入格式:输入在一行中给出一个以#结束的非空字符串。 输出格式:在一行中输出转换后的十进制数。题目保证输出在长整型范围内。 |
设计思路:1.先用gets()输入字符串,再用strlen()判断字符串长度。
2.判断符号,用for循环对字符串中的字符进行遍历,并用if语句判断第一个字符是“十六进制字符”还是“-”。
3.再次用for循环,将符合条件的“十六进制字符”转换为整数,并将其保存在一个数组中。
4.用pow()函数逐个将十六进制转成十进制,并求和。再根据符号的判断,确定是否加“-”。
题目三:12-6 字符串转换成十进制整数 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>)个整数,将每个整数循环向右移m(≥)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。 函数接口定义:
其中 |
设计思路:1.先定义一个与数组b [ ]用来保存右移后的整数顺序。
2.因为右移后的数组下标 j 满足 j =(i + m)% n 。所以只要将b [ j ]=a [ i ] 就可以将右移后的整数顺序赋给数组b。
题目四:14-5 指定位置输出字符串本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。 函数接口定义:
函数 输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
|
设计思路:1.用while(*s!=ch1&&*s!='\0')找到字符串中ch1所在的位置。
2.再用while(*s!=ch2&&*s!='\0')打出ch1到ch2的字符,并用变量 i 记下 *s 所移动了几个位置。
3.用if判断跳出循环的*s是否等于ch2又或者‘\0’,并确定是否打印。
4.最后函数返回s=s-i的地址。
题目五:15-2 分类统计各类字符个数本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。 函数接口定义:
其中
的格式输出。 |
设计思路:1.用while语句判断是否到达‘\0’,用变量count来记下字符串的长度。
2.再用for (i=0;i<count;i++)控制循环次数。
3.最后用if-else if-else多次判断来计算字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。
二.源程序
题目一:11-7 找鞍点
#include<stdio.h> int main() { int n; scanf("%d",&n); int i,j,k; int x=1,y=1; int a[6][6]; for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&a[i][j]); } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ x=1;y=1; for(k=0;k<n;k++){ if(a[i][j]<a[i][k]){ x=0;break; } } if(x==1){ for(k=0;k<n;k++){ if(a[i][j]>a[k][j]){ y=0;break; } } } if(x==1&&y==1){ printf("%d %d",i,j);return 0; } } } printf("NONE"); return 0; }
题目二:12-6 字符串转换成十进制整数
int main() { char n[100],m[100]; gets(n); int len,i,flag=0; len=strlen(n); for(i=0;i<len;i++){ if(n[i]>='0'&&n[i]<='9'||n[i]>='a'&&n[i]<='f'||n[i]>='A'&&n[i]<='F'){ flag=0;break; } if(n[i]=='-'){ flag=1;break; } } int j=0,sum=0; for(i=0;i<len;i++){ if(n[i]>='0'&&n[i]<='9'){ m[j]=n[i]-'0'; j++; } else if(n[i]>='a'&&n[i]<='f'){ m[j]=n[i]-'a'+10; j++; } else if(n[i]>='A'&&n[i]<='F'){ m[j]=n[i]-'A'+10; j++; } } int h=0; for(i=j-1;i>=0;i--){ sum=sum+m[i]*pow(16,h); h++; } if(sum==0){ printf("0"); return 0; } if(flag==1)printf("-"); printf("%d",sum); return 0; }
题目三:12-6 字符串转换成十进制整数
int ArrayShift( int a[], int n, int m ){ int i,j; int b[n]; for(i=0;i<n;i++) { j=(i+m)%n; b[j]=a[i]; } for(i=0;i<n;i++){ a[i]=b[i]; } return a[n]; }
题目四:14-5 指定位置输出字符串
char *match( char *s, char ch1, char ch2 ) { int i=0; while(*s!=ch1&&*s!='\0')s++; while(*s!=ch2&&*s!='\0'){ printf("%c",*s); s++;i++; } if(*s==ch2)printf("%c\n",*s); else printf("\n"); s=s-i; return s; }
题目五:15-2 分类统计各类字符个数
void StringCount( char *s ) { int d,x,k,c,q; d=x=k=c=q=0; int count=0; int i; while(*(s+count)!='\0'){ count++; } for (i=0;i<count;i++){ if(s[i]<='Z'&&s[i]>='A')d++; else if(s[i]<='z'&&s[i]>='a')x++; else if(s[i]==' ')k++; else if(s[i]<='9'&&s[i]>='0')c++; else q++; } printf("%d %d %d %d %d",d,x,k,c,q); }
三.遇到的问题及解决方法,心得体会
1.编程首先要看清题目的要求,就比如:14-5 指定位置输出字符串 这题中的函数返回的是ch1地址,而我返回ch2地址就错了,经过老师在群里提醒才发现了问题所在。
2.要理解数组和指针之间的关系及其应用。
3.要注重算法的精简和效率。