数组和字符串(分数统计_stat,单词的长度,乘积的末3位,计算器,旋转_rotate,进制转换1_base1,进制转换2_base2,手机键盘)

关于C语言字符串
字符串输入的方法
  • scanf(“%s”,in_buff);
  • gets(in_buff);
  • fgets(in_buff,BUFFER_SIZE + 1,stdin);

1.当使用scanf函数时,如果在数组范围内有空格,那么第一个空格之后的字符将被忽略,这通常不是我们想要的。另外,scanf函数也不提供对写入数组的数据是否越界的检查。
2.当使用gets函数时,由于gets不提供对写入数组的数据进行是否越界的检查,所以也不安全。
3.而使用fgets函数时,只要第二个参数正好等于第一个参数传给它的数组的字节个数,那么fgets函数不会写出数组边界。所以,fgets函数是最好的选择.

1 分数统计_stat

好像这个办法很笨,不知道有没有好主意==
疑问:当分数为非负实数时(保留两位小数)。嗯,乘以100..==
int main() {
    int a[101]={0};
    int i=0,u,max;
    while(scanf("%.2f",&u)!=EOF){
        a[u]++;
    }
    for(i=0;i<100;i++){
        if(a[i]>max) max=a[i];
    }
//输出分数出现次数最多的,如果有多个并列,从小到大输出。
    for(i=0;i<100;i++)
    {
        if(a[i]==max) printf("%d\n",i);
    }
    return 0;
}
输入:
12 34 56 78 89 12 12 12 34 34 34
输出:
12
34

2 单词的长度

输入一些单词,统计单词的平均长度
#include <stdio.h>
#include<string.h>
#include<ctype.h>
int main() {
    char s[1000],buf[1000];
    int sum=0,count=0,i;
    fgets(buf,sizeof(s),stdin);
    //从后往前,因为你不知道最后一个是什么时候截止
    for(i=strlen(buf)-1;i>0;i--){
        if(buf[i]==' ') count++;
        else sum++;
    }
    printf("%lf\n",(double)sum/count);
    return 0;
}
//i am best one
输入输出:

输入输出

3 乘积的末3位——product(借鉴)

输入若干个整数,输出他们的成绩的末三位(取余),其中有干扰的字符串
break是结束整个循环体,continue是结束单次循环
一直没搞懂题目是要怎么输入的,认真看“输入若干个“,肯定不是要输入一个字符串,这样就可以使用while!=EOF来循环输出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100
#define MOD 1000
char a[MAXN];
int main()
{
  int i, n;
  long d= 0, sum= 1;
  while(scanf("%s", a)!=EOF)
  {
     n = strlen(a);
     for(i = 0; i < n; i++)
     {
         if(a[i] >= 'A' && a[i] <= 'Z') break;
          //一定要判断是怎么退出的
             continue;
             d=(d*10+a[i]-'0')%MOD;
         }
         if(a[i] >= 'A' && a[i] <= 'Z') 
             continue;
         //如果是大写字母,就不用进行乘法
         sum=sum*d%MOD;
         d= 0;//这种计数用的,每次都要清零
      }

      printf("%3d\n",sum);
      system("PAUSE");
      return 0;
    }
假设输入:
12
H
12
HU
12
输出:
728

4 计算器

编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
一直想着一步到位的,最后发现没有用。分成两部分反而更好处理,以运算符号为中心分成两个部分计算。
 #include <stdio.h>
#include<string.h>
char buf[1010];
int main() {
    int m=0,n=0,i,l;
    int middle;
    while(fgets(buf,sizeof(buf),stdin)){
        l=strlen(buf);
        for(i=0;i<l-1;i++){
            if(buf[i]=='+'||buf[i]=='-'||buf[i]=='*')
                middle=i;
        }
        for(i=0;i<middle;i++){
            if(buf[i]==' ') continue;
            m=m*10+buf[i]-'0';
        }
        for(i=middle+1;i<l-1;i++){
            if(buf[i]==' ') continue;
            n=n*10+buf[i]-'0';
        }
    //  if(buf[i]==' ') continue;
    //  d=d*10+buf[i]-'0';
   //   if(buf[i]=='+') {sign=1;m=d;d=0;}
   //   else if(buf[i]=='-'){sign=-1;m=d;d=0;}
   //   else if(buf[i]=='*'){sign=0;m=d;d=0;}
        switch(buf[middle])
        {
            case '+':
                 printf("%d\n", m+n);break;
            case '-':
                 printf("%d\n", m-n);break;
            case '*':
                 printf("%d\n", m*n);break;
        }
        m = 0;
        n = 0;
    }
    return 0;
}
输入:
1+1
2-     5
0   *1982
输出:
2
-3
0

