2020年3月3日 多维数组
有时候并不需要每道题都用最正规的方法去做,适当的投机取巧可能也是大成功。
3.21 课程内实验>实验2 多维数组(5/5)
5809
七段显示器输出,利用0,1来控制是否输出七段中的其中一段。
先用给出的二维数组的赋值判断数组顺序与七段显示的对应关系,之后注意空格与换行输出即可。
#include <stdlib.h>
int main()
{
int max_save[10][7]={{1,1,1,1,1,1,0},
{0,1,1,0,0,0,0},
{1,1,0,1,1,0,1},
{1,1,1,1,0,0,1},
{0,1,1,0,0,1,1},
{1,0,1,1,0,1,1},
{1,0,1,1,1,1,1},
{1,1,1,0,0,0,0},
{1,1,1,1,1,1,1},
{1,1,1,1,0,1,1}};
int num,col;
scanf("%d",&num);
/*模拟七段数码显示管分5行输出,
*奇数行只输出空格或者-,
*偶数行只输出空格或者|。*/
//start
if(max_save[num][0]) printf(" - \n");
else printf(" \n");
if(max_save[num][5]) printf("| ");
else printf(" ");
if(max_save[num][1]) printf("|\n");
else printf(" \n");
if(max_save[num][6]) printf(" - \n");
else printf(" \n");
if(max_save[num][4]) printf("| ");
else printf(" ");
if(max_save[num][2]) printf("|\n");
else printf(" \n");
if(max_save[num][3]) printf(" - \n");
else printf(" \n");
//end
return 0;
}
5814
矩阵的转置题目的关键在于将转置前后元素位置的对应关系搞清楚,可以多些几个对应式找规律。为了防止已赋的新值对之后的赋值有影响,可以再定义一个中转的工具数组。
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(void)
{
void transfor(int a[][N]);
int array[N][N],i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&array[i][j]);
transfor(array);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
j!=N-1?printf("%d ",array[i][j]):printf("%d\n",array[i][j]);
return 0;
}
void transfor(int a[][N])
{
//start
int i,j,b[N][N];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
b[i][j]=a[i][j];
//a00=b00 a01=b10 a02=b20;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=b[j][i];
//end
}
5815
与上题思路相同,注意行列数不同的矩阵转置后行数与列数会交换位置。
#include <stdio.h>
#include <stdlib.h>
#define R 3
#define C 5
#define N (R>C?R:C)
int main(void)
{
void transfor(int a[][N]);
int array[N][N],i,j;
for(i=0;i<R;i++)
for(j=0;j<C;j++)
scanf("%d",&array[i][j]);
transfor(array);
for(i=0;i<C;i++)
for(j=0;j<R;j++)
j!=R-1?printf("%d ",array[i][j]):printf("%d\n",array[i][j]);
return 0;
}
//a00=a00 a01=a10 a02=a20;
//a10=a01 a11=a11 a12=a21
void transfor(int a[][N])
{
//start
int i,j;
int b[N][N];
for(i=0;i<R;i++)
for(j=0;j<C;j++)
b[i][j]=a[i][j];
for(i=0;i<C;i++)
for(j=0;j<R;j++)
a[i][j]=b[j][i];
//end
}
5816
因为题目已经指定了只有6种颜色,所以可以用6个单词的不同点这种偷鸡摸狗的方法利用单个字母判断所接收到的字符串,进而利用桶排序解题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[10];
int n,i;
while(~scanf("%d",&n)){
int s[6]={0},max=0,flag=0;
for(i=0;i<n;i++){
scanf("%s",a);
if(a[0]=='g') s[0]++;
if(a[0]=='r') s[1]++;
if(a[2]=='u') s[2]++;
if(a[0]=='o') s[3]++;
if(a[0]=='p') s[4]++;
if(a[4]=='k') s[5]++;
}
for(i=0;i<6;i++){
if(s[i]>max)
{max=s[i];flag=i;}
}
switch(flag){
case 0:printf("green\n");break;
case 1:printf("red\n");break;
case 2:printf("blue\n");break;
case 3:printf("orange\n");break;
case 4:printf("pink\n");break;
case 5:printf("black\n");break;
}
}
return 0;
}
5808
之前尝试了很多方法,经历过无数次的翻转,最终还是倒在了特殊符号上。
- 输出的两个句子后都有一个空格
- 输入的字符串开头不一定是字母,还可能是空格,空格还可能不止一个
- 整个句子除了字母、空格、终止字符(句号、问号、感叹号)之外还可能有其他特殊字符,而这些字符都不输出,所以最好的方法是判断是否是字母然后直接输出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isalpha(char c)
{
if(c>='a'&&c<='z') return 1;
else if(c>='A'&&c<='Z') return 1;
else return 0;
}
int main()
{
char a[101];
int i,n;
while(gets(a)){
n=strlen(a);
for(i=0;i<n;i++){
if(isalpha(a[i]))
if(isalpha(a[i+1]))
printf("%c",a[i]);
else printf("%c\n",a[i]);
}
}
return 0;
}