不知道其他人的编程题是什么样的,我的6道编程题中有4道都是与字符串相关的。那么让我们回忆下C语言字符串中的相关知识点把。
一、字符串的定义
- C语言中没有String类型
- 用char类型的数组定义字符串
- 用char类型的指针定义字符串
如下代码所示:
// String str = "dlsjfdlk"; 是错得
char name [] = {'i', 'l', 'o', 'v', 'e', 'y', 'o', 'u', '\0'};
char *name1 = "jack";
问题来了,用char类型的数组和char类型的指针定义字符串有什么区别呢。说到这里,我们不得不提一下我们的内存。我们的内存其实可以分为5大块:
1、常量区
存放一些字符串常量
2、堆
存放一些对象
3、栈
存放一些局部变量
4、全局区(静态区)
存放全局变量和静态变量
5、程序代码区
存放函数体的二进制代码
用char类型的指针定义的字符串是放在常量区里的,所以它和char类型的数组定义的字符串的最大的不同就是它的值是不能修改的。
二、字符串的使用
1、字符串的遍历
字符串遍历在字符串中用得非常的多
如下所示:
// 用for循环实现
char msStr1 [] = "itcast";
for (int i = 0; i<strlen(msStr1); i++)
{
printf("%c\n", msStr1[i]);
}
// 用while循环实现
int j = 0;
while(msStr1[j])
{
printf("%c\n", msStr1[j]);
<span style="white-space:pre"> </span>j++
}
2、字符串的输入
输入一个字符串,那么这个字符串肯定是一个变量,所以得用char类型的数组存储字符串
如下所示
:
char msStr2 [100];
scanf("%s", msStr2);
三、排序算法
在这次的编程题中,有2题考到了排序的问题,在C语言中用得比较多的排序方法就是冒泡排序了。什么是冒泡排序呢?
冒泡排序法的原理其实很简单,就是对一堆数据进行两两比较,把较大的数放到后面,较小的数放到前面,最后形成从小到大排列的一组数据,由于类似气泡,所以被称作为冒泡排序法。
编程示例:
// 整型数组num[] 中存放了一堆整型数据,先需要将他们排序并按从小到大输出
int num [] = {1, 23, 5, 4, 11, 55, 18};
int temp = 0;
// 冒泡排序
// 趟数,明显数组中有7个数组,那么需要进行(7-1)趟比较
for(int i = 0; i<sizeof(num)/sizeof(int) -1; i++)
{
// 两两比较
for(int j = 0; j<sizeof(num)/sizeof(int) - i; j++)
{
if(num[j] >num[j+1])
{
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
四、编程最后一题
/*
10、 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
主要考点:
1.算法,间隔天数是3的倍数遇美女,2的倍数遇帅哥,6的倍数帅哥美女一起遇
2.计算天数,闰年问题
*/
#include <stdio.h>
int isLeapYear (int _year);
int main(int argc, const char * argv[])
{
// 定义年月日
int year, month, day;
// 定义整型数组存储每月天数(非闰年)
int monthDays [] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 定义整型数组存储每月天数(闰年)
int monthDays1 [] ={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 定义总天数
int sum = 0;
//
// 提示用户输入年月日
printf("请输入时间格式(2014-12-12):\n");
// scanf 函数
scanf("%d-%d-%d", &year, &month, &day);
// 年月日 分开算
// 第一步算间隔多少年换算为天数
for (int i = 2006; i < year; i++)
{
sum = sum + isLeapYear (i) ;
}
printf("%d---year\n", sum);
// 第二步算间隔多少月换算为天数
if (isLeapYear(year) == 365 )
{
for (int j = 0; j < month -1; j++)
{
sum = sum + monthDays [j];
}
}
else
{
for (int j = 0; j < month -1; j++)
{
sum = sum + monthDays1 [j];
}
}
printf("%d---month\n", sum);
// 第三步计算间隔多少天
sum = sum + day - 1 ;
printf("%d---day\n", sum);
// 计算是遇美女还是帅哥了
if (sum % 2 == 0 && sum % 3 != 0)
{
printf("小明遇帅哥!\n");
}
else if (sum % 3 ==0 && sum % 2 != 0)
{
printf("小明遇美女!\n");
}
else if (sum % 2 == 0 && sum % 3 == 0)
{
printf("小明美女帅哥一起遇!!!\n");
}
else
{
printf("小明谁都没遇上。。。。\n");
}
return 0;
}
int isLeapYear (int _year)
{
if (_year % 100 ==0)
{
if(_year % 4 ==0)
{
return 366;
}
else
{
return 365;
}
}
else if (_year % 4 == 0)
{
return 366;
}
else
{
return 365;
}
}
这道题其实主要的难点就是计算天数的问题,计算天数,我这边是拆开了算得,我感觉这样算十分的清晰,当然大家如果有其他的方法,欢迎交流。