5 旋转_rotate

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
char a[1010][1010],s[1001][1010];
int main() {
    int i,j,n;
    scanf("%d",&n);
    getchar();
    char temp;
/*   for(i = 0; i < n; i++)
          scanf("%s", a[i]);*/
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
        scanf("%c",&a[i][j]);
        getchar();
    }
/*  for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%c ",a[i][j]);
        printf("\n");

    }*/
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            s[i][j]=a[j][n-i-1];
            printf("%c",s[i][j]);
        }
        printf("\n");
    }
    return 0;
}
输入:
3
123
456
789
输出:
3
1 2 3
4 5 6
7 8 9

各种旋转

int main(){
 int a[5][6]={1,3,4,2,5,2,
    2,3,6,3,8,3,
    2,9,7,9,4,8,
    6,3,8,1,9,3,
    9,3,5,2,8,5,};
    int s90[6][5],ni90[6][5],x180[5][6];
 int i,j;

 printf("顺时针旋转90度矩阵为:\n");
 for(i=0;i<6;i++){
  for(j=0;j<5;j++)
  {
   s90[i][j]=a[4-j][i];
   printf("%2d%",s90[i][j]);
  }
  printf("\n");
 }

 printf("逆时针旋转90度矩阵为:\n");
 for(i=0;i<6;i++){
  for(j=0;j<5;j++)
  {
   ni90[i][j]=a[j][5-i];
   printf("%2d%",ni90[i][j]);
  }
  printf("\n");
 }

 printf("旋转180度矩阵为:\n");
 for(i=0;i<5;i++)
 {
  for(j=0;j<6;j++)
  {
   x180[i][j]=a[4-i][5-j];
   printf("%2d%",x180[i][j]);
  }
  printf("\n");
 }
}

6 进制转换1_base1

#include <stdio.h>
int a[100];
int main() {
    int i=0,b,n;
    scanf("%d%d",&b,&n);
    while(n>0){
        a[i]=n%b;
        n=n/b;
        printf("%d",a[i++]);
    }
    return 0;
}
输入:
2 15
输出:
1111

7 进制转换2_base2

#include <stdio.h>
int main() {
    int n,b,k=1;
    int s=0;
    scanf("%d%d",&b,&n);
    while(n>0){
        s+=n%10*k;
        k=k*b;
        n=n/10;
    }
    printf("%d",s);
    return 0;
}
输入:
2 1111
输出:
15

8 手机键盘——keyboard

需要注意限制范围,当输入‘z’时候特殊处理,当输入‘a’到‘y’时取余,没有限制的话会出现又输出个1。原因可能是最后一个输入换行为一个字符’\0’,取余之后为0。
#include <stdio.h>
#include<string.h>
int main() {
    char a[100];
    int i=0,k;
    while(scanf("%c",&a[i])!=EOF){
        if(a[i]=='z'){printf("%c",a[i]);printf("4");}
        else if(a[i]>='a'&&a[i]<'z'){
            k=(a[i]-'a')%3;
            switch(k){
                case 0:
                {printf("%c",a[i]);printf("1");break;}
                case 1:
                {printf("%c",a[i]);printf("2");break;}
                case 2:
                {printf("%c",a[i]);printf("3");break;}
            }
/*          if(k==0){printf("%c",a[i]);printf("1");continue;}
            if(k==1){printf("%c",a[i]);printf("2");continue;}
            if(k==2){printf("%c",a[i]);printf("3");continue;}*/
        }
        i++;
    }
    return 0;
}
输入:
pig
输出:
p1i3g1
九宫格输入法示意图:

九宫格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值