HDU1004 Let the Balloon Rise

思路:

1、通过预处理声明常量

首先读取第一个表示颜色的字符串保存为结构体数组的第一个元素,个数为
1,结构体元素数个为1

#include <stdio.h>#define PRICE 100int main() { printf("价格:%dn",PRICE); return 0;}

然后每读取一个颜色字符串,就到结构体数组中寻找相同的字符串,如果找到,个数加1

2、通过 const 关键字声明常量

如果没找到,在结构体中添加一个元素,个数为1,结构体元素个数加1

#include <stdio.h>const int NUM=10;int main() { printf("数量:%dn",NUM); return 0;}

最后以结构体元素个数为标记,循环查找个数最大的一个元素,输出

区别:#define
在运行时会替换为指定的值,const可以看到数据类型,更推荐使用 const

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 20

struct color{
    short num;
    char str[LEN];
};

int main(void)
{
    int groups;
    char tmp[LEN];
    int i, j, flag;
    int count;
    int max;
    struct color * pst;
    char * most;

    while(scanf("%d", &groups) == 1 && groups > 0 && groups <= 1000)
    {
        getchar();

        pst = (struct color *)malloc(groups * sizeof(struct color));
        memset(pst, 0, groups * sizeof(struct color));
        gets(pst[0].str);
        pst[0].num = 1;
        count = 1;          /*不同颜色个数*/

        for(i = 1; i < groups; i++)
        {
            gets(tmp);
            flag = 0;
            for(j = 0; j <= i; j++)
                if(strcmp(pst[j].str, tmp) == 0)
                {
                    pst[j].num++;
                    flag = 1;
                }

            if(!flag)
            {
                strcpy(pst[i].str,tmp);
                pst[i].num++;
                count++;
            }
        }

        max = pst[0].num;
        most = pst[0].str;
        for(i = 0; i < count; i++)
            if(pst[i].num > max)
            {
                max = pst[i].num;
                most = pst[i].str;
            }

        puts(most);
        free(pst);
    }
    return 0;
}

在C语言中分为有符号和无符号整型,无符号是整数,有符号包含负数

类型 说明
short 2字节
int 4字节
long 32位系统4字节,64位系统8字节
long long 8字节
int main() { int a=10; int b=-10; long long c=20; int d=0b111;//二进制 int e=0xb;//十六进制 int f=010;//八进制 unsigned int g=12;//无符号正数 printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d); return 0;}
  • 0b 为二进制方式赋值
  • 0x 为十六进制数据
  • 0 为八进制数据

进制相关知识参考其他教程

c11 标准 stdint.h 对数据的长度进行了统一

类型 说明
int8_t 统一8位1字节
int16_t 2字节
int32_t 4字节
int64_t 8字节
uint8_t 无字符1字节
类型 说明
float 单精度,4字节,32位
double 双精度,8字节,64位
long double 长双精度,16字节,128位
typedef uint8_t mychar;int main() { mychar ch='a'; printf; return 0;}

自定义类型相当于对类型起了个别名

使用 goto 实现循环

int i=0;aa:printf;i=i+1;if{ goto aa;}

标签名: 标记一个位置,goto 标签名;
跳转到指定标签位置,标签名可以自己定义。

相关函数文档参考:C语言stdio.h文档

putchar:写字符到标准输出,相当于调用 putc遍历字符并打印

#include <stdio.h>int main() { char c; for (c='a';c<='z';c++) { putchar; putchar; } return 0;}

说明:char 类型占用1字节,每个字符都映射对应一个整数。

查看字符对应整数

#include <stdio.h>int main() { char c; printf("=====小写====n"); for (c='a';c<='z';c++) { printf; } printf("=====大写====n"); for (c='A';c<='Z';c++) { printf; } return 0;}

大写字符和小写字符刚好差距32, putchar; 可转为小写。

puts:写字符串到标准输出

输出字符串示例

#include <stdio.h>int main() { char string [] = "Hello world!"; puts; return 0;}

printf:打印格式化数据到标准输出,如果包含格式说明符将格式化,用附加参数替换说明符(说明符可以认为是占位符)。

格式化时用到的说明符

符号 解释 举例
d 或者 i 有符号十进制整数 392
u 无符号十进制整数 7235
o 无符号八进制 610
x 无符号十六进制整数 7fa
X 无符号十六进制整数 7FA
f 十进制浮点,小写 392.65
F 十进制浮点,大写 392.65
e 科学记数法,小写 3.9265e+2
c 字符 a
s 字符串 hello
p 指针地址 b8000000
% %%打印出一个% %

格式化输出示例

#include <stdio.h>int main() { printf("字符:%c %cn",'a',65); printf("整数:%d %ldn",600,6500000L);//%ld 长整 printf("浮点数:%fn",33.3); printf("十六进制:%xn",0xffa); printf("特殊打印:%%n"); return 0;}

结果

字符:a A整数:600 6500000浮点数:33.300000十六进制:ffa特殊打印:%

getchar:从标准输入中获取字符

获取字符示例

#include <stdio.h>int main() { uint8_t c; puts("输入文本,在一个句子中包含.以结束:"); do{ c=getchar(); putchar; }while ; return 0;}

uint8_t c; uint8_t 大小与char一样

gets:从标准输入中获取字符串

获取字符串示例

#include <stdio.h>int main() { char str[256]; puts("输入你的名字:"); gets; printf("你的名字:%sn",str); return 0;}

scanf:从标准输入中读取格式化数据,格式化说明符可参照 printf

格式化输入示例

#include <stdio.h>int main() { char ch; int num; char str[10]; puts("输入一个字符:"); scanf("%c",&ch); printf("用户的输入字符为:%cn",ch); puts("输入一个整数:"); scanf("%d",&num); printf("用户输入的整数为:%dn",num); puts; scanf; puts; return 0;}

int、char 等类型需要用&符号取得变量内存地址,变量 str
是一个数组,本身存储的就是内存地址,所以不用加上&符号。(可以理解为值与引用)

澳门新萄京官方网站,创建数组方式1:

const int NUMS_LEN=10;int nums[NUMS_LEN];

数组中元素的内存地址没有做过任何处理,有可能被之前其他程序使用过,所以数组中的默认的值是不可预期的。

演示数组中元素默认值:

#include <stdio.h>int main() { const int NUMS_LEN=10; int nums[NUMS_LEN]; for (int i = 0; i < NUMS_LEN; ++i) { printf("索引:%d,值:%dn",i,nums[i]); } return 0;}

创建数组方式2:

int ages[]={19,20,30};

创建方式1:

int nums[3][4];for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { printf("%d,%d,value=%dn",i,j,nums[i][j]); }}

创建方式2:

int nums[2][3]={ {1,2,3}, {4,5,6}};

二维数组直接初始化值需要指定长度!

如果想对数组中的元素清0,可以在遍历中为元素赋值为0.

声明字符串并检查长度:

char str[10];printf("长度:%ldn",strlen;
网站地图xml地图