C语言实验报告二
题目一:
1、实验题目,设计思路,实现方法
实验题目:11-4 判断上三角矩阵
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。每个矩阵的判断结果占一行。
输出格式:如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
设计思路:每个矩阵分别判断是否为上三角矩阵,是为1,不是为0;通过二维数组,行为i,列为j;i>j时为上三角,上三角都为0时,为上三角矩阵。
实现方法:定义一个flag数组用来判断每个行列式是否为上三角,是则flag=1,不是flag=0,最后循环输出flag数组的值。
2、源程序
#include<stdio.h>
int main()
{
int n,m,i,j,k;
int a[10][10];
int flag[10]={0};
scanf("%d\n",&n);
for(k=0;k<n;k++)
{
scanf("%d",&m);
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<i;j++)
{
if(a[i][j]!=0)
{
flag[k]=1;
}
}
}
}
for(i=0;i<n;i++)
{
if(flag[i]==1)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}
3、遇到的问题和解决方法
(1)一开始flag没有定义为数组,所以程序中的flag值不变,无法判断矩阵是否为上三角,后来才有数组的形式判断;
(2)不确定除了下三角为0为,上三角和主对角线是否可以为0,。
题目二
1、实验题目,设计思路,实现方法
11-6方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输入格式:按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
设计思路:本体要求方阵循环右移m个位置,该问题首先定义宏n为数组大小,两个数组a[n][n],b[n][n],先输入一个n*n的数组储存在a中,欲使每个元素右移m个位置,即行数i不变,列数变为j+m(本来在第j列),但考虑到若j+m>n,就要循环到前面去,就取(m+j)%n为其新列数循环到前面去即可。
2、源代码
#include<stdio.h>
int main(void)
{
int n,m,i,j,x;
int a[6][6],b[6][6];
scanf("%d",&m);
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
for(j=0;j<(n-1);j++)
{
scanf("%d",&a[i][j]);
}
scanf("%d\n",&a[i][j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
x=(j+m)%n;
b[i][x]=a[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
3、遇到的问题与解决方法:
不知道后面的怎么跑到前面去,x=(j+m)%n; b[i][x]=a[i][j];通过这个公式使得a数组在b数组中找到正确位置。
题目三
1、实验题目,设计思路,实现方法
实验题目:12-4字符串字母大小写转换:本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。
输入格式:输入为一个以“#”结束的字符串(不超过30个字符)。
输出格式:在一行中输出大小写转换后的结果字符串。
设计思路:在输出#时,输入将结束,并且把#所在的字符转化为\0;大小写的转化通过ASCII码转化实现方法: str[i] = str[i] + 'A' - 'a';str[i] = str[i] + 'a' - 'A'即可。
2、源程序
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char str[50];
gets(str);
int i;
for(i = 0; i < strlen(str); i++)
{
if(str[i] >= 'a' && str[i] <= 'z')
str[i] = str[i] + 'A' - 'a';
else if(str[i] >= 'A' && str[i] <= 'Z')
str[i] = str[i] + 'a' - 'A';
}
for(i = 0; str[i] != '#'; i++)
{
printf("%c", str[i]);
}
printf("\n");
return 0;
}
3、遇到的问题和解决方法:没有用到#include<stdlib.h>和#includ<math.h>导致程序出错。
题目四
1、实验题目,设计思路,实现方法
13-5判断回文字符串
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。函数接口定义:函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false。
设计思路:先判断字符串的长度,从j=len-1和i=0开始,比较,每比较一次i++,j--,一旦有一此不同就退出循环;实现方法:先用一个字符串函数,来计算字符串长度。设计一个双重循环,进行比较。
2、源程序
bool palindrome( char *s )
{
int result = 1;
int i = 0;
int begin = 0;
int end = 0;
while (true) {
if (s[i] == '\0')
break;
if (s[i] != ' ') {
if (begin <= 0 )
begin = i;
end = i;
}
i++;
}
}
题目五
1、实验题目,设计思路,实现方法
14-5指定位置输出字符串
实验题目:本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
设计思路:先找到ch1,将其赋值给一个指针,从指针的地址开始,输出知道遇见ch2,停止,返回指针。
2、源代码
char *match( char *s, char ch1, char ch2 ){
int i=0;
while(*s!='\0'&&*s!=ch1)
s++;
char *p=s;
while(*s!='\0'&&*s!=ch2){
printf("%c",*s);
s++;
i++;
}
if(*s==ch2)
printf("%c\n",*s);
else
printf("\n");
return p;
}
3、遇到的问题和解决方法
一直显示
sample1, 正常截取中段, ch1重复出现 |
答案正确 |
2 ms |
128KB |
|
1 |
sample2, ch1找不到, ch2找到 |
段错误 |
1 ms |
128KB |
2 |
sample3, ch1找到, ch2找不到 |
答案正确 |
2 ms |
256KB |
3 |
超长s, 取整个字符串 |
答案正确 |
2 ms |
128KB |
4 |
s只有1个字符 |
答案正确 |
|
|
后来引用指针就可以了。