1.用scanf和gets( 字符数组名或指针)进行输入的区别:
char str1[60],str2[60];
gets(str1); //gets()函数将接收输入的整个字符串直到遇到换行为止
printf("%s\n",str1);
scanf("%s\n",str2);//scanf如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理
printf("%s\n",str2);
————————————————
版权声明:本文为CSDN博主「爆爆爆炸beng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_37592533/article/details/79266182
2.字符串输出 printf或者puts(),字符串的结束标志'\0'。
7-51 打印杨辉三角 (20 分)
本题要求按照规定格式打印前N行杨辉三角。
输入格式:
输入在一行中给出N(1≤N≤10)。
输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
输入样例:
6
结尾无空行
输出样例:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
结尾无空行
#include<stdio.h>
void creat(int a[][10],int n);
void output(int a[][10],int n);
int main()
{
int n,a[10][10];
scanf("%d",&n);
creat(a,n);
output(a,n);
return 0;
}
void creat(int a[][10],int n)
{
for(int i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(int i=2;i<n;i++)
{
for(int j=1;j<i;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
void output(int a[][10],int n)
{
for(int i=0;i<n;i++)//先输出空格数
{
for(int j=0;j<n-i-1;j++)
printf(" ");
for(int j=0;j<=i;j++)
{
printf("%4d",a[i][j]);//输出格式
}
printf("\n");//别忘了换行
}
}
7-52 找鞍点 (20 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9
结尾无空行
输出样例1:
2 1
结尾无空行
输入样例2:
2 1 7 4 1
输出样例2:
NONE
#include<stdio.h>
int point(int a[][6],int n);
int maxnum(int a[],int n);
int judge(int a[][6],int n,int s,int m);
int main()
{
int n,a[6][6];//此时是a[6][6]
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
int f=point(a,n);
if(f==0) printf("NONE");
return 0;
}
int maxnum(int a[],int n)//形参是一维数组
{
int m=0;
for(int i=1;i<n;i++)//从下标为1开始比较
{
if(a[i]>a[m]) m=i;//错误表示a[i]>m
}
return m;
}
int judge(int a[][6],int n,int s,int m)//形参是二维数组
{
for(int i=0;i<n;i++)
if(a[i][s]<m) return 0;
return 1;
}
int point(int a[][6],int n)
{
int f=0;
for(int i=0;i<n;i++)
{
int j=maxnum(a[i],n);//这个的实参必须是a[i]
int m=a[i][j];
for(int s=0;s<n;s++)
{
if(a[i][s]==m)
{
int t=judge(a,n,s,m);
if(t==1) {printf("%d %d",i,s);f=1;}
}
}
}
return f;//这是return f,不是return 0;
}
7-53 字母方阵 (15 分)
本题要求从左下角开始按字母表顺序S型打印由小写字母组成的字母方阵。
输入格式:
输入为一个正整数n (1=<n<=1000)。
输出格式:
按字母表顺序输出n行n列的小写字母组成的方阵,从右上角开始S型循环打印,字母之间用一个空格分割,每行最后一个字母后面没有空格。
输入样例:
6
结尾无空行
输出样例:
j y x m l a i z w n k b h a v o j c g b u p i d f c t q h e e d s r g f
#include<stdio.h>
void creat(char a[][1000],int n);
int main()
{
int n;
scanf("%d",&n);
char a[1000][1000];//首先定义一个二维数组a[][1000]
creat(a,n);//调用创建字母方阵函数
//输出
for(int i=0;i<n;i++)
{
printf("%c",a[i][0]);//先输出第一列
for(int j=1;j<n;j++)//列数从1开始
{
printf(" %c",a[i][j]);//每行最后一个字母后面没有空格
}
printf("\n");
}
return 0;
}
void creat(char a[][1000],int n)
{
char num='a';
int k,left=0,up=0,buttom=n-1,right=n-1;
for(int i=0;i<n/2;i++)//大循环,一上一下、一上一下
{
for(k=up;k<=buttom;k++)
{
a[k][right]=num;
num++;
if(num>'z') num='a';
}
right--;
for(k=buttom;k>=up;k--)
{
a[k][right]=num;
num++;
if(num>'z') num='a';
}
right--;
}
if(n%2==1)//奇数(n&1==1)(n&1)即位与运算
{//最后的奇数行一定是从上往下的
for(k=up;k<=buttom;k++)
{
a[k][right]=num;
num++;
if(num>'z') num='a';
//最后一列没有right--
}
}
}
7-54 螺旋方阵 (20 分)
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
结尾无空行
输出样例:
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
结尾无空行
#include<stdio.h>
void creat(int a[][10],int n);
int main()
{
int n,a[10][10];
scanf("%d",&n);
creat(a,n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d",a[i][j]);//默认为右对齐
}
printf("\n");//方阵回车换行
}
return 0;
}
void creat(int a[][10],int n)
{
int num=1;//num从1开始
int left=0,up=0,right=n-1,buttom=n-1;
for(int i=0;i<n/2;i++)
{
for(int k=left;k<=right;k++)
{
a[up][k]=num;num++;
}
for(int k=up+1;k<=buttom;k++)
{
a[k][right]=num++;
}
for(int k=right-1;k>=left;k--)
{
a[buttom][k]=num++;
}
for(int k=buttom-1;k>=up+1;k--)
{
a[k][left]=num++;
}
left++;right--;up++;buttom--;
}
if(n%2==1) a[n/2][n/2]=num;
}
7-55 统计大写辅音字母 (15 分)
英文辅音字母是除
A
、E
、I
、O
、U
以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出字符串中大写辅音字母的个数。
输入样例:
HELLO World!
结尾无空行
输出样例:
4
结尾无空行
#include<stdio.h>
int main()
{
char a[81];
int count=0;
gets(a);//输入以回车结束的字符串用gets
for(int i=0;a[i]!=0;i++)//字符串数组的结束标志
{
if(a[i]>='A'&&a[i]<='Z')
if(a[i]!='A'&&a[i]!='O'&&a[i]!='I'&&a[i]!='U'&&a[i]!='E')
count++;
}
printf("%d",count);
return 0;
}
7-58 字符串字母大小写转换 (15 分)
本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。
输入格式:
输入为一个以“#”结束的字符串(不超过30个字符)。
输出格式:
在一行中输出大小写转换后的结果字符串。
输入样例:
Hello World! 123#
结尾无空行
输出样例:
hELLO wORLD! 123
结尾无空行
#include<stdio.h>
#include<string.h>
int main()
{
char a[32];//char a[31];
gets(a);//输入为一个以“#”结束的字符串,后面仍有字符串的结束标志'\0',也可用gets
for(int i=0;a[i]!='#';i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
a[i]=a[i]+32;
}
else if(a[i]>='a'&&a[i]<='z')
{
a[i]=a[i]-32;
}
}
//输出后没有#号了,只能用printf输出,不能用puts(a)
for(int i=0;a[i]!='#';i++)//不要忘记#上有个字符串
{
printf("%c",a[i]);
}
return 0;
}
7-66 查找书籍 (20 分)
给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。
输入格式:
输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。
输出格式:
在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。
输入样例:
3 Programming in C 21.5 Programming in VB 18.5 Programming in Delphi 25.0
结尾无空行
输出样例:
25.00, Programming in Delphi 18.50, Programming in VB
结尾无空行
#include<stdio.h>
typedef struct
{
char name[31];//Programming in C,显然可见,书名有空格,必须用gets输入
double price;
}book;
int max(book a[],int n)
{
int m=0;//m就是第一个元素的下标
for(int i=0;i<n;i++)//其实都可以,从第二个元素开始i=1,与第一个元素比较
{
if(a[i].price>a[m].price)
m=i;
}
return m;
}
int min(book a[],int n)
{
int m=0;
for(int i=0;i<n;i++)
{
if(a[i].price<a[m].price)
m=i;
}
return m;
}
int main()
{
int n;
scanf("%d\n",&n);//下面有gets输入字符串函数,scanf必须加\n
book a[n];
for(int i=0;i<n;i++)
{
gets(a[i].name);
scanf("%lf\n",&a[i].price);//当scanf与gets一同使用时,scanf必须加\n
}
int m=max(a,n);
printf("%.2f, %s\n",a[m].price,a[m].name);
m=min(a,n);
printf("%.2f, %s\n",a[m].price,a[m].name);
return 0;
}