项目:测试冒泡排序的优化是否有效,周三前交
rand():产生一个随机数字
共用体:也称为联合体,union.所有的成员共用同一段内存,共用低地址
大小端:考试的重点,你的笔试一定会出现
大端:低地址放大数据
小端:低地址放小数据
内存重叠
1.判断是不是闰年的标准方式:
year % 4 == 0 && year % 100 != 0 || year % 400 == 0
二、代码:
1.从主函数输入一个年月日,判断这天是当前这年的第多少天
typedef struct Date
{
int year;
int month;
int day;
} Date;
int GetDays ( const Date * pd)
{
int days = 0 ;
int arr[ ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
if ( pd-> year% 4 == 0 && pd-> year% 100 != 0 || pd-> year% 400 == 0 )
arr[ 1 ] = 29 ;
for ( int i= 0 ; i< pd-> month- 1 ; i++ )
{
days += arr[ i] ;
}
days += pd-> day;
return days;
}
int main ( )
{
Date first = { 2021 , 1 , 1 } ;
Date today = { 2021 , 5 , 16 } ;
printf ( "%d\n" , GetDays ( & first) ) ;
printf ( "%d\n" , GetDays ( & today) ) ;
return 0 ;
}
2.简单结构体操作
typedef struct Student
{
int num;
char name[ 20 ] ;
int score[ 3 ] ;
} Student;
void Input ( Student * arr, int len)
{
for ( int i= 0 ; i< len; i++ )
{
scanf ( "%d%s%d%d%d" ,
& arr[ i] . num, arr[ i] . name, & arr[ i] . score[ 0 ] , & arr[ i] . score[ 1 ] , & arr[ i] . score[ 2 ] ) ;
}
}
void Show ( const Student * arr, int len)
{
printf ( "学生的信息如下:\n" ) ;
for ( int i= 0 ; i< len; i++ )
{
printf ( "%d,%s,%d,%d,%d\n" , arr[ i] . num, arr[ i] . name, arr[ i] . score[ 0 ] , arr[ i] . score[ 1 ] , arr[ i] . score[ 2 ] ) ;
}
}
void Score ( const Student * arr, int len)
{
int sum1 = 0 ;
int sum2 = 0 ;
int sum3 = 0 ;
int tmp = 0 ;
int max = 0 ;
int index = 0 ;
for ( int i= 0 ; i< len; i++ )
{
sum1 += arr[ i] . score[ 0 ] ;
sum2 += arr[ i] . score[ 1 ] ;
sum3 += arr[ i] . score[ 2 ] ;
tmp = arr[ i] . score[ 0 ] + arr[ i] . score[ 1 ] + arr[ i] . score[ 2 ] ;
if ( tmp > max)
{
max = tmp;
index = i;
}
}
printf ( "三门课的平均成绩分别为:%d,%d,%d\n" , sum1/ len, sum2/ len, sum3/ len) ;
printf ( "最高分的信息:%d,%s,%d,%d,%d,平均成绩%d\n" ,
arr[ index] . num, arr[ index] . name, arr[ index] . score[ 0 ] , arr[ index] . score[ 1 ] , arr[ index] . score[ 2 ] ,
max/ 3 ) ;
}
int majorityElement ( int * nums, int numsSize) {
int cur = nums[ 0 ] ;
int count = 1 ;
for ( int i= 1 ; i< numsSize; i++ ) {
if ( count == 0 ) {
cur = nums[ i] ;
count = 1 ;
}
else if ( cur == nums[ i] )
count++ ;
else
count-- ;
}
return cur;
}
int main ( )
{
Student arr[ 3 ] ;
Input ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
Show ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
Score ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
return 0 ;
}
3.数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
算法:两个两个数相抵消,如果当前这个数和已保存的数相等,则count++,否则–,如果count为0,则直接把当前这个数拷贝到cur中,最后剩下的那个数就是出现次数最多的这个数
int majorityElement ( int * nums, int numsSize)
{
int cur = nums[ 0 ] ;
int count = 1 ;
for ( int i= 1 ; i< numsSize; i++ ) {
if ( count == 0 ) {
cur = nums[ i] ;
count = 1 ;
}
else if ( cur == nums[ i] )
count++ ;
else
count-- ;
}
return cur;
}
int main ( )
{
int arr[ ] = { 1 , 2 , 3 , 2 , 2 , 2 , 5 , 4 , 2 } ;
int a = majorityElement ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
printf ( "%d\n" , a) ;
return 0 ;
}
4.数组移动
void Move ( int * arr, int n, int m)
{
assert ( arr != NULL ) ;
if ( arr== NULL || n<= 0 || m<= 0 || m>= n)
return ;
int * brr = ( int * ) malloc ( m* sizeof ( int ) ) ;
assert ( brr != NULL ) ;
int i;
for ( i= 0 ; i< m; i++ )
{
brr[ i] = arr[ n- m+ i] ;
}
for ( i= n- m- 1 ; i>= 0 ; i-- )
{
arr[ i+ m] = arr[ i] ;
}
for ( i= 0 ; i< m; i++ )
{
arr[ i] = brr[ i] ;
}
free ( brr) ;
}
int main ( )
{
int arr[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
Move ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) , 3 ) ;
Show ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
return 0 ;
}
5.找最长单词
最后一个if的作用,比较最后一个单词是否为最长单词,如果是最长单词,则更新
har * MaxWord ( const char * str)
{
char * curstr = ( char * ) malloc ( ( strlen ( str) + 1 ) * sizeof ( char ) ) ;
char * maxstr = ( char * ) malloc ( ( strlen ( str) + 1 ) * sizeof ( char ) ) ;
assert ( curstr!= NULL && maxstr!= NULL ) ;
int cur = 0 ;
int max = 0 ;
while ( * str != '\0' )
{
if ( isalpha ( * str) )
{
curstr[ cur++ ] = * str;
}
else
{
if ( cur > max)
{
curstr[ cur] = '\0' ;
strcpy ( maxstr, curstr) ;
max = cur;
}
cur = 0 ;
}
str++ ;
}
if ( cur > max)
{
curstr[ cur] = '\0' ;
strcpy ( maxstr, curstr) ;
max = cur;
}
return maxstr;
}
int main ( )
{
char * p = MaxWord ( "adf urtiw" ) ;
printf ( "%s" , p) ;
free ( curstr) ;
free ( maxstr) ;
return 0 ;
}
6.利用冒泡对整数数组进行排列
优化排序算法:创建一个标记,如果当前一趟没有交换,此时,就可以提前结束
void BubbleSort1 ( int * arr, int len)
{
int tmp;
for ( int i= 0 ; i< len- 1 ; i++ )
{
for ( int j= 0 ; j+ 1 < len- i; j++ )
{
if ( arr[ j] > arr[ j+ 1 ] )
{
tmp = arr[ j] ;
arr[ j] = arr[ j+ 1 ] ;
arr[ j+ 1 ] = tmp;
}
}
}
}
void BubbleSort ( int * arr, int len)
{
int tmp;
bool flg;
for ( int i= 0 ; i< len- 1 ; i++ )
{
flg = false ;
for ( int j= 0 ; j+ 1 < len- i; j++ )
{
if ( arr[ j] > arr[ j+ 1 ] )
{
tmp = arr[ j] ;
arr[ j] = arr[ j+ 1 ] ;
arr[ j+ 1 ] = tmp;
flg = true ;
}
}
if ( ! flg)
{
return ;
}
}
}
int main ( )
{
int arr[ ] = { 34 , 2 , 6 , 8 , 9 , 12 , 56 , 78 , 91 , 32 , 66 , 8 , 99 , 17 , 69 } ;
BubbleSort ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
return 0 ;
}
7.将十六进制的字符串转为数字,遇到非十六进制字符,转换结束
int HexToi ( const char * str)
{
assert ( str != NULL ) ;
int tmp = 0 ;
if ( str[ 0 ] == '0' && str[ 1 ] == 'x' || str[ 1 ] == 'X' )
str += 2 ;
while ( isxdigit ( * str) )
{
if ( isdigit ( * str) )
tmp = tmp* 16 + ( * str- '0' ) ;
else if ( islower ( * str) )
tmp = tmp* 16 + ( * str- 'a' + 10 ) ;
else
tmp = tmp* 16 + ( * str- 'A' + 10 ) ;
str++ ;
}
return tmp;
}
int main ( )
{
int a = HexToi ( "0x12ab34x" ) ;
printf ( "%d,%x\n" , a, a) ;
return 0 ;
}