一.visual studio的使用
1.下载好vs后,因为不太清楚怎么操作,一个项目只能写一个文件
忽视了一个代码文件中只能有一个main函数。
2.vs中不可以用scanf,会出现错误,因为vs认为scanf不安全,应用scanf_s来输入。
二.指针
学习了数组中指针的移动和指针的减法
#include<stdio.h>
int main()
{
int i1=777;
int i2=888;
int *p1=&i1;
p1--;
printf("%d\n",p1);
printf("%d\n",&i1);
printf("%d\n",&i2);
return 0;
}
根据指针移动查看数字的地址或数字的值。
三.练习题
1.完数(也称完全数)
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。
例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
#include<stdio.h>
int wanshu(int n)
{
int sum=0;
int i;
for (i = 1; i < n; i++) {
if (n % i == 0)
{
sum += i;
}
}
if(sum==n){
return 1;
printf("%d",n);
}else{
return 0;
}
}
int main()
{
int a, b;
int c,i=0;
int n;
scanf_s("%d %d", &a, &b);
for (n = a; n < b; n++)
{
c = wanshu(n);
// printf("%d",wanshu(n));
if (c == 1) {
// printf(" ");
printf("%d\n",n);
i++;
}
}
if(i==0){
printf("NLF");
}
return 0;
}
调用自己写的一个函数判断完数,当数字除以i余数为0时则证明i是数字的因子,然后加和,循环结束后加和的数字等于原数字则该数字为完数。
2.复习回文数
正反读都是相同的数字(10到1000)
#include<stdio.h>
int main()
{
int ge,shi,bai;
int j,i,a=0;
int cnt=0;
for(i=0;i<1000;i++)
{
if(i>0&&i<100)
{
ge=i%10;
shi=i/10;
j=(ge*10)+shi;
if(i==j)
{
printf(" %d\t",i );
cnt++;
}
}
if(i>100&&i<1000)
{
ge=i%10;
bai=i/100;
shi=(i-ge-(bai*100))/10;
j=(ge*100)+(shi*10)+bai;
if(i==j)
{
printf(" %d\t",i );
cnt++;
}
j=0;
}
if(cnt==a)
{
continue;
}
if(cnt%5==0)
{
printf("\n");
}
a=cnt;
}
return 0;
}
判断10到1000的回文数,则将其分为10到100和100到1000俩部分,计算出每个数字个十百位或个十位,将其倒序计算即可判断。最后加一个cnt的计数器让其观看美观,每5个换行即可。
3.日历
#include <stdio.h> /*文件包含*/
#include <stdlib.h> /*文件包含*/
int main(void)
{
int y,m,d,w,t=0,i;
printf("请输入四位数年份:");
scanf("%d",&y);
printf("请输入月份:");
scanf("%d",&m);
printf("=====================%d年%d月======================",y,m);
printf("\n\n星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n\n");
if(y%4==0 && y%100!=0 || y%400==0)
t=1;
if(m>=1 && m<=12)
{
switch(m)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:d=31;break;
case 2:switch(t)
{
case 0:d=28;break;
case 1:d=29;break;
} break;
case 4:case 6:case 9:case 11: d=30;break;
}/*根据月份计算本月天数*/
if(m==1)
m=13,y--;
else
if(m==2)
m=14,y--; /*若为1月和2月在蔡勒公式中为上一年的13月和14月*/
/*蔡勒公式:w=y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1*/
w=(y%100)+((y%100)/4)+((y/100)/4)-2*(y/100)+(26*(m+1)/10)+1-1;
w=(w%7+7)%7; /*w可能为负则进行处理*/
if(w==0)
w=7;/*默认w范围0-6,转为1-7*/
for(i=1;i<w;i++) /*输出\t将后续日期数字与列标题对齐*/
printf("\t");
for(i=1;i<=d;i++)
{
printf("%4d\t",i);
if(w%7==0)
printf("\n\n");
w++; /*逢7换行*/
}
printf("\n\n=====================================================\n\n");
}
else
printf("数据输入有误!");
system("pause");
}
(1)运用了switch-case将月份分类
(2)蔡勒公式的使用
(3)w也为计数器,换行日期
4.单词长度
输入一串单词,遇到空格输出有几个字母,遇到“.”截止
#include<stdio.h>
int main()
{
char a;
int i=0;
// gets(a);
while(1)
{
scanf("%c",&a);
if(a=='.')
{
if(i!=0){
printf("%d",i);
break;
}
}
if(a==' ')
{
if(i!=0){
printf("%d",i);
printf(" ");
i=0;
continue;
}
}else{
i+=1;
}
}
return 0;
}
简单的循环循环中判断字符是什么,运用了break和continue来控制循环的执行。
5.金字塔输出
输入多少行就会运行出多少行的金字塔星星。
#include<stdio.h>
int main()
{
int a,b,n;
scanf("%d",&n);
b=n-1;
int i,j;
for(i=0;i<n;i++)
{
for(a=b;a>0;a--){
printf(" ");
}
for(j=1;j<=(i+i+1);j++)
{
printf("*");
}
printf("\n");
b-=1;
}
return 0;
}
主要应该想明白如何控制每一行的空格数量,利用行数减一为空格数的特性,用for循环可以解决。
6.复习判断素数
很早学习的东西还是得想一想才能写出来,复习我觉得也很重要!
#include<stdio.h>
int sushu(int a) {
int b = 1;
int i;
for (i = 2; i < a; i++) {
if (a % i == 0) {
b = 0;
break;
}
//else {
//b = 1;
//continue;
//}
}
return b;
}
int main()
{
int a , b;
scanf_s("%d", &a);
b = 1;
b = sushu(a);
if (b == 0) {
printf("no");
}
else {
printf("yes");
}
return 0;
}
7.同构数
同构数就是指该数出现在它的平方数的右侧
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<100;i++)
{
if(i*i%10==i||i*i%100==i)
{
printf("%d\t",i);
}
}
return 0;
}
8.复习水仙花
#include<stdio.h>
int main()
{
int i;
int a,b,c;
for(i=100;i<1000;i++)
{
a=i/100;
c=i%10;
b=i/10-a*10;
if((a*a*a+b*b*b+c*c*c)==i)
{
printf("%d是水仙花",i);
}
}
return 0;
}
也是计算个十百位然后计算判断,立方和相加进行判断。
四.问题
1.ASCII码值排序
输入一串字符,用ASCII码值将其排序,并删掉重复部分。
#include<stdio.h>
int main()
{
char s[20];
int i,j,k;
char t;
gets(s);
int l=sizeof(s)/sizeof(int);
//printf("%d\n",l);
l+=1;
char b[l];
for(i=0;i<20;i++){
printf("%c",s[i]);
}
printf("\n");
for(j=0;j<20;j++)
{
for(i=j+1;i<20;i++)
{
if(s[j]>s[i]){
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
for(i=0;i<20;i++)
{
printf("%c",s[i]);
}
printf("\n");
for(j=0;j<20;j++)
{
for(i=j;i<l;i++)
{
if(s[j+1]==s[j])
{
for(k=j;k<l;k++)
{
s[k]=s[k+1];
}
l--;
}
}
}
int c=0;
for(i=0;i<20;i++)
{
if(s[i]!=s[i+1])
{
b[c]=s[i];
c++;
}
}
for(i=0;i<20;i++){
printf("%c",s[i]);
}
return 0;
}
排序会出现乱码,删除重复并没有删除,还在苦想中。
2.大小写转化
#include<stdio.h>
int main()
{
char a[100];
int i;
gets(a);
// scanf("%s",&a);
//printf("%s\n",a);
// puts(a);
for(i=0;a[i]!='#';i++){
if(a[i]>='a'&&a[i]<='z')
{
a[i]-=32;
}
else if(a[i]>='A'&&a[i]<='Z')
{
a[i]+=32;
}
//printf("%s\n",a);
}
for(i=0;a[i]!='#';i++){
printf("%c",a[i]);
}
// printf("%s\n",a);
return 0;
}
for循环中的第二个if前不太明白为什么必须要有else,如果去掉则代码运行不能小写转大写。
(第一次写写的不好请多包涵)