25.static定义静态变量的用法 (观察即可)
本题以看和了解为主
在定义变量的时候,在数据类型名之前添加static关键字,定义的变量就是静态变量。那么,可以包括“静态局部变量”和“静态全局变量”。
#include <stdio.h>
void varfunc()
{
int var = 0;
static int static_var = 0;
printf("\40:var equal %d \n", var);
printf("\40:static var equal %d \n", static_var);
printf("\n");
var++;
static_var++;
}
void main()
{
int i;
for (i = 0; i < 3; i++)
varfunc();
return;
}
输出结果:
26.学习使用auto定义变量的用法(观察即可)
auto函数:
#include <stdio.h>
int main()
{
int i, num;
num = 2;
for (i = 0; i < 3; i++)
{
printf("\40: The num equal %d \n", num);
num++;
{
auto num = 1;
printf("\40: The internal block num equal %d \n", num);
num++;
}
}
return 0;
}
运行结果
27.小球下落问题
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#include <stdio.h>
#include<math.h>
int main()
{
float high = 100; //总高度
float s, h; //h代表当前高度,s代表总长度
h = high * pow(0.5, 10); //0.5是这个里面的规律,一半,10代表十次
s = 2 * (50 - h * 0.5 * 2) / (1 - 0.5) + 100;
printf("第十次的高度为%f;总路程为%f", h, s);
return 0;
}
28.找出1000以内所有完数
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
#include<stdio.h>//头文件
int main()//主函数
{
int number,s,i;//定义变量
for(number=2;number<1000;number++)//for循环
{
//直接从2开始
s=0;
for(i=1;i<number;i++)
{
//检查i是否是m的因子
if((number%i)==0)
{
//如果是的话
s=s+i;
}
}
if(s==number)
{
printf("%d的因子为:",number);
for(i=1;i<number;i++)
{
if(number%i==0)
{
//判断是否是因子,是的话就输出
printf("%d ",i);
}
}
printf("\n");//换行
}
}
return 0;//主函数返回值为0
}
29.猜数字
#include "time.h"
#include "stdlib.h"
#include "stdio.h"
main()
{
char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{
if(guess>i)
{
printf("please input a little smaller.\n");
scanf("%d",&guess);}
else
{
printf("please input a little bigger.\n");
scanf("%d",&guess);}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congradulations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}
30.(第一个项目)通讯录设计
``坦白的说自己做的不太好(因为对于指针一类熟悉度不高),这里从网上引用了一个别人的,自己修改了一下。里面设计很多指针的应用,谢谢这位作者的代码。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student //定义结构体
{
char name[20]; //姓名
char num[15]; //学号
char sex[10]; //性别
char from[20]; //籍贯
char political[10]; //政治面貌
char phone[15]; //手机号
char QQ[15]; //QQ号
char dorm[10]; //宿舍
struct student* next; //结构体指针
}stu;
stu* head;
void print() //主菜单
{
system("cls");
printf("\n\n\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ***********************************************************\n");
printf(" \t\t\t班级通讯录管理系统\n");
printf("\n");
printf(" \t\t1. 输入数据");
printf("\t\t2. 显示数据\n");
printf(" \t\t3. 插入数据");
printf("\t\t4. 删除数据\n");
printf(" \t\t5. 查看数据");
printf("\t\t6. 修改数据\n");
printf(" \t\t7. 保存数据");
printf("\t\t8. 返回主菜单\n");
printf(" ***********************************************************\n");
printf(" ~~~~~退~~~~~~~~~~出~~~~~~~~~~请~~~~~~~~~~按~~~~~~~~~~9~~~~~\n");
printf(" -----------------------------------------------------------\n\n");
}
void input(stu* p1) //输入相关数据
{
printf("姓名:");
scanf("%s", &p1->name);
printf("学号:");
scanf("%s", &p1->num);
printf("性别:");
scanf("%s", &p1->sex);
printf("籍贯:");
scanf("%s", &p1->from);
printf("政治面貌:");
scanf("%s", &p1->political);
printf("手机号:");
scanf("%s", &p1->phone);
printf("QQ号:");
scanf("%s", &p1->QQ);
printf("宿舍:");
scanf("%s", &p1->dorm);
}
stu* inputdata() //数据输入的函数
{
stu* p1, * p2;
int i = 1;
p1 = (stu*)malloc(sizeof(stu));
if (p1 != NULL)
{
head = p1;
printf("\n\t\t\t☆☆☆输入数据☆☆☆\n");
printf("------------------------------------------------------------------\n");
printf("在姓名处输入“ok”代表输入数据结束\n");
while (i)
{
printf("姓名:");
scanf("%s", &p1->name);
if (strcmp(p1->name, "ok") == 0)
{
printf("\n输入完毕!\n");
printf("========================================================================\n");
i = 0;
p2->next = NULL;
free(p1);
p1 = p2;
}
else
{
printf("学号:");
scanf("%s", &p1->num);
printf("性别:");
scanf("%s", &p1->sex);
printf("籍贯:");
scanf("%s", &p1->from);
printf("政治面貌:");
scanf("%s", &p1->political);
printf("手机号:");
scanf("%s", &p1->phone);
printf("QQ号:");
scanf("%s", &p1->QQ);
printf("宿舍:");
scanf("%s", &p1->dorm);
printf("=====================================\n");
p2 = p1;
p1 = (stu*)malloc(sizeof(stu));
if (p1 != NULL)
{
p2->next = p1;
}
}
}
return(p1->next);
}
}
stu* lookdata(stu* p1) //查看数据的函数
{
printf("\n\t\t\t☆☆☆显示数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
while (p1 != NULL)
{
printf("姓名:%s\n", p1->name);
printf("学号:%s\t", p1->num);
printf("性别:%s\t", p1->sex);
printf("籍贯:%s\t", p1->from);
printf("政治面貌:%s\t", p1->political);
printf("手机号:%s\t", p1->phone);
printf("QQ号:%s\t", p1->QQ);
printf("宿舍:%s\n", p1->dorm);
printf("======================================================================\n");
p1 = p1->next;
}
return p1;
}
void insert() //插入数据
{
int i;
char named[20];
stu* p1, * p2, * p3;
p1 = head;
p3 = (stu*)malloc(sizeof(stu));
p3->next = NULL;
printf("\n\t\t\t☆☆☆插入数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("请输入插入者的资料:\n");
input(p3);
printf("\n插入选项\n");
printf("1.首位置插入\t2.尾位置插入\t3.前插\n");
printf("请输入你的选择:");
scanf("%d", &i);
switch (i)
{
case 1:p3->next = p1;
head = p3;
break;
case 2:while (p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
p1->next = p3;
break;
case 3:printf("请输入姓名(前插):");
scanf("%s", named);
while (strcmp(named, p1->name) != 0)
{
p2 = p1;
p1 = p1->next;
}
p2->next = p3;
p3->next = p1;
break;
}
printf("插入成功!\n");
printf("======================================================================\n");
return;
}
void deleted() //删除数据
{
stu* p1, * p2;
char Name[20]; //想要删除的人的姓名
printf("\n\t\t\t☆☆☆删除数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("请输入要删除的姓名:");
scanf("%s", Name);
p1 = head;
if (head == NULL)
{
printf("内存空空神马都没有!\n");
printf("======================================================================\n");
return;
}
if (strcmp(Name, p1->name) == 0)
{
head = p1->next;
printf("删除成功!\n");
printf("======================================================================\n");
return;
}
while (p1 != NULL && (strcmp(Name, p1->name) != 0))
{
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
printf("此人不存在!\n");
printf("======================================================================\n");
return;
}
if (p1->next != NULL)
{
p1 = p1->next;
p2->next = p1;
printf("删除成功!\n");
printf("======================================================================\n");
return;
}
else
{
p2->next = NULL;
printf("删除成功!\n");
printf("======================================================================\n");
return;
}
}
void find(stu* p2) //通过姓名查找查看数据的函数
{
char name[20];
int b = 0;
printf("\n\t\t\t☆☆☆查看数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("请输入您想查找人的姓名:");
scanf("%s", name);
while (p2 != NULL)
{
if (strcmp(name, p2->name) == 0)
{
printf("你要找到的数据\n");
printf("姓名:%s\n", p2->name);
printf("学号:%s\t", p2->num);
printf("性别:%s\t", p2->sex);
printf("籍贯:%s\t", p2->from);
printf("政治面貌:%s\t", p2->political);
printf("手机号:%s\t", p2->phone);
printf("QQ号:%s\t", p2->QQ);
printf("宿舍:%s\n", p2->dorm);
printf("======================================================================\n");
b = 1;
}
p2 = p2->next;
}
if (b == 0)
{
printf("\n您要查找的人不存在!\n");
}
}
void update(stu* p2) //通过姓名查找修改数据
{
char name[20];
int b = 0, i;
printf("\n\t\t\t☆☆☆修改数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("请输入将要修改人的姓名:");
scanf("%s", name);
while (p2 != NULL)
{
if (strcmp(name, p2->name) == 0)
{
printf("该同学的基本信息\n");
printf("姓名:%s\n", p2->name);
printf("学号:%s\t", p2->num);
printf("性别:%s\t", p2->sex);
printf("籍贯:%s\t", p2->from);
printf("政治面貌:%s\t", p2->political);
printf("手机号:%s\t", p2->phone);
printf("QQ号:%s\t", p2->QQ);
printf("宿舍:%s\n", p2->dorm);
printf("\n请选择要修改的信息\n");
printf("\t1.姓名\t2.学号\t3.性别\t4.籍贯\n\t5.政治面貌\t6.手机号\t7.QQ\t8.宿舍\n");
printf("\n您的选择是(1~8):");
scanf("%d", &i);
printf("请输入修改之后的内容\n");
switch (i)
{
case 1:printf("姓名:");
scanf("%s", &p2->name);
break;
case 2:printf("学号:");
scanf("%s", &p2->num);
break;
case 3:printf("性别:");
scanf("%s", &p2->sex);
break;
case 4:printf("籍贯:");
scanf("%s", &p2->from);
break;
case 5:printf("政治面貌:");
scanf("%s", &p2->political);
break;
case 6:printf("手机号:");
scanf("%s", &p2->phone);
break;
case 7:printf("QQ:");
scanf("%s", &p2->QQ);
break;
case 8:printf("宿舍:");
scanf("%d", &p2->dorm);
break;
}
printf("\n修改成功!\n");
printf("=========================================================================\n");
b = 1;
}
p2 = p2->next;
}
if (b == 0)
{
printf("没有找到该人的资料!\n");
}
}
void save(stu* p2) //保存数据
{
FILE* fp;
char file[15];
printf("\n\t\t\t☆☆☆保存数据☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("输入文件名:");
scanf("%s", file);
if ((fp = fopen(file, "w")) == NULL)
{
printf("cannot open this file\n");
exit(0);
}
fprintf(fp, "姓名\t学号\t性别\t籍贯\t政治面貌\t手机号\tQQ号\t宿舍\n");
while (p2 != NULL)
{
fprintf(fp, "%s\t", p2->name);
fprintf(fp, "%s\t", p2->num);
fprintf(fp, "%s\t", p2->sex);
fprintf(fp, "%s\t", p2->from);
fprintf(fp, "%s\t", p2->political);
fprintf(fp, "%s\t", p2->phone);
fprintf(fp, "%s\t", p2->QQ);
fprintf(fp, "%s\n", p2->dorm);
p2 = p2->next;
}
printf("\n保存成功!\n");
printf("======================================================================\n");
fclose(fp);
}
void screen()
{
int i;
char s[251] = {
"欢迎使用由ZM制作班级通讯录管理系统,\n\n\t\t\t本系统用于通讯录管理----排序,打印\n\n\n\t\tWelcome to use produced by ZM class address book\n\n\t\t management system,sorting,printing" };
printf("\n================================================================================\n");
printf("\n\n\n\t\t\t");
for (i = 0; s[i] != NULL; i++)
{
Sleep(30);
printf("%c", s[i]);
}
printf("\n\n\n\n\n\n\n\n\t\t ~ Hi~ o(* ̄▽ ̄*)ブ~ ~ ~祝您旅途愉快~ ~\n");
printf("================================================================================\n");
}
void main()
{
int i;
system("color 4e");
screen();
Sleep(3000);
print();
while (1)
{
printf("请输入你的选择(1~9):");
loop:scanf("%d", &i);
if (i < 1 || i>9)
{
printf("输入有误,请在1~9中进行选择:");
goto loop;
}
switch (i)
{
case 1:
inputdata();
break;
case 2:
lookdata(head);
break;
case 3:
insert();
break;
case 4:
deleted();
break;
case 5:
find(head);
break;
case 6:
update(head);
break;
case 7:
save(head);
break;
case 8:
print();
break;
case 9:
exit(1);
break;
}
}
}
31.求两个数组的和
已知一个数组a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}数组c[5]等于数组a、b对应元素之和。输出数组c中个元素的值。
#include<stdio.h>
`
int main()`
{
int a[5] = {
1,2,3,4,5 };
int b[5] = {
11,4,2,7,9 };
int c[5];
int i;
for (i = 0; i < 5; i++)
{
c[i] = a[i] + b[i];
printf("%d\n", c[i]);
}
return 0;
}
32.自定义函数逆序数组
写一个函数void change(int array[],int n),可以将数组array中的n个元素逆序存放。即array[0]与a[n-1]互换,array[1]与array[n-2]互换……
void change(int array[], int n)
{
int i, temp; //i在数组内,temp负责交换
for (i = 0; i < n / 2; i++)
{
temp = array[i];
array[i] = array[n - i - 1];
array[n - i - 1] = temp;
}
for (i = 0; i < n; i++)
printf("%4d", array[i]);
}
33.求两个矩阵的乘积c。已知矩阵a、b的值
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cout<<"请输入两矩阵的行列:"<<endl;
cin>>a>>b>>c; //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
int X[a][b],Y[b][c],Z[a][c]; //开辟三个二维数组存储矩阵,注意相乘结果的行列值
cout<<"请输入第一个矩阵:"<<endl;
for(int i=0;i<a;i++){
//矩阵的行
for(int j=0;j<b;j++){
//矩阵的列
cin>>X[i][j];
}
}
cout<<"请输入第二个矩阵:"<<endl;
for(int i=0;i<b;i++){
//矩阵的行
for(int j=0;j<c;j++){
//矩阵的列
cin>>Y[i][j];
}
}
memset(Z,0,sizeof(Z)); //将二维数组Z初始化为0
//int temp=0;
cout<<"矩阵相乘的结果为:"<<endl;
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
for(int k=0;k<b;k++){
Z[i][j]=Z[i][j]+X[i][k]*Y[k][j]; //行与列的乘积和为相应结果值
//temp=temp+X[i][k]*Y[k][j];
}
cout<<Z[i][j]<<" "; //计算完一个后输出
//cout<<temp<<" ";
//temp=0;
}
cout<<endl; //计算完一列后输出换行
}
return 0;
}
34.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。
要求:定义二维数组求总天数
#include<stdio.h>
int day_of_year(int year, int month, int day); //自定义函数
int main()
{
int year, month, day;
scanf(“%d %d %d”, &year, &month, &day);
printf(“%d”, (day_of_year(year, month, day)));
return 0;
}
int day_of_year(int year, int month, int day)
int i, leap; //i指输入月份-1,其他月的天数遍历,leap根据闰年平年切换一维二维
int tab[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},//非
{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
};
leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);//1为闰年 0为非
for (i = 1; i < month; i++) {
day += tab[leap][i];
}
return day;
}
35.按照平均成绩从高到低的顺序输出学号和平均分。
提示:对平均分排序,当元素互换时,学号元素对应互换。
思路:冒泡排序,冒泡排序算法样例如下:
#include <stdio.h>
int main()
{
int i,j,t,a[11]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]); //从键盘中输入10个数
for(i=1;i<10;i++) //变量i代表比较的趟数
for(j=1;j<11-i;j++) //变最j代表每趟两两比较的次数
if(a[j]>a[j+1])
{
t=a[j]; //产利用中间变童实现两值互换
a[j]=a[j+1];
a[j+1]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //将胃泡排序后的顺序输出
printf("\n");
return 0;
}
因此
本题代码为:
#include<stdio.h>
struct student
{
int num; //学号
char name[20]; //姓名
float score; //分数
}; //先构造结构体,把需要的东西放一起,方便同时排序调换
int main()
{
struct student stu[5] = {
{
17,"keen",97.5 }, {
18,"tom",59 }, {
19,"wangli",31 }, {
20,"lihua",54 }, {
21,"yuzhou",98 }
};
struct student t;
int i, j, k;
printf("成绩由大到小的顺序:\n");
for (i = 0; i < 4; i++) //代表的比较趟数
{
k = i;
for (j = i + 1; j < 5; j++)
{
if (stu[j].score > stu[k].score)
{
k = j;
}
t = stu[k];
stu[k] = stu[i];
stu[i] = t;
}
for (i = 0; i < 5; i++)//循环输出5个人的成绩
{
printf("%d,%10s,%6.2f分\n", stu[i].num, stu[i].name, stu[i].score);//输出结果
}
return 0;//主函数返回值为0
}
}
36.编写一个函数,实现str中的字符的互换。如”abcde”换成”edcba”。
关于数组逆序的几种做法
1.非递归做法
已有字符串逆序
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]); //求的是数组包含的元素个数,'\0'也包括在内
int left = 0;
int right = sz - 2; //减2是因为求得的sz包含了'\0'这个元素。
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
自己输入逆序
#include <stdio.h>
#include <string.h>
int main()
{
char arr[101] = {
0 }; //要给字符数组一定的内存大小,如果写成char arr[] = { 0 };,当在给数组输入的时候就会造成越界访问。
scanf("%s", arr);
int sz = strlen(arr); //在给定字符数组的大小为101的情况下,只能用strlen求输入字符串长度。
//用sizeof(arr)/sizeof(arr[0])求出来的是数组大小,为101。
int left = 0;
int right = sz - 1;
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
封装成函数
#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
if (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
reverse(str, left + 1, right - 1);
}
}
int main()
{
char arr[101] = {
0 };
scanf("%s", arr);
int left = 0;
int right = strlen(arr) - 1;
reverse(arr, left, right);
printf("%s\n", arr);
return 0;
}
2.递归做法
#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
if (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
reverse(str, left + 1, right - 1);
}
}
int main()
{
char arr[101] = {
0 };
scanf("%s", arr);
int left = 0;
int right = strlen(arr) - 1;
reverse(arr, left, right);
printf("%s\n", arr);
return 0;
